From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: (qmail 4220 invoked by alias); 7 Aug 2009 20:42:46 -0000 Received: (qmail 4209 invoked by uid 22791); 7 Aug 2009 20:42:44 -0000 X-SWARE-Spam-Status: No, hits=-2.3 required=5.0 tests=AWL,BAYES_00,SPF_HELO_PASS,SPF_PASS X-Spam-Check-By: sourceware.org Received: from mx2.redhat.com (HELO mx2.redhat.com) (66.187.237.31) by sourceware.org (qpsmtpd/0.43rc1) with ESMTP; Fri, 07 Aug 2009 20:42:36 +0000 Received: from int-mx2.corp.redhat.com (int-mx2.corp.redhat.com [172.16.27.26]) by mx2.redhat.com (8.13.8/8.13.8) with ESMTP id n77KgYfK002095 for ; Fri, 7 Aug 2009 16:42:34 -0400 Received: from ns3.rdu.redhat.com (ns3.rdu.redhat.com [10.11.255.199]) by int-mx2.corp.redhat.com (8.13.1/8.13.1) with ESMTP id n77KgXQ5027018; Fri, 7 Aug 2009 16:42:33 -0400 Received: from opsy.redhat.com (ovpn01.gateway.prod.ext.phx2.redhat.com [10.5.9.1]) by ns3.rdu.redhat.com (8.13.8/8.13.8) with ESMTP id n77KgWDQ005993; Fri, 7 Aug 2009 16:42:32 -0400 Received: by opsy.redhat.com (Postfix, from userid 500) id 8B8B0378580; Fri, 7 Aug 2009 14:42:31 -0600 (MDT) To: gdb-patches@sourceware.org Subject: FYI: fix PR gdb/8869 From: Tom Tromey Reply-To: tromey@redhat.com Date: Fri, 07 Aug 2009 20:48:00 -0000 Message-ID: User-Agent: Gnus/5.11 (Gnus v5.11) Emacs/22.3 (gnu/linux) MIME-Version: 1.0 Content-Type: text/plain; charset=us-ascii 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: 2009-08/txt/msg00117.txt.bz2 I'm checking this in. A long time ago I sent a different patch to fix PR 8869 (then called PR 1764, since we were still using Gnats). I resurrected the patch today. I like this version better, because it does not make add_setshow_cmd_full public. Instead, I reasoned that only "set" commands could accept completers, so I made some add_setshow_* functions return the "set" command. (I did not change all add_setshow_* functions, because some automatically set completers.) Built and regtested on x86-64 (compile farm). Tom 2009-08-07 Tom Tromey PR gdb/8869: * language.c (language_completer): New function. (range_or_type_completer): New function. (case_completer): New function. (_initialize_language): Set completers. * cli/cli-decode.c (add_setshow_string_cmd): Return the "set" command. (add_setshow_string_noescape_cmd): Likewise. (add_setshow_integer_cmd): Likewise. (add_setshow_uinteger_cmd): Likewise. (add_setshow_zinteger_cmd): Likewise. (add_setshow_zuinteger_cmd): Likewise. * command.h (add_setshow_string_cmd, add_setshow_string_noescape_cmd, add_setshow_uinteger_cmd, add_setshow_zinteger_cmd, add_setshow_zuinteger_cmd): Update. diff --git a/gdb/cli/cli-decode.c b/gdb/cli/cli-decode.c index 3e4f6f5..b547ba9 100644 --- a/gdb/cli/cli-decode.c +++ b/gdb/cli/cli-decode.c @@ -494,8 +494,9 @@ add_setshow_filename_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 + list for set/show or some sublist thereof). Return the new "set" + command. */ +struct cmd_list_element * add_setshow_string_cmd (char *name, enum command_class class, char **var, const char *set_doc, const char *show_doc, @@ -505,16 +506,19 @@ add_setshow_string_cmd (char *name, enum command_class class, struct cmd_list_element **set_list, struct cmd_list_element **show_list) { + struct cmd_list_element *cmd; add_setshow_cmd_full (name, class, var_string, var, set_doc, show_doc, help_doc, set_func, show_func, set_list, show_list, - NULL, NULL); + &cmd, NULL); + return cmd; } /* Add element named NAME to both the set and show command LISTs (the - list for set/show or some sublist thereof). */ -void + list for set/show or some sublist thereof). Return the new "set" + command. */ +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, @@ -524,11 +528,13 @@ 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 *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); + &cmd, NULL); + return cmd; } /* Add element named NAME to both the set and show command LISTs (the @@ -558,8 +564,9 @@ add_setshow_optional_filename_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). CLASS is as in add_cmd. VAR is address of the variable which will contain the - value. SET_DOC and SHOW_DOC are the documentation strings. */ -void + value. SET_DOC and SHOW_DOC are the documentation strings. Return + the new "set" command. */ +struct cmd_list_element * add_setshow_integer_cmd (char *name, enum command_class class, int *var, const char *set_doc, const char *show_doc, @@ -569,18 +576,21 @@ add_setshow_integer_cmd (char *name, enum command_class class, struct cmd_list_element **set_list, struct cmd_list_element **show_list) { + struct cmd_list_element *cmd; add_setshow_cmd_full (name, class, var_integer, var, set_doc, show_doc, help_doc, set_func, show_func, set_list, show_list, - NULL, NULL); + &cmd, NULL); + return cmd; } /* Add element named NAME to both the set and show command LISTs (the list for set/show or some sublist thereof). CLASS is as in add_cmd. VAR is address of the variable which will contain the - value. SET_DOC and SHOW_DOC are the documentation strings. */ -void + value. SET_DOC and SHOW_DOC are the documentation strings. Return + the new "set" command. */ +struct cmd_list_element * add_setshow_uinteger_cmd (char *name, enum command_class class, unsigned int *var, const char *set_doc, const char *show_doc, @@ -590,18 +600,21 @@ add_setshow_uinteger_cmd (char *name, enum command_class class, struct cmd_list_element **set_list, struct cmd_list_element **show_list) { + struct cmd_list_element *cmd; add_setshow_cmd_full (name, class, var_uinteger, var, set_doc, show_doc, help_doc, set_func, show_func, set_list, show_list, - NULL, NULL); + &cmd, NULL); + return cmd; } /* Add element named NAME to both the set and show command LISTs (the list for set/show or some sublist thereof). CLASS is as in add_cmd. VAR is address of the variable which will contain the - value. SET_DOC and SHOW_DOC are the documentation strings. */ -void + value. SET_DOC and SHOW_DOC are the documentation strings. Return + the new "set" command. */ +struct cmd_list_element * add_setshow_zinteger_cmd (char *name, enum command_class class, int *var, const char *set_doc, const char *show_doc, @@ -611,18 +624,21 @@ add_setshow_zinteger_cmd (char *name, enum command_class class, struct cmd_list_element **set_list, struct cmd_list_element **show_list) { + struct cmd_list_element *cmd; add_setshow_cmd_full (name, class, var_zinteger, var, set_doc, show_doc, help_doc, set_func, show_func, set_list, show_list, - NULL, NULL); + &cmd, NULL); + return cmd; } /* Add element named NAME to both the set and show command LISTs (the list for set/show or some sublist thereof). CLASS is as in add_cmd. VAR is address of the variable which will contain the - value. SET_DOC and SHOW_DOC are the documentation strings. */ -void + value. SET_DOC and SHOW_DOC are the documentation strings. Return + the new "set" command. */ +struct cmd_list_element * add_setshow_zuinteger_cmd (char *name, enum command_class class, unsigned int *var, const char *set_doc, const char *show_doc, @@ -632,11 +648,13 @@ add_setshow_zuinteger_cmd (char *name, enum command_class class, struct cmd_list_element **set_list, struct cmd_list_element **show_list) { + struct cmd_list_element *cmd; add_setshow_cmd_full (name, class, var_zuinteger, var, set_doc, show_doc, help_doc, set_func, show_func, set_list, show_list, - NULL, NULL); + &cmd, NULL); + return cmd; } /* Remove the command named NAME from the command list. Return the diff --git a/gdb/command.h b/gdb/command.h index 1a6bec4..4f12592 100644 --- a/gdb/command.h +++ b/gdb/command.h @@ -260,27 +260,29 @@ extern void add_setshow_filename_cmd (char *name, struct cmd_list_element **set_list, struct cmd_list_element **show_list); -extern void add_setshow_string_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_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_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, @@ -293,49 +295,53 @@ extern void add_setshow_optional_filename_cmd (char *name, struct cmd_list_element **set_list, struct cmd_list_element **show_list); -extern void add_setshow_integer_cmd (char *name, - enum command_class class, - int *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_integer_cmd (char *name, + enum command_class class, + int *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_uinteger_cmd (char *name, - enum command_class class, - unsigned int *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_uinteger_cmd (char *name, + enum command_class class, + unsigned int *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_zinteger_cmd (char *name, - enum command_class class, - int *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_zinteger_cmd (char *name, + enum command_class class, + int *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_zuinteger_cmd (char *name, - enum command_class class, - unsigned int *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_zuinteger_cmd (char *name, + enum command_class class, + unsigned int *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); /* Do a "show" command for each thing on a command list. */ diff --git a/gdb/language.c b/gdb/language.c index 62eeb62..a6c6165 100644 --- a/gdb/language.c +++ b/gdb/language.c @@ -221,6 +221,20 @@ local or auto Automatic setting based on source file\n")); error (_("Unknown language `%s'."), err_lang); } +static char ** +language_completer (struct cmd_list_element *self, char *text, char *word) +{ + int i; + const char **langnames + = (const char **) alloca ((languages_size + 1) * sizeof (const char *)); + + for (i = 0; i < languages_size; ++i) + langnames[i] = languages[i]->la_name; + langnames[i] = NULL; + + return complete_on_enum (langnames, text, word); +} + /* Show command. Display a warning if the type setting does not match the current language. */ static void @@ -315,6 +329,14 @@ set_range_command (char *ignore, int from_tty, struct cmd_list_element *c) show_range_command (NULL, from_tty, NULL, NULL); } +/* Completer for range and type parameters. */ +static char ** +range_or_type_completer (struct cmd_list_element *self, char *text, char *word) +{ + static const char *values[] = { "on", "off", "warn", "auto", NULL }; + return complete_on_enum (values, text, word); +} + /* Show command. Display a warning if the case sensitivity setting does not match the current language. */ static void @@ -359,6 +381,14 @@ set_case_command (char *ignore, int from_tty, struct cmd_list_element *c) show_case_command (NULL, from_tty, NULL, NULL); } +/* Completer for case-sensitive parameter. */ +static char ** +case_completer (struct cmd_list_element *self, char *text, char *word) +{ + static const char *values[] = { "on", "off", "auto", NULL }; + return complete_on_enum (values, text, word); +} + /* Set the status of range and type checking and case sensitivity based on the current modes and the current language. If SHOW is non-zero, then print out the current language, @@ -1340,21 +1370,21 @@ language_lookup_primitive_type_by_name (const struct language_defn *la, void _initialize_language (void) { - struct cmd_list_element *set, *show; + struct cmd_list_element *command; language_gdbarch_data = gdbarch_data_register_post_init (language_gdbarch_post_init); /* GDB commands for language specific stuff */ - /* FIXME: cagney/2005-02-20: This should be implemented using an - enum. */ - add_setshow_string_noescape_cmd ("language", class_support, &language, _("\ + command = add_setshow_string_noescape_cmd ("language", class_support, + &language, _("\ Set the current source language."), _("\ Show the current source language."), NULL, - set_language_command, - show_language_command, - &setlist, &showlist); + set_language_command, + show_language_command, + &setlist, &showlist); + set_cmd_completer (command, language_completer); add_prefix_cmd ("check", no_class, set_check, _("Set the status of the type/range checker."), @@ -1368,34 +1398,36 @@ Show the current source language."), NULL, add_alias_cmd ("c", "check", no_class, 1, &showlist); add_alias_cmd ("ch", "check", no_class, 1, &showlist); - /* FIXME: cagney/2005-02-20: This should be implemented using an - enum. */ - add_setshow_string_noescape_cmd ("type", class_support, &type, _("\ + command = + add_setshow_string_noescape_cmd ("type", class_support, + &type, _("\ Set type checking. (on/warn/off/auto)"), _("\ Show type checking. (on/warn/off/auto)"), NULL, - set_type_command, - show_type_command, - &setchecklist, &showchecklist); - - /* FIXME: cagney/2005-02-20: This should be implemented using an - enum. */ - add_setshow_string_noescape_cmd ("range", class_support, &range, _("\ + set_type_command, + show_type_command, + &setchecklist, &showchecklist); + set_cmd_completer (command, range_or_type_completer); + + command = + add_setshow_string_noescape_cmd ("range", class_support, + &range, _("\ Set range checking. (on/warn/off/auto)"), _("\ Show range checking. (on/warn/off/auto)"), NULL, - set_range_command, - show_range_command, - &setchecklist, &showchecklist); - - /* FIXME: cagney/2005-02-20: This should be implemented using an - enum. */ - add_setshow_string_noescape_cmd ("case-sensitive", class_support, - &case_sensitive, _("\ + set_range_command, + show_range_command, + &setchecklist, &showchecklist); + set_cmd_completer (command, range_or_type_completer); + + command = + add_setshow_string_noescape_cmd ("case-sensitive", class_support, + &case_sensitive, _("\ Set case sensitivity in name search. (on/off/auto)"), _("\ Show case sensitivity in name search. (on/off/auto)"), _("\ For Fortran the default is off; for other languages the default is on."), - set_case_command, - show_case_command, - &setlist, &showlist); + set_case_command, + show_case_command, + &setlist, &showlist); + set_cmd_completer (command, case_completer); add_language (&unknown_language_defn); add_language (&local_language_defn);