From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 3674 invoked by alias); 3 Jan 2013 16:25:34 -0000 Received: (qmail 3649 invoked by uid 22791); 3 Jan 2013 16:25:31 -0000 X-SWARE-Spam-Status: No, hits=-6.3 required=5.0 tests=AWL,BAYES_00,KHOP_RCVD_UNTRUST,KHOP_SPAMHAUS_DROP,RCVD_IN_DNSWL_HI,SPF_HELO_PASS,T_RP_MATCHES_RCVD X-Spam-Check-By: sourceware.org Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Thu, 03 Jan 2013 16:25:17 +0000 Received: from int-mx02.intmail.prod.int.phx2.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) by mx1.redhat.com (8.14.4/8.14.4) with ESMTP id r03GPEo7003022 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES256-SHA bits=256 verify=OK) for ; Thu, 3 Jan 2013 11:25:17 -0500 Received: from barimba (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by int-mx02.intmail.prod.int.phx2.redhat.com (8.13.8/8.13.8) with ESMTP id r03GPCVW028236 (version=TLSv1/SSLv3 cipher=DHE-RSA-AES128-SHA bits=128 verify=NO); Thu, 3 Jan 2013 11:25:13 -0500 From: Tom Tromey To: gdb-patches@sourceware.org Subject: RFC: add completion for "set gnutarget" Date: Thu, 03 Jan 2013 16:25:00 -0000 Message-ID: <87zk0q5j4n.fsf@fleche.redhat.com> User-Agent: Gnus/5.13 (Gnus v5.13) Emacs/24.2.91 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org X-SW-Source: 2013-01/txt/msg00046.txt.bz2 While working on another patch, I got annoyed that "set gnutarget" doesn't have completion. So, I wrote the appended. I think it is basically straightforward. I had to change one of the CLI constructors to return the new command... to me the proliferation of such constructors and their various oddities is evidence that this area is factored wrongly, but at the same time it has never risen near the top of my heap to try to clean up. Built and regtested on x86-64 Fedora 16. Tom 2013-01-02 Tom Tromey * cli/cli-decode.c (add_setshow_string_noescape_cmd): Return the set command. * command.h (add_setshow_string_noescape_cmd): Update. * corefile.c (set_gnutarget_command): Remove trailing whitespace. (complete_set_gnutarget): New function. (_initialize_core): Set the "set gnutarget" completer. 2013-01-02 Tom Tromey * gdb.base/completion.exp: Add "set gnutarget" test. diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index 758b0ff..27d94bb 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -597,7 +597,7 @@ add_setshow_string_cmd (char *name, enum command_class class, /* Add element named NAME to both the set and show command LISTs (the list for set/show or some sublist thereof). */ -void +struct cmd_list_element * add_setshow_string_noescape_cmd (char *name, enum command_class class, char **var, const char *set_doc, const char *show_doc, @@ -607,11 +607,14 @@ add_setshow_string_noescape_cmd (char *name, enum command_class class, struct cmd_list_element **set_list, struct cmd_list_element **show_list) { + struct cmd_list_element *set_cmd; + add_setshow_cmd_full (name, class, var_string_noescape, var, set_doc, show_doc, help_doc, set_func, show_func, set_list, show_list, - NULL, NULL); + &set_cmd, NULL); + return set_cmd; } /* Add element named NAME to both the set and show command LISTs (the diff --git a/gdb/command.h b/gdb/command.h index 6809a62..17662b4 100644 --- a/gdb/command.h +++ b/gdb/command.h @@ -291,16 +291,17 @@ extern void add_setshow_string_cmd (char *name, struct cmd_list_element **set_list, struct cmd_list_element **show_list); -extern void add_setshow_string_noescape_cmd (char *name, - enum command_class class, - char **var, - const char *set_doc, - const char *show_doc, - const char *help_doc, - cmd_sfunc_ftype *set_func, - show_value_ftype *show_func, - struct cmd_list_element **set_list, - struct cmd_list_element **show_list); +extern struct cmd_list_element *add_setshow_string_noescape_cmd + (char *name, + enum command_class class, + char **var, + const char *set_doc, + const char *show_doc, + const char *help_doc, + cmd_sfunc_ftype *set_func, + show_value_ftype *show_func, + struct cmd_list_element **set_list, + struct cmd_list_element **show_list); extern void add_setshow_optional_filename_cmd (char *name, enum command_class class, diff --git a/gdb/corefile.c b/gdb/corefile.c index e940e3c..87b29ee 100644 --- a/gdb/corefile.c +++ b/gdb/corefile.c @@ -34,6 +34,7 @@ #include "completer.h" #include "exceptions.h" #include "observer.h" +#include "cli/cli-utils.h" /* Local function declarations. */ @@ -419,12 +420,40 @@ static void set_gnutarget_command (char *ignore, int from_tty, struct cmd_list_element *c) { + char *gend = gnutarget_string + strlen (gnutarget_string); + + gend = remove_trailing_whitespace (gnutarget_string, gend); + *gend = '\0'; + if (strcmp (gnutarget_string, "auto") == 0) gnutarget = NULL; else gnutarget = gnutarget_string; } +/* A completion function for "set gnutarget". */ + +static VEC (char_ptr) * +complete_set_gnutarget (struct cmd_list_element *cmd, char *text, char *word) +{ + const char **bfd_targets = bfd_target_list (); + struct cleanup *cleanup = make_cleanup (free_current_contents, &bfd_targets); + int last; + VEC (char_ptr) *result; + + for (last = 0; bfd_targets[last] != NULL; ++last) + ; + + bfd_targets = xrealloc (bfd_targets, (last + 2) * sizeof (const char **)); + bfd_targets[last] = "auto"; + bfd_targets[last + 1] = NULL; + + result = complete_on_enum (bfd_targets, text, word); + do_cleanups (cleanup); + + return result; +} + /* Set the gnutarget. */ void set_gnutarget (char *newtarget) @@ -447,14 +476,16 @@ No arg means have no core file. This command has been superseded by the\n\ set_cmd_completer (c, filename_completer); - add_setshow_string_noescape_cmd ("gnutarget", class_files, - &gnutarget_string, _("\ + c = add_setshow_string_noescape_cmd ("gnutarget", class_files, + &gnutarget_string, _("\ Set the current BFD target."), _("\ Show the current BFD target."), _("\ Use `set gnutarget auto' to specify automatic detection."), - set_gnutarget_command, - show_gnutarget_string, - &setlist, &showlist); + set_gnutarget_command, + show_gnutarget_string, + &setlist, &showlist); + set_cmd_completer (c, complete_set_gnutarget); + add_alias_cmd ("g", "gnutarget", class_files, 1, &setlist); if (getenv ("GNUTARGET")) diff --git a/gdb/testsuite/gdb.base/completion.exp b/gdb/testsuite/gdb.base/completion.exp index 566f5e0..8163a86 100644 --- a/gdb/testsuite/gdb.base/completion.exp +++ b/gdb/testsuite/gdb.base/completion.exp @@ -707,6 +707,9 @@ gdb_test "complete ptype struct some_" "ptype struct some_struct" gdb_test "complete ptype enum some_" "ptype enum some_enum" gdb_test "complete ptype union some_" "ptype union some_union" + +gdb_test "complete set gnutarget aut" "set gnutarget auto" + # Restore globals modified in this test... set timeout $oldtimeout1