This is the mail archive of the gdb-patches@sourceware.org mailing list for the GDB project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

FYI: fix PR gdb/8869


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  <tromey@redhat.com>

	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);


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]