* FYI: fix PR gdb/8869
@ 2009-08-07 20:48 Tom Tromey
2009-08-07 22:05 ` Tom Tromey
` (2 more replies)
0 siblings, 3 replies; 17+ messages in thread
From: Tom Tromey @ 2009-08-07 20:48 UTC (permalink / raw)
To: gdb-patches
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);
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-07 20:48 FYI: fix PR gdb/8869 Tom Tromey
@ 2009-08-07 22:05 ` Tom Tromey
2009-08-07 22:16 ` Pedro Alves
2009-08-08 8:37 ` Eli Zaretskii
2 siblings, 0 replies; 17+ messages in thread
From: Tom Tromey @ 2009-08-07 22:05 UTC (permalink / raw)
To: gdb-patches
>>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:
Tom> I'm checking this in.
Tom> A long time ago I sent a different patch to fix PR 8869 (then called
Tom> PR 1764, since we were still using Gnats).
Daniel reminded me that I neglected to describe the problem.
The problem here is that "set language" does not complete properly.
I took the opportunity to fix a couple other completion bugs in
language.c at the same time.
The comments in the code say that this should use an enum, but that
looked like more of a pain than what I did.
Tom
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-07 20:48 FYI: fix PR gdb/8869 Tom Tromey
2009-08-07 22:05 ` Tom Tromey
@ 2009-08-07 22:16 ` Pedro Alves
2009-08-07 22:29 ` Tom Tromey
2009-08-08 8:37 ` Eli Zaretskii
2 siblings, 1 reply; 17+ messages in thread
From: Pedro Alves @ 2009-08-07 22:16 UTC (permalink / raw)
To: gdb-patches, tromey
Thanks!
We now trip on this snag though:
(gdb) set language f<TAB>ortran<ENTER>
Unknown language `fortran '.
(top-gdb) set language a<TAB>uto<ENTER>
Unknown language `auto '.
This works, because there's c++ in the list, so no extra
space:
(gdb) set language c<TAB><ENTER>
I guess this would go away automaticaly if this command
was a real enum command.
(gdb) set language <TAB>
ada auto c++ java minimal objective-c scheme
asm c fortran local modula-2 pascal unknown
Eh, I hadn't realized we were able to set "unknown" manually,
"set language" doesn't show it:
(gdb) set language
The currently understood settings are:
local or auto Automatic setting based on source file
ada Use the Ada language
c Use the C language
c++ Use the C++ language
asm Use the Asm language
minimal Use the Minimal language
fortran Use the Fortran language
objective-c Use the Objective-c language
java Use the Java language
modula-2 Use the Modula-2 language
pascal Use the Pascal language
scheme Use the Scheme language
--
Pedro Alves
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-07 22:16 ` Pedro Alves
@ 2009-08-07 22:29 ` Tom Tromey
2009-08-08 1:55 ` Tom Tromey
0 siblings, 1 reply; 17+ messages in thread
From: Tom Tromey @ 2009-08-07 22:29 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
>>>>> "Pedro" == Pedro Alves <pedro@codesourcery.com> writes:
Pedro> We now trip on this snag though:
Pedro> (gdb) set language f<TAB>ortran<ENTER>
Pedro> Unknown language `fortran '.
Sigh.
I'll fix soon.
Pedro> Eh, I hadn't realized we were able to set "unknown" manually,
Pedro> "set language" doesn't show it:
Yeah. It works in an unmodified gdb, but maybe it shouldn't.
Tom
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-07 22:29 ` Tom Tromey
@ 2009-08-08 1:55 ` Tom Tromey
2009-08-08 16:17 ` Pedro Alves
0 siblings, 1 reply; 17+ messages in thread
From: Tom Tromey @ 2009-08-08 1:55 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
>>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:
Tom> Sigh.
Tom> I'll fix soon.
Ok, here is an update to strip trailing whitespace. This time with some
tests.
This is kind of ugly.
I did remember a problem with using a real enum for set language -- the
languages aren't all registered when _initialize_language is called.
Tom
2009-08-07 Tom Tromey <tromey@redhat.com>
* language.c (set_language_command): Strip whitespace.
(set_type_command): Likewise.
(set_range_command): Likewise.
2009-08-07 Tom Tromey <tromey@redhat.com>
* gdb.base/setshow.exp: Add tests for changes to set language, set
check range, and set check type.
Index: language.c
===================================================================
RCS file: /cvs/src/src/gdb/language.c,v
retrieving revision 1.85
diff -u -r1.85 language.c
--- language.c 7 Aug 2009 20:44:14 -0000 1.85
+++ language.c 7 Aug 2009 23:23:43 -0000
@@ -150,11 +150,21 @@
static void
set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
- int i;
+ int i, len;
enum language flang;
- char *err_lang;
+ char *err_lang, *tem;
+
+ /* Strip trailing whitespace. */
+ if (!language)
+ len = 0;
+ else
+ {
+ len = strlen (language);
+ while (len > 0 && language[len - 1] == ' ')
+ --len;
+ }
- if (!language || !language[0])
+ if (len == 0)
{
printf_unfiltered (_("\
The currently understood settings are:\n\n\
@@ -181,6 +191,11 @@
return;
}
+ /* Reset LANGUAGE to avoid trailing spaces. */
+ tem = savestring (language, len);
+ xfree (language);
+ language = tem;
+
/* Search the list of languages for a match. */
for (i = 0; i < languages_size; i++)
{
@@ -251,6 +266,18 @@
static void
set_type_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
+ int len;
+ char *tem;
+
+ /* Strip trailing whitespace. */
+ len = strlen (type);
+ while (len > 0 && type[len - 1] == ' ')
+ --len;
+ /* Reset TYPE. */
+ tem = savestring (type, len);
+ xfree (type);
+ type = tem;
+
if (strcmp (type, "on") == 0)
{
type_check = type_check_on;
@@ -298,6 +325,18 @@
static void
set_range_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
+ int len;
+ char *tem;
+
+ /* Strip trailing whitespace. */
+ len = strlen (range);
+ while (len > 0 && range[len - 1] == ' ')
+ --len;
+ /* Reset RANGE. */
+ tem = savestring (range, len);
+ xfree (range);
+ range = tem;
+
if (strcmp (range, "on") == 0)
{
range_check = range_check_on;
Index: testsuite/gdb.base/setshow.exp
===================================================================
RCS file: /cvs/src/src/gdb/testsuite/gdb.base/setshow.exp,v
retrieving revision 1.11
diff -u -r1.11 setshow.exp
--- testsuite/gdb.base/setshow.exp 30 Jun 2009 18:28:12 -0000 1.11
+++ testsuite/gdb.base/setshow.exp 7 Aug 2009 23:23:44 -0000
@@ -104,6 +104,10 @@
gdb_test "set check range on" "" "set check range on"
#test show check range on
gdb_test "show check range" "Range checking is \"on\"\..*" "show check range (on)"
+#test set check range off with trailing space
+gdb_test "set check range off " "" "set check range off"
+#test show check range off
+gdb_test "show check range" "Range checking is \"off\"\..*" "show check range (off)"
#test set check range auto
gdb_test "set check range auto" "" "set check range auto"
#test show check range auto
@@ -112,6 +116,10 @@
gdb_test "set check type on" "" "set check type on"
#test show check type on
gdb_test "show check type" "Type checking is \"on\"..*" "show check type (on)"
+#test set check type off with trailing space
+gdb_test "set check type off " "" "set check type off"
+#test show check type off
+gdb_test "show check type" "Type checking is \"off\"..*" "show check type (off)"
#test set check type auto
gdb_test "set check type auto" "" "set check type auto"
#test show check type
@@ -170,6 +178,13 @@
gdb_test "set language asm" "" "set language asm"
#test show language asm
gdb_test "show language" "The current source language is \"asm\"..*" "show language (asm)"
+#test set language java, with a trailing space
+gdb_test "set language java " "" "set language java"
+#test show language java
+gdb_test "show language" "The current source language is \"java\"..*" "show language (java)"
+#test completion for set language.
+gdb_test "complete set language min" "set language minimal" \
+ "complete set language minimal"
#test set language auto
gdb_test "set language auto" "" "set language auto"
#test show language
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-07 20:48 FYI: fix PR gdb/8869 Tom Tromey
2009-08-07 22:05 ` Tom Tromey
2009-08-07 22:16 ` Pedro Alves
@ 2009-08-08 8:37 ` Eli Zaretskii
2009-08-10 17:59 ` Tom Tromey
2 siblings, 1 reply; 17+ messages in thread
From: Eli Zaretskii @ 2009-08-08 8:37 UTC (permalink / raw)
To: tromey; +Cc: gdb-patches
> From: Tom Tromey <tromey@redhat.com>
> Date: Fri, 07 Aug 2009 14:42:30 -0600
>
> I reasoned that only "set" commands could accept completers
I hope this doesn't mean that "show" commands will not complete
anymore, does it?
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-08 1:55 ` Tom Tromey
@ 2009-08-08 16:17 ` Pedro Alves
2009-08-08 16:39 ` Pedro Alves
0 siblings, 1 reply; 17+ messages in thread
From: Pedro Alves @ 2009-08-08 16:17 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
On Saturday 08 August 2009 00:28:00, Tom Tromey wrote:
> >>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:
>
> Tom> Sigh.
> Tom> I'll fix soon.
>
> Ok, here is an update to strip trailing whitespace. This time with some
> tests.
Thanks!
> This is kind of ugly.
Indeed. :-)
> I did remember a problem with using a real enum for set language -- the
> languages aren't all registered when _initialize_language is called.
I think it would work to (re-)register the command in add_language
instead, whenever a new language is added.
--
Pedro Alves
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-08 16:17 ` Pedro Alves
@ 2009-08-08 16:39 ` Pedro Alves
2009-08-08 18:08 ` Pedro Alves
0 siblings, 1 reply; 17+ messages in thread
From: Pedro Alves @ 2009-08-08 16:39 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
On Saturday 08 August 2009 14:43:58, Pedro Alves wrote:
> On Saturday 08 August 2009 00:28:00, Tom Tromey wrote:
> > >>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:
> >
> > Tom> Sigh.
> > Tom> I'll fix soon.
> >
> > Ok, here is an update to strip trailing whitespace. This time with some
> > tests.
>
> Thanks!
>
> > This is kind of ugly.
>
> Indeed. :-)
>
> > I did remember a problem with using a real enum for set language -- the
> > languages aren't all registered when _initialize_language is called.
>
> I think it would work to (re-)register the command in add_language
> instead, whenever a new language is added.
>
Like below. This was probably what Cagney had in mind with
the "FIXME: make these enum commands". Notice how set_case_str, set_type_str,
set_range_str and set_lang_str go away. This kills a few more usages of
deprecated_show_value_hack. No need to strip trailing whitespace.
One issue is that "set language" without an argument doesn't show that
larger help list of known languages, because the enum command machinary
takes care of handling the case of no argument itself. I've moved that
listing to "help set language", which I think is a better place for it
anyway.
(gdb) set language
Requires an argument. Valid arguments are auto, local, unknown, ada, c, c++, asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme.
(gdb) help set language
Set the current source language.
The currently understood settings are:
local or auto Automatic setting based on source file
ada Use the Ada language
c Use the C language
c++ Use the C++ language
asm Use the Asm language
minimal Use the Minimal language
fortran Use the Fortran language
objective-c Use the Objective-c language
java Use the Java language
modula-2 Use the Modula-2 language
pascal Use the Pascal language
scheme Use the Scheme language
(gdb)
This required a couple of testsuite adjustments to default.exp
and help.exp. I diffed the log of running setshow.exp, and the only
differences that came out were "Warning" vs "warning". This is due
to the patch changing a few printf_unfiltered("Warning:..." calls
to warning(_("... calls. More consistency, and, added i18n.
No regressions on x86_64-unknown-linux-gnu. Let me know what
you think.
--
Pedro Alves
2009-08-08 Pedro Alves <pedro@codesourcery.com>
* language.c (language, type, range, case_sensitive): Make const.
(show_language_command): Don't call deprecated_show_value_hack.
Special case "auto".
(set_language_command): Don't strip trailing whitespace. Don't
print list of known languages. An unrecognized language is now an
internal error instead of a user error. Don't call set_lang_str.
(language_completer): Delete.
(show_type_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_type_command): Don't strip trailing whitespace. An
unrecognized type is now an internal error instead of a user
error. Output type check mismatch with language here. Don't call
set_type_str.
(show_range_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_range_command): Don't strip trailing whitespace. An
unrecognized range check is now an internal error instead of a
warning. Output range check mismatch with language here. Don't
call set_range_str.
(show_case_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_case_command): Don't call set_case_str. An unrecognized case
check is now an internal error instead of a warning. Output range
check mismatch with language here. Don't call set_case_str.
(set_type_range_case): Don't call set_type_str, set_range_str or
set_case_str here.
(set_lang_str, set_type_str, set_range_str, set_case_str): Delete.
(add_language): Install or reinstall the "set language" command
here, and make it an enum command. Build the enumeration and the
help string from the current list of known languages.
(_initialize_language): Don't install "set language" here. Make
"set check type", "set check range" and "set case-sensitive" enum
commands. Register the "auto" "local" and "unknown" languages in
that order.
2009-08-08 Pedro Alves <pedro@codesourcery.com>
* gdb.base/default.exp: Adjust "set language test": it's now an
enum command. Larger help string moved to "help set language".
* gdb.base/help.exp: Adjust "help set language" expected output,
now lists all known languages.
---
gdb/language.c | 478 ++++++++++++++++---------------------
gdb/testsuite/gdb.base/default.exp | 2
gdb/testsuite/gdb.base/help.exp | 3
3 files changed, 210 insertions(+), 273 deletions(-)
Index: src/gdb/language.c
===================================================================
--- src.orig/gdb/language.c 2009-08-08 16:24:02.000000000 +0100
+++ src/gdb/language.c 2009-08-08 16:47:39.000000000 +0100
@@ -47,14 +47,6 @@
extern void _initialize_language (void);
-static void set_case_str (void);
-
-static void set_range_str (void);
-
-static void set_type_str (void);
-
-static void set_lang_str (void);
-
static void unk_lang_error (char *);
static int unk_lang_parser (void);
@@ -111,16 +103,12 @@ static unsigned languages_size;
static unsigned languages_allocsize;
#define DEFAULT_ALLOCSIZE 4
-/* The "set language/type/range" commands all put stuff in these
- buffers. This is to make them work as set/show commands. The
- user's string is copied here, then the set_* commands look at
- them and update them to something that looks nice when it is
- printed out. */
-
-static char *language;
-static char *type;
-static char *range;
-static char *case_sensitive;
+/* The current values of the "set language/type/range" enum
+ commands. */
+static const char *language;
+static const char *type;
+static const char *range;
+static const char *case_sensitive;
/* Warning issued when current_language and the language of the current
frame do not match. */
@@ -138,7 +126,15 @@ show_language_command (struct ui_file *f
{
enum language flang; /* The language of the current frame */
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (language_mode == language_mode_auto)
+ fprintf_filtered (gdb_stdout,
+ _("The current source language is "
+ "\"auto; currently %s\".\n"),
+ current_language->la_name);
+ else
+ fprintf_filtered (gdb_stdout, _("The current source language is \"%s\".\n"),
+ current_language->la_name);
+
flang = get_frame_language ();
if (flang != language_unknown &&
language_mode == language_mode_manual &&
@@ -150,51 +146,9 @@ show_language_command (struct ui_file *f
static void
set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
- int i, len;
+ int i;
enum language flang;
- char *err_lang, *tem;
-
- /* Strip trailing whitespace. */
- if (!language)
- len = 0;
- else
- {
- len = strlen (language);
- while (len > 0 && language[len - 1] == ' ')
- --len;
- }
-
- if (len == 0)
- {
- printf_unfiltered (_("\
-The currently understood settings are:\n\n\
-local or auto Automatic setting based on source file\n"));
-
- for (i = 0; i < languages_size; ++i)
- {
- /* Already dealt with these above. */
- if (languages[i]->la_language == language_unknown
- || languages[i]->la_language == language_auto)
- continue;
-
- /* FIXME: i18n: for now assume that the human-readable name
- is just a capitalization of the internal name. */
- printf_unfiltered ("%-16s Use the %c%s language\n",
- languages[i]->la_name,
- /* Capitalize first letter of language
- name. */
- toupper (languages[i]->la_name[0]),
- languages[i]->la_name + 1);
- }
- /* Restore the silly string. */
- set_language (current_language->la_language);
- return;
- }
-
- /* Reset LANGUAGE to avoid trailing spaces. */
- tem = savestring (language, len);
- xfree (language);
- language = tem;
+ char *err_lang;
/* Search the list of languages for a match. */
for (i = 0; i < languages_size; i++)
@@ -221,33 +175,15 @@ local or auto Automatic setting based
language_mode = language_mode_manual;
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
expected_language = current_language;
return;
}
}
}
- /* Reset the language (esp. the global string "language") to the
- correct values. */
- err_lang = xstrdup (language);
- make_cleanup (xfree, err_lang); /* Free it after error */
- set_language (current_language->la_language);
- 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);
+ internal_error (__FILE__, __LINE__,
+ "Couldn't find language `%s' in known languages list.",
+ language);
}
/* Show command. Display a warning if the type setting does
@@ -256,28 +192,43 @@ static void
show_type_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (type_mode == type_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (type_check)
+ {
+ case type_check_on:
+ tmp = "on";
+ break;
+ case type_check_off:
+ tmp = "off";
+ break;
+ case type_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized type check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Type checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Type checking is \"%s\".\n"),
+ value);
+
if (type_check != current_language->la_type_check)
- printf_unfiltered (
- "Warning: the current type check setting does not match the language.\n");
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Set command. Change the setting for type checking. */
static void
set_type_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
- int len;
- char *tem;
-
- /* Strip trailing whitespace. */
- len = strlen (type);
- while (len > 0 && type[len - 1] == ' ')
- --len;
- /* Reset TYPE. */
- tem = savestring (type, len);
- xfree (type);
- type = tem;
-
if (strcmp (type, "on") == 0)
{
type_check = type_check_on;
@@ -297,16 +248,14 @@ set_type_command (char *ignore, int from
{
type_mode = type_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_type_str call below. We
- did it in set_type_range_case. */
- return;
}
else
- {
- warning (_("Unrecognized type check setting: \"%s\""), type);
- }
- set_type_str ();
- show_type_command (NULL, from_tty, NULL, NULL);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized type check setting: \"%s\""), type);
+
+ if (type_check != current_language->la_type_check)
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Show command. Display a warning if the range setting does
@@ -315,28 +264,43 @@ static void
show_range_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (range_mode == range_mode_auto)
+ {
+ char *tmp;
+
+ switch (range_check)
+ {
+ case range_check_on:
+ tmp = "on";
+ break;
+ case range_check_off:
+ tmp = "off";
+ break;
+ case range_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized range check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Range checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Range checking is \"%s\".\n"),
+ value);
+
if (range_check != current_language->la_range_check)
- printf_unfiltered (
- "Warning: the current range check setting does not match the language.\n");
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Set command. Change the setting for range checking. */
static void
set_range_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
- int len;
- char *tem;
-
- /* Strip trailing whitespace. */
- len = strlen (range);
- while (len > 0 && range[len - 1] == ' ')
- --len;
- /* Reset RANGE. */
- tem = savestring (range, len);
- xfree (range);
- range = tem;
-
if (strcmp (range, "on") == 0)
{
range_check = range_check_on;
@@ -356,16 +320,17 @@ set_range_command (char *ignore, int fro
{
range_mode = range_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_range_str call below. We
- did it in set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized range check setting: \"%s\""), range);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized range check setting: \"%s\""), range);
}
- set_range_str ();
- show_range_command (NULL, from_tty, NULL, NULL);
+
+ if (range_check != current_language->la_range_check)
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Completer for range and type parameters. */
@@ -382,10 +347,35 @@ static void
show_case_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (case_mode == case_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (case_sensitivity)
+ {
+ case case_sensitive_on:
+ tmp = "on";
+ break;
+ case case_sensitive_off:
+ tmp = "off";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Case sensitivity in "
+ "name search is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Case sensitivity in name search is \"%s\".\n"),
+ value);
+
if (case_sensitivity != current_language->la_case_sensitivity)
- printf_unfiltered(
-"Warning: the current case sensitivity setting does not match the language.\n");
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set command. Change the setting for case sensitivity. */
@@ -407,17 +397,18 @@ set_case_command (char *ignore, int from
{
case_mode = case_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_case_str call below. We did it in
- set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized case-sensitive setting: \"%s\""),
- case_sensitive);
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting: \"%s\"",
+ case_sensitive);
}
- set_case_str();
- show_case_command (NULL, from_tty, NULL, NULL);
+
+ if (case_sensitivity != current_language->la_case_sensitivity)
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Completer for case-sensitive parameter. */
@@ -435,7 +426,6 @@ case_completer (struct cmd_list_element
static void
set_type_range_case (void)
{
-
if (range_mode == range_mode_auto)
range_check = current_language->la_range_check;
@@ -444,10 +434,6 @@ set_type_range_case (void)
if (case_mode == case_mode_auto)
case_sensitivity = current_language->la_case_sensitivity;
-
- set_type_str ();
- set_range_str ();
- set_case_str ();
}
/* Set current language to (enum language) LANG. Returns previous language. */
@@ -466,7 +452,6 @@ set_language (enum language lang)
{
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
break;
}
}
@@ -474,100 +459,6 @@ set_language (enum language lang)
return prev_language;
}
\f
-/* This page contains functions that update the global vars
- language, type and range. */
-static void
-set_lang_str (void)
-{
- char *prefix = "";
-
- if (language)
- xfree (language);
- if (language_mode == language_mode_auto)
- prefix = "auto; currently ";
-
- language = concat (prefix, current_language->la_name, (char *)NULL);
-}
-
-static void
-set_type_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (type)
- xfree (type);
- if (type_mode == type_mode_auto)
- prefix = "auto; currently ";
-
- switch (type_check)
- {
- case type_check_on:
- tmp = "on";
- break;
- case type_check_off:
- tmp = "off";
- break;
- case type_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized type check setting."));
- }
-
- type = concat (prefix, tmp, (char *)NULL);
-}
-
-static void
-set_range_str (void)
-{
- char *tmp, *pref = "";
-
- if (range_mode == range_mode_auto)
- pref = "auto; currently ";
-
- switch (range_check)
- {
- case range_check_on:
- tmp = "on";
- break;
- case range_check_off:
- tmp = "off";
- break;
- case range_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized range check setting."));
- }
-
- if (range)
- xfree (range);
- range = concat (pref, tmp, (char *)NULL);
-}
-
-static void
-set_case_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (case_mode==case_mode_auto)
- prefix = "auto; currently ";
-
- switch (case_sensitivity)
- {
- case case_sensitive_on:
- tmp = "on";
- break;
- case case_sensitive_off:
- tmp = "off";
- break;
- default:
- error (_("Unrecognized case-sensitive setting."));
- }
-
- xfree (case_sensitive);
- case_sensitive = concat (prefix, tmp, (char *)NULL);
-}
/* Print out the current language settings: language, range and
type checking. If QUIETLY, print only what has changed. */
@@ -1007,6 +898,15 @@ show_check (char *ignore, int from_tty)
void
add_language (const struct language_defn *lang)
{
+ /* For the "set language" command. */
+ static char **language_names = NULL;
+ /* For the "help set language" command. */
+ static char *language_set_doc = NULL;
+
+ int i;
+ struct ui_file *tmp_stream;
+ long len;
+
if (lang->la_magic != LANG_MAGIC)
{
fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n",
@@ -1027,6 +927,51 @@ add_language (const struct language_defn
languages_allocsize * sizeof (*languages));
}
languages[languages_size++] = lang;
+
+ /* Build the language names array, to be used as enumeration in the
+ set language" enum command. */
+ language_names = xrealloc (language_names,
+ (languages_size + 1) * sizeof (const char *));
+ for (i = 0; i < languages_size; ++i)
+ language_names[i] = languages[i]->la_name;
+ language_names[i] = NULL;
+
+ /* Build the "help set language" docs. */
+ tmp_stream = mem_fileopen ();
+
+ fprintf_unfiltered (tmp_stream, _("\
+Set the current source language.\n\
+The currently understood settings are:\n\n\
+local or auto Automatic setting based on source file\n"));
+
+ for (i = 0; i < languages_size; ++i)
+ {
+ /* Already dealt with these above. */
+ if (languages[i]->la_language == language_unknown
+ || languages[i]->la_language == language_auto)
+ continue;
+
+ /* FIXME: i18n: for now assume that the human-readable name
+ is just a capitalization of the internal name. */
+ fprintf_unfiltered (tmp_stream, "%-16s Use the %c%s language\n",
+ languages[i]->la_name,
+ /* Capitalize first letter of language
+ name. */
+ toupper (languages[i]->la_name[0]),
+ languages[i]->la_name + 1);
+ }
+
+ xfree (language_set_doc);
+ language_set_doc = ui_file_xstrdup (tmp_stream, &len);
+
+ add_setshow_enum_cmd ("language", class_support,
+ (const char **) language_names,
+ &language,
+ language_set_doc, _("\
+Show the current source language."), NULL,
+ set_language_command,
+ show_language_command,
+ &setlist, &showlist);
}
/* Iterate through all registered languages looking for and calling
@@ -1409,22 +1354,16 @@ language_lookup_primitive_type_by_name (
void
_initialize_language (void)
{
- struct cmd_list_element *command;
+ static const char *type_or_range_names[]
+ = { "on", "off", "warn", "auto", NULL };
+
+ static const char *case_sensitive_names[] = { "on", "off", "auto", NULL };
language_gdbarch_data
= gdbarch_data_register_post_init (language_gdbarch_post_init);
/* GDB commands for language specific stuff */
- 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_cmd_completer (command, language_completer);
-
add_prefix_cmd ("check", no_class, set_check,
_("Set the status of the type/range checker."),
&setchecklist, "set check ", 0, &setlist);
@@ -1437,40 +1376,37 @@ Show the current source language."), NUL
add_alias_cmd ("c", "check", no_class, 1, &showlist);
add_alias_cmd ("ch", "check", no_class, 1, &showlist);
- command =
- add_setshow_string_noescape_cmd ("type", class_support,
- &type, _("\
+ add_setshow_enum_cmd ("type", class_support,
+ type_or_range_names,
+ &type, _("\
Set type checking. (on/warn/off/auto)"), _("\
Show type checking. (on/warn/off/auto)"), NULL,
- 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_type_command,
+ show_type_command,
+ &setchecklist, &showchecklist);
+
+ add_setshow_enum_cmd ("range", class_support,
+ type_or_range_names,
+ &range, _("\
Set range checking. (on/warn/off/auto)"), _("\
Show range checking. (on/warn/off/auto)"), NULL,
- 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_range_command,
+ show_range_command,
+ &setchecklist, &showchecklist);
+
+ add_setshow_enum_cmd ("case-sensitive", class_support,
+ case_sensitive_names,
+ &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_cmd_completer (command, case_completer);
+ set_case_command,
+ show_case_command,
+ &setlist, &showlist);
- add_language (&unknown_language_defn);
- add_language (&local_language_defn);
add_language (&auto_language_defn);
+ add_language (&local_language_defn);
+ add_language (&unknown_language_defn);
language = xstrdup ("auto");
type = xstrdup ("auto");
Index: src/gdb/testsuite/gdb.base/default.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/default.exp 2009-08-08 16:49:08.000000000 +0100
+++ src/gdb/testsuite/gdb.base/default.exp 2009-08-08 16:55:23.000000000 +0100
@@ -530,7 +530,7 @@ gdb_test "set history size" "Argument re
#test set history
gdb_test "set history" "\"set history\" must be followed by the name of a history subcommand.(\[^\r\n\]*\[\r\n\])+List of set history subcommands:(\[^\r\n\]*\[\r\n\])+set history expansion -- Set history expansion on command input(\[^\r\n\]*\[\r\n\])+set history filename -- Set the filename in which to record the command history(\[^\r\n\]*\[\r\n\])+set history save -- Set saving of the history record on exit(\[^\r\n\]*\[\r\n\])+set history size -- Set the size of the command history(\[^\r\n\]*\[\r\n\])+Type \"help set history\" followed by set history subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set history"
#test set language
-gdb_test "set language" "The currently understood settings are:(\[^\r\n\]*\[\r\n\])+local or auto *Automatic setting based on source file(\[^\r\n\]*\[\r\n\])+c *Use the C language(\[^\r\n\]*\[\r\n\])+c\[+\]+ *Use the C\[+\]+ language(\[^\r\n\]*\[\r\n\])+modula-2 *Use the Modula-2 language.*" "set language"
+gdb_test "set language" "Requires an argument. Valid arguments are auto, local, unknown, ada, c, c.., asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme." "set language"
#test set listsize
gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize"
#test set print "p" abbreviation
Index: src/gdb/testsuite/gdb.base/help.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/help.exp 2009-08-08 16:49:30.000000000 +0100
+++ src/gdb/testsuite/gdb.base/help.exp 2009-08-08 16:56:07.000000000 +0100
@@ -418,7 +418,8 @@ test_prefix_command_help {"set history"}
"Generic command for setting command history parameters\.\[\r\n\]+"
}
# test help set language
-gdb_test "help set language" "Set the current source language\." "help set language"
+gdb_test "help set language" "Set the current source language\.\[\r\n\]+The currently understood settings are:(\[^\r\n\]*\[\r\n\])+local or auto *Automatic setting based on source file(\[^\r\n\]*\[\r\n\])+c *Use the C language(\[^\r\n\]*\[\r\n\])+c\[+\]+ *Use the C\[+\]+ language(\[^\r\n\]*\[\r\n\])+modula-2 *Use the Modula-2 language.*" "help set language"
+
# test help set listsize
gdb_test "help set listsize" "Set number of source lines gdb will list by default\." "help set listsize"
# test help set print "p" abbreviation
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-08 16:39 ` Pedro Alves
@ 2009-08-08 18:08 ` Pedro Alves
2009-08-12 23:00 ` Tom Tromey
0 siblings, 1 reply; 17+ messages in thread
From: Pedro Alves @ 2009-08-08 18:08 UTC (permalink / raw)
To: gdb-patches; +Cc: Tom Tromey
On Saturday 08 August 2009 17:17:28, Pedro Alves wrote:
> On Saturday 08 August 2009 14:43:58, Pedro Alves wrote:
> > On Saturday 08 August 2009 00:28:00, Tom Tromey wrote:
> > > >>>>> "Tom" == Tom Tromey <tromey@redhat.com> writes:
> > >
> > > Tom> Sigh.
> > > Tom> I'll fix soon.
> > >
> > > Ok, here is an update to strip trailing whitespace. This time with some
> > > tests.
> >
> > Thanks!
> >
> > > This is kind of ugly.
> >
> > Indeed. :-)
> >
> > > I did remember a problem with using a real enum for set language -- the
> > > languages aren't all registered when _initialize_language is called.
> >
> > I think it would work to (re-)register the command in add_language
> > instead, whenever a new language is added.
> >
>
> Like below. This was probably what Cagney had in mind with
> the "FIXME: make these enum commands". Notice how set_case_str, set_type_str,
> set_range_str and set_lang_str go away. This kills a few more usages of
> deprecated_show_value_hack. No need to strip trailing whitespace.
> One issue is that "set language" without an argument doesn't show that
> larger help list of known languages, because the enum command machinary
> takes care of handling the case of no argument itself. I've moved that
> listing to "help set language", which I think is a better place for it
> anyway.
>
> (gdb) set language
> Requires an argument. Valid arguments are auto, local, unknown, ada, c, c++, asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme.
> (gdb) help set language
> Set the current source language.
> The currently understood settings are:
>
> local or auto Automatic setting based on source file
> ada Use the Ada language
> c Use the C language
> c++ Use the C++ language
> asm Use the Asm language
> minimal Use the Minimal language
> fortran Use the Fortran language
> objective-c Use the Objective-c language
> java Use the Java language
> modula-2 Use the Modula-2 language
> pascal Use the Pascal language
> scheme Use the Scheme language
>
> (gdb)
>
> This required a couple of testsuite adjustments to default.exp
> and help.exp. I diffed the log of running setshow.exp, and the only
> differences that came out were "Warning" vs "warning". This is due
> to the patch changing a few printf_unfiltered("Warning:..." calls
> to warning(_("... calls. More consistency, and, added i18n.
>
> No regressions on x86_64-unknown-linux-gnu. Let me know what
> you think.
>
Small update. This also deletes the the range, type and case completers that
aren't needed anymore, and plugs a leak I was introducing (mem_fileopen).
--
Pedro Alves
2009-08-08 Pedro Alves <pedro@codesourcery.com>
* language.c (language, type, range, case_sensitive): Make const.
(show_language_command): Don't call deprecated_show_value_hack.
Special case "auto".
(set_language_command): Don't strip trailing whitespace. Don't
print list of known languages. An unrecognized language is now an
internal error instead of a user error. Don't call set_lang_str.
(language_completer): Delete.
(show_type_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_type_command): Don't strip trailing whitespace. An
unrecognized type is now an internal error instead of a user
error. Output type check mismatch with language here. Don't call
set_type_str.
(show_range_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_range_command): Don't strip trailing whitespace. An
unrecognized range check is now an internal error instead of a
warning. Output range check mismatch with language here. Don't
call set_range_str.
(range_or_type_completer): Delete.
(show_case_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_case_command): Don't call set_case_str. An unrecognized case
check is now an internal error instead of a warning. Output range
check mismatch with language here. Don't call set_case_str.
(case_completer): Delete.
(set_type_range_case): Don't call set_type_str, set_range_str or
set_case_str here.
(set_lang_str, set_type_str, set_range_str, set_case_str): Delete.
(add_language): Install or reinstall the "set language" command
here, and make it an enum command. Build the enumeration and the
help string from the current list of known languages.
(_initialize_language): Don't install "set language" here. Make
"set check type", "set check range" and "set case-sensitive" enum
commands. No need for special completers. Register the "auto"
"local" and "unknown" languages in that order.
2009-08-08 Pedro Alves <pedro@codesourcery.com>
* gdb.base/default.exp: Adjust "set language test": it's now an
enum command. Larger help string moved to "help set language".
* gdb.base/help.exp: Adjust "help set language" expected output,
now lists all known languages.
---
gdb/language.c | 490 +++++++++++++++----------------------
gdb/testsuite/gdb.base/default.exp | 2
gdb/testsuite/gdb.base/help.exp | 3
3 files changed, 209 insertions(+), 286 deletions(-)
Index: src/gdb/language.c
===================================================================
--- src.orig/gdb/language.c 2009-08-08 17:24:33.000000000 +0100
+++ src/gdb/language.c 2009-08-08 17:45:38.000000000 +0100
@@ -47,14 +47,6 @@
extern void _initialize_language (void);
-static void set_case_str (void);
-
-static void set_range_str (void);
-
-static void set_type_str (void);
-
-static void set_lang_str (void);
-
static void unk_lang_error (char *);
static int unk_lang_parser (void);
@@ -111,16 +103,12 @@ static unsigned languages_size;
static unsigned languages_allocsize;
#define DEFAULT_ALLOCSIZE 4
-/* The "set language/type/range" commands all put stuff in these
- buffers. This is to make them work as set/show commands. The
- user's string is copied here, then the set_* commands look at
- them and update them to something that looks nice when it is
- printed out. */
-
-static char *language;
-static char *type;
-static char *range;
-static char *case_sensitive;
+/* The current values of the "set language/type/range" enum
+ commands. */
+static const char *language;
+static const char *type;
+static const char *range;
+static const char *case_sensitive;
/* Warning issued when current_language and the language of the current
frame do not match. */
@@ -138,7 +126,15 @@ show_language_command (struct ui_file *f
{
enum language flang; /* The language of the current frame */
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (language_mode == language_mode_auto)
+ fprintf_filtered (gdb_stdout,
+ _("The current source language is "
+ "\"auto; currently %s\".\n"),
+ current_language->la_name);
+ else
+ fprintf_filtered (gdb_stdout, _("The current source language is \"%s\".\n"),
+ current_language->la_name);
+
flang = get_frame_language ();
if (flang != language_unknown &&
language_mode == language_mode_manual &&
@@ -150,51 +146,9 @@ show_language_command (struct ui_file *f
static void
set_language_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
- int i, len;
+ int i;
enum language flang;
- char *err_lang, *tem;
-
- /* Strip trailing whitespace. */
- if (!language)
- len = 0;
- else
- {
- len = strlen (language);
- while (len > 0 && language[len - 1] == ' ')
- --len;
- }
-
- if (len == 0)
- {
- printf_unfiltered (_("\
-The currently understood settings are:\n\n\
-local or auto Automatic setting based on source file\n"));
-
- for (i = 0; i < languages_size; ++i)
- {
- /* Already dealt with these above. */
- if (languages[i]->la_language == language_unknown
- || languages[i]->la_language == language_auto)
- continue;
-
- /* FIXME: i18n: for now assume that the human-readable name
- is just a capitalization of the internal name. */
- printf_unfiltered ("%-16s Use the %c%s language\n",
- languages[i]->la_name,
- /* Capitalize first letter of language
- name. */
- toupper (languages[i]->la_name[0]),
- languages[i]->la_name + 1);
- }
- /* Restore the silly string. */
- set_language (current_language->la_language);
- return;
- }
-
- /* Reset LANGUAGE to avoid trailing spaces. */
- tem = savestring (language, len);
- xfree (language);
- language = tem;
+ char *err_lang;
/* Search the list of languages for a match. */
for (i = 0; i < languages_size; i++)
@@ -221,33 +175,15 @@ local or auto Automatic setting based
language_mode = language_mode_manual;
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
expected_language = current_language;
return;
}
}
}
- /* Reset the language (esp. the global string "language") to the
- correct values. */
- err_lang = xstrdup (language);
- make_cleanup (xfree, err_lang); /* Free it after error */
- set_language (current_language->la_language);
- 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);
+ internal_error (__FILE__, __LINE__,
+ "Couldn't find language `%s' in known languages list.",
+ language);
}
/* Show command. Display a warning if the type setting does
@@ -256,28 +192,43 @@ static void
show_type_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (type_mode == type_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (type_check)
+ {
+ case type_check_on:
+ tmp = "on";
+ break;
+ case type_check_off:
+ tmp = "off";
+ break;
+ case type_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized type check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Type checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Type checking is \"%s\".\n"),
+ value);
+
if (type_check != current_language->la_type_check)
- printf_unfiltered (
- "Warning: the current type check setting does not match the language.\n");
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Set command. Change the setting for type checking. */
static void
set_type_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
- int len;
- char *tem;
-
- /* Strip trailing whitespace. */
- len = strlen (type);
- while (len > 0 && type[len - 1] == ' ')
- --len;
- /* Reset TYPE. */
- tem = savestring (type, len);
- xfree (type);
- type = tem;
-
if (strcmp (type, "on") == 0)
{
type_check = type_check_on;
@@ -297,16 +248,15 @@ set_type_command (char *ignore, int from
{
type_mode = type_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_type_str call below. We
- did it in set_type_range_case. */
return;
}
else
- {
- warning (_("Unrecognized type check setting: \"%s\""), type);
- }
- set_type_str ();
- show_type_command (NULL, from_tty, NULL, NULL);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized type check setting: \"%s\""), type);
+
+ if (type_check != current_language->la_type_check)
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Show command. Display a warning if the range setting does
@@ -315,28 +265,43 @@ static void
show_range_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (range_mode == range_mode_auto)
+ {
+ char *tmp;
+
+ switch (range_check)
+ {
+ case range_check_on:
+ tmp = "on";
+ break;
+ case range_check_off:
+ tmp = "off";
+ break;
+ case range_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized range check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Range checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Range checking is \"%s\".\n"),
+ value);
+
if (range_check != current_language->la_range_check)
- printf_unfiltered (
- "Warning: the current range check setting does not match the language.\n");
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Set command. Change the setting for range checking. */
static void
set_range_command (char *ignore, int from_tty, struct cmd_list_element *c)
{
- int len;
- char *tem;
-
- /* Strip trailing whitespace. */
- len = strlen (range);
- while (len > 0 && range[len - 1] == ' ')
- --len;
- /* Reset RANGE. */
- tem = savestring (range, len);
- xfree (range);
- range = tem;
-
if (strcmp (range, "on") == 0)
{
range_check = range_check_on;
@@ -356,24 +321,17 @@ set_range_command (char *ignore, int fro
{
range_mode = range_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_range_str call below. We
- did it in set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized range check setting: \"%s\""), range);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized range check setting: \"%s\""), range);
}
- set_range_str ();
- 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);
+ if (range_check != current_language->la_range_check)
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Show command. Display a warning if the case sensitivity setting does
@@ -382,10 +340,35 @@ static void
show_case_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (case_mode == case_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (case_sensitivity)
+ {
+ case case_sensitive_on:
+ tmp = "on";
+ break;
+ case case_sensitive_off:
+ tmp = "off";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Case sensitivity in "
+ "name search is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Case sensitivity in name search is \"%s\".\n"),
+ value);
+
if (case_sensitivity != current_language->la_case_sensitivity)
- printf_unfiltered(
-"Warning: the current case sensitivity setting does not match the language.\n");
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set command. Change the setting for case sensitivity. */
@@ -407,25 +390,18 @@ set_case_command (char *ignore, int from
{
case_mode = case_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_case_str call below. We did it in
- set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized case-sensitive setting: \"%s\""),
- case_sensitive);
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting: \"%s\"",
+ case_sensitive);
}
- set_case_str();
- 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);
+ if (case_sensitivity != current_language->la_case_sensitivity)
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set the status of range and type checking and case sensitivity based on
@@ -435,7 +411,6 @@ case_completer (struct cmd_list_element
static void
set_type_range_case (void)
{
-
if (range_mode == range_mode_auto)
range_check = current_language->la_range_check;
@@ -444,10 +419,6 @@ set_type_range_case (void)
if (case_mode == case_mode_auto)
case_sensitivity = current_language->la_case_sensitivity;
-
- set_type_str ();
- set_range_str ();
- set_case_str ();
}
/* Set current language to (enum language) LANG. Returns previous language. */
@@ -466,7 +437,6 @@ set_language (enum language lang)
{
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
break;
}
}
@@ -474,100 +444,6 @@ set_language (enum language lang)
return prev_language;
}
\f
-/* This page contains functions that update the global vars
- language, type and range. */
-static void
-set_lang_str (void)
-{
- char *prefix = "";
-
- if (language)
- xfree (language);
- if (language_mode == language_mode_auto)
- prefix = "auto; currently ";
-
- language = concat (prefix, current_language->la_name, (char *)NULL);
-}
-
-static void
-set_type_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (type)
- xfree (type);
- if (type_mode == type_mode_auto)
- prefix = "auto; currently ";
-
- switch (type_check)
- {
- case type_check_on:
- tmp = "on";
- break;
- case type_check_off:
- tmp = "off";
- break;
- case type_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized type check setting."));
- }
-
- type = concat (prefix, tmp, (char *)NULL);
-}
-
-static void
-set_range_str (void)
-{
- char *tmp, *pref = "";
-
- if (range_mode == range_mode_auto)
- pref = "auto; currently ";
-
- switch (range_check)
- {
- case range_check_on:
- tmp = "on";
- break;
- case range_check_off:
- tmp = "off";
- break;
- case range_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized range check setting."));
- }
-
- if (range)
- xfree (range);
- range = concat (pref, tmp, (char *)NULL);
-}
-
-static void
-set_case_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (case_mode==case_mode_auto)
- prefix = "auto; currently ";
-
- switch (case_sensitivity)
- {
- case case_sensitive_on:
- tmp = "on";
- break;
- case case_sensitive_off:
- tmp = "off";
- break;
- default:
- error (_("Unrecognized case-sensitive setting."));
- }
-
- xfree (case_sensitive);
- case_sensitive = concat (prefix, tmp, (char *)NULL);
-}
/* Print out the current language settings: language, range and
type checking. If QUIETLY, print only what has changed. */
@@ -1007,6 +883,15 @@ show_check (char *ignore, int from_tty)
void
add_language (const struct language_defn *lang)
{
+ /* For the "set language" command. */
+ static char **language_names = NULL;
+ /* For the "help set language" command. */
+ static char *language_set_doc = NULL;
+
+ int i;
+ struct ui_file *tmp_stream;
+ long len;
+
if (lang->la_magic != LANG_MAGIC)
{
fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n",
@@ -1027,6 +912,52 @@ add_language (const struct language_defn
languages_allocsize * sizeof (*languages));
}
languages[languages_size++] = lang;
+
+ /* Build the language names array, to be used as enumeration in the
+ set language" enum command. */
+ language_names = xrealloc (language_names,
+ (languages_size + 1) * sizeof (const char *));
+ for (i = 0; i < languages_size; ++i)
+ language_names[i] = languages[i]->la_name;
+ language_names[i] = NULL;
+
+ /* Build the "help set language" docs. */
+ tmp_stream = mem_fileopen ();
+
+ fprintf_unfiltered (tmp_stream, _("\
+Set the current source language.\n\
+The currently understood settings are:\n\n\
+local or auto Automatic setting based on source file\n"));
+
+ for (i = 0; i < languages_size; ++i)
+ {
+ /* Already dealt with these above. */
+ if (languages[i]->la_language == language_unknown
+ || languages[i]->la_language == language_auto)
+ continue;
+
+ /* FIXME: i18n: for now assume that the human-readable name
+ is just a capitalization of the internal name. */
+ fprintf_unfiltered (tmp_stream, "%-16s Use the %c%s language\n",
+ languages[i]->la_name,
+ /* Capitalize first letter of language
+ name. */
+ toupper (languages[i]->la_name[0]),
+ languages[i]->la_name + 1);
+ }
+
+ xfree (language_set_doc);
+ language_set_doc = ui_file_xstrdup (tmp_stream, &len);
+ ui_file_delete (tmp_stream);
+
+ add_setshow_enum_cmd ("language", class_support,
+ (const char **) language_names,
+ &language,
+ language_set_doc, _("\
+Show the current source language."), NULL,
+ set_language_command,
+ show_language_command,
+ &setlist, &showlist);
}
/* Iterate through all registered languages looking for and calling
@@ -1409,22 +1340,16 @@ language_lookup_primitive_type_by_name (
void
_initialize_language (void)
{
- struct cmd_list_element *command;
+ static const char *type_or_range_names[]
+ = { "on", "off", "warn", "auto", NULL };
+
+ static const char *case_sensitive_names[] = { "on", "off", "auto", NULL };
language_gdbarch_data
= gdbarch_data_register_post_init (language_gdbarch_post_init);
/* GDB commands for language specific stuff */
- 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_cmd_completer (command, language_completer);
-
add_prefix_cmd ("check", no_class, set_check,
_("Set the status of the type/range checker."),
&setchecklist, "set check ", 0, &setlist);
@@ -1437,40 +1362,37 @@ Show the current source language."), NUL
add_alias_cmd ("c", "check", no_class, 1, &showlist);
add_alias_cmd ("ch", "check", no_class, 1, &showlist);
- command =
- add_setshow_string_noescape_cmd ("type", class_support,
- &type, _("\
+ add_setshow_enum_cmd ("type", class_support,
+ type_or_range_names,
+ &type, _("\
Set type checking. (on/warn/off/auto)"), _("\
Show type checking. (on/warn/off/auto)"), NULL,
- 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_type_command,
+ show_type_command,
+ &setchecklist, &showchecklist);
+
+ add_setshow_enum_cmd ("range", class_support,
+ type_or_range_names,
+ &range, _("\
Set range checking. (on/warn/off/auto)"), _("\
Show range checking. (on/warn/off/auto)"), NULL,
- 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_range_command,
+ show_range_command,
+ &setchecklist, &showchecklist);
+
+ add_setshow_enum_cmd ("case-sensitive", class_support,
+ case_sensitive_names,
+ &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_cmd_completer (command, case_completer);
+ set_case_command,
+ show_case_command,
+ &setlist, &showlist);
- add_language (&unknown_language_defn);
- add_language (&local_language_defn);
add_language (&auto_language_defn);
+ add_language (&local_language_defn);
+ add_language (&unknown_language_defn);
language = xstrdup ("auto");
type = xstrdup ("auto");
Index: src/gdb/testsuite/gdb.base/default.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/default.exp 2009-08-08 17:24:33.000000000 +0100
+++ src/gdb/testsuite/gdb.base/default.exp 2009-08-08 17:39:49.000000000 +0100
@@ -530,7 +530,7 @@ gdb_test "set history size" "Argument re
#test set history
gdb_test "set history" "\"set history\" must be followed by the name of a history subcommand.(\[^\r\n\]*\[\r\n\])+List of set history subcommands:(\[^\r\n\]*\[\r\n\])+set history expansion -- Set history expansion on command input(\[^\r\n\]*\[\r\n\])+set history filename -- Set the filename in which to record the command history(\[^\r\n\]*\[\r\n\])+set history save -- Set saving of the history record on exit(\[^\r\n\]*\[\r\n\])+set history size -- Set the size of the command history(\[^\r\n\]*\[\r\n\])+Type \"help set history\" followed by set history subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set history"
#test set language
-gdb_test "set language" "The currently understood settings are:(\[^\r\n\]*\[\r\n\])+local or auto *Automatic setting based on source file(\[^\r\n\]*\[\r\n\])+c *Use the C language(\[^\r\n\]*\[\r\n\])+c\[+\]+ *Use the C\[+\]+ language(\[^\r\n\]*\[\r\n\])+modula-2 *Use the Modula-2 language.*" "set language"
+gdb_test "set language" "Requires an argument. Valid arguments are auto, local, unknown, ada, c, c.., asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme." "set language"
#test set listsize
gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize"
#test set print "p" abbreviation
Index: src/gdb/testsuite/gdb.base/help.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/help.exp 2009-08-08 17:24:33.000000000 +0100
+++ src/gdb/testsuite/gdb.base/help.exp 2009-08-08 17:39:49.000000000 +0100
@@ -418,7 +418,8 @@ test_prefix_command_help {"set history"}
"Generic command for setting command history parameters\.\[\r\n\]+"
}
# test help set language
-gdb_test "help set language" "Set the current source language\." "help set language"
+gdb_test "help set language" "Set the current source language\.\[\r\n\]+The currently understood settings are:(\[^\r\n\]*\[\r\n\])+local or auto *Automatic setting based on source file(\[^\r\n\]*\[\r\n\])+c *Use the C language(\[^\r\n\]*\[\r\n\])+c\[+\]+ *Use the C\[+\]+ language(\[^\r\n\]*\[\r\n\])+modula-2 *Use the Modula-2 language.*" "help set language"
+
# test help set listsize
gdb_test "help set listsize" "Set number of source lines gdb will list by default\." "help set listsize"
# test help set print "p" abbreviation
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-08 8:37 ` Eli Zaretskii
@ 2009-08-10 17:59 ` Tom Tromey
2009-08-10 19:38 ` Eli Zaretskii
0 siblings, 1 reply; 17+ messages in thread
From: Tom Tromey @ 2009-08-10 17:59 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
>>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> writes:
Tom> I reasoned that only "set" commands could accept completers
Eli> I hope this doesn't mean that "show" commands will not complete
Eli> anymore, does it?
The completer in question is used for the arguments to a command.
"show" commands don't take arguments, AFAIK. So, there is no problem here.
Perhaps I am misunderstanding you, though. What do you think would stop
working?
Tom
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-10 17:59 ` Tom Tromey
@ 2009-08-10 19:38 ` Eli Zaretskii
2009-08-10 19:59 ` Tom Tromey
0 siblings, 1 reply; 17+ messages in thread
From: Eli Zaretskii @ 2009-08-10 19:38 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
> Cc: gdb-patches@sourceware.org
> From: Tom Tromey <tromey@redhat.com>
> Date: Mon, 10 Aug 2009 11:47:41 -0600
>
> >>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> writes:
>
> Tom> I reasoned that only "set" commands could accept completers
>
> Eli> I hope this doesn't mean that "show" commands will not complete
> Eli> anymore, does it?
>
> The completer in question is used for the arguments to a command.
> "show" commands don't take arguments, AFAIK. So, there is no problem here.
How do you mean ``don't take arguments''? Every word after `show' is
an argument to `show', and some "show" commands have more than one
word there, like "show history", "show mem", etc.
> Perhaps I am misunderstanding you, though. What do you think would stop
> working?
Completion of the words after `show'. I didn't say it would stop
working, I just expressed the hope that it won't.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-10 19:38 ` Eli Zaretskii
@ 2009-08-10 19:59 ` Tom Tromey
2009-08-10 20:10 ` Eli Zaretskii
0 siblings, 1 reply; 17+ messages in thread
From: Tom Tromey @ 2009-08-10 19:59 UTC (permalink / raw)
To: Eli Zaretskii; +Cc: gdb-patches
>>>>> "Eli" == Eli Zaretskii <eliz@gnu.org> writes:
>> The completer in question is used for the arguments to a command.
>> "show" commands don't take arguments, AFAIK. So, there is no problem here.
Eli> How do you mean ``don't take arguments''? Every word after `show' is
Eli> an argument to `show', and some "show" commands have more than one
Eli> word there, like "show history", "show mem", etc.
That is handled by complete_line_internal, not the specific command's
completion function.
Nothing broke here.
Tom
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-10 19:59 ` Tom Tromey
@ 2009-08-10 20:10 ` Eli Zaretskii
0 siblings, 0 replies; 17+ messages in thread
From: Eli Zaretskii @ 2009-08-10 20:10 UTC (permalink / raw)
To: Tom Tromey; +Cc: gdb-patches
> Cc: gdb-patches@sourceware.org
> From: Tom Tromey <tromey@redhat.com>
> Date: Mon, 10 Aug 2009 13:37:47 -0600
>
> Nothing broke here.
Then I'm happy. Thanks.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-08 18:08 ` Pedro Alves
@ 2009-08-12 23:00 ` Tom Tromey
2009-08-13 17:06 ` Pedro Alves
0 siblings, 1 reply; 17+ messages in thread
From: Tom Tromey @ 2009-08-12 23:00 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
>>>>> "Pedro" == Pedro Alves <pedro@codesourcery.com> writes:
Sorry for the delay on this.
Pedro> One issue is that "set language" without an argument doesn't show that
Pedro> larger help list of known languages, because the enum command machinary
Pedro> takes care of handling the case of no argument itself. I've moved that
Pedro> listing to "help set language", which I think is a better place for it
Pedro> anyway.
Yeah.
If you put this in you might as well revert my cli-decode.c changes.
Pedro> (add_language): Install or reinstall the "set language" command
Pedro> here, and make it an enum command. Build the enumeration and the
Pedro> help string from the current list of known languages.
This is also ugly, IMO, though differently so. Re-registering the
command means a lot of allocation for something that we could fully know
at build time.
I suppose it would be possible to count the languages and only call
add_setshow_enum_cmd on the last call to add_language.
If we are to compare ugliness (in what units? I suggest negative
helens), though, I would say that yours is the less ugly.
Pedro> Register the "auto" "local" and "unknown" languages in that
Pedro> order.
I was curious to know the rationale for this particular change. If
order matters, this does not seem correct, because nothing guarantees
that _initialize_language will be called before any other call to
add_language. Instead the sorting would have to be done in
add_language. If order does not matter, then there's no need for the
change.
Tom
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-12 23:00 ` Tom Tromey
@ 2009-08-13 17:06 ` Pedro Alves
2009-08-13 17:34 ` Eli Zaretskii
0 siblings, 1 reply; 17+ messages in thread
From: Pedro Alves @ 2009-08-13 17:06 UTC (permalink / raw)
To: gdb-patches
On Wednesday 12 August 2009 23:34:29, Tom Tromey wrote:
> If you put this in you might as well revert my cli-decode.c changes.
Okay, I've reverted the 2009-08-07 patches, minus the testsuite
changes, and rebased this new patch on top of what we had
before. Easier and cleaner this way.
> Pedro> (add_language): Install or reinstall the "set language" command
> Pedro> here, and make it an enum command. Build the enumeration and the
> Pedro> help string from the current list of known languages.
>
> This is also ugly, IMO, though differently so. Re-registering the
> command means a lot of allocation for something
I guess "a lot" is subjective. :-)
> that we could fully know
> at build time.
Wasn't someone wanting to be able to write new languages support
in python? :-)
> I suppose it would be possible to count the languages and only call
> add_setshow_enum_cmd on the last call to add_language.
Ew.
> If we are to compare ugliness (in what units? I suggest negative
> helens), though, I would say that yours is the less ugly.
Thanks. Also by removing a few instances of ugly and hacky code
and deprecated mechanisms uses should give it a few
extra mH's. :-)
> Pedro> Register the "auto" "local" and "unknown" languages in that
> Pedro> order.
>
> I was curious to know the rationale for this particular change. If
> order matters, this does not seem correct, because nothing guarantees
> that _initialize_language will be called before any other call to
> add_language. Instead the sorting would have to be done in
> add_language. If order does not matter, then there's no need for the
> change.
Sorry, I forgot to explain this one. This is merelly due to a small
cosmetic annoyance:
(gdb) set language
Requires an argument. Valid arguments are unknown, local, auto, ada, c, c++, asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme.
vs.
(gdb) set language
Requires an argument. Valid arguments are auto, local, unknown, ada, c, c++, asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme.
"Valid arguments are unknown" strikes me as odd.
Certainly we should not rely on the order of _initialize_foo calls, but
that's not what I'm doing. I'm changing the order of three add_language
calls that are always done in a row, thus these three languages will always
appear together. If some other module ends up calling add_language before
_initialize_language is called, fine, as long as "unknown" isn't the
first in the list. I guess we can also claim that it is weird that
"set language" doesn't show an alphabetically sorted list, while
"set language<TAB>" does. Anyone bothered enough to go address that?
Below's what I just checked in, after giving it a new testsuite spin.
--
Pedro Alves
2009-08-13 Pedro Alves <pedro@codesourcery.com>
PR gdb/8869:
* language.c (language, type, range, case_sensitive): Make const.
(show_language_command): Don't call deprecated_show_value_hack.
Special case "auto".
(set_language_command): An unrecognized language is now an
internal error instead of a user error. Don't call set_lang_str.
(show_type_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_type_command): An unrecognized type is now an internal error
instead of a user error. Output type check mismatch with language
here. Don't call set_type_str.
(show_range_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_range_command): An unrecognized range check is now an
internal error instead of a warning. Output range check mismatch
with language here. Don't call set_range_str.
(show_case_command): Don't call deprecated_show_value_hack.
Special case "auto". Use warning.
(set_case_command): Don't call set_case_str. An unrecognized case
check is now an internal error instead of a warning. Output range
check mismatch with language here. Don't call set_case_str.
(set_type_range_case): Don't call set_type_str, set_range_str or
set_case_str here.
(set_lang_str, set_type_str, set_range_str, set_case_str): Delete.
(add_language): Install or reinstall the "set language" command
here, and make it an enum command. Build the enumeration and the
help string from the current list of known languages.
(_initialize_language): Don't install "set language" here. Make
"set check type", "set check range" and "set case-sensitive" enum
commands. Register the "auto" "local" and "unknown" languages in
that order.
2009-08-13 Pedro Alves <pedro@codesourcery.com>
* gdb.base/default.exp: Adjust "set language test": it's now an
enum command. Larger help string moved to "help set language".
* gdb.base/help.exp: Adjust "help set language" expected output,
now lists all known languages.
---
gdb/language.c | 418 +++++++++++++++++--------------------
gdb/testsuite/gdb.base/default.exp | 2
gdb/testsuite/gdb.base/help.exp | 3
3 files changed, 206 insertions(+), 217 deletions(-)
Index: src/gdb/language.c
===================================================================
--- src.orig/gdb/language.c 2009-08-13 15:26:01.000000000 +0100
+++ src/gdb/language.c 2009-08-13 15:42:01.000000000 +0100
@@ -47,14 +47,6 @@
extern void _initialize_language (void);
-static void set_case_str (void);
-
-static void set_range_str (void);
-
-static void set_type_str (void);
-
-static void set_lang_str (void);
-
static void unk_lang_error (char *);
static int unk_lang_parser (void);
@@ -111,16 +103,12 @@ static unsigned languages_size;
static unsigned languages_allocsize;
#define DEFAULT_ALLOCSIZE 4
-/* The "set language/type/range" commands all put stuff in these
- buffers. This is to make them work as set/show commands. The
- user's string is copied here, then the set_* commands look at
- them and update them to something that looks nice when it is
- printed out. */
-
-static char *language;
-static char *type;
-static char *range;
-static char *case_sensitive;
+/* The current values of the "set language/type/range" enum
+ commands. */
+static const char *language;
+static const char *type;
+static const char *range;
+static const char *case_sensitive;
/* Warning issued when current_language and the language of the current
frame do not match. */
@@ -138,7 +126,15 @@ show_language_command (struct ui_file *f
{
enum language flang; /* The language of the current frame */
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (language_mode == language_mode_auto)
+ fprintf_filtered (gdb_stdout,
+ _("The current source language is "
+ "\"auto; currently %s\".\n"),
+ current_language->la_name);
+ else
+ fprintf_filtered (gdb_stdout, _("The current source language is \"%s\".\n"),
+ current_language->la_name);
+
flang = get_frame_language ();
if (flang != language_unknown &&
language_mode == language_mode_manual &&
@@ -152,34 +148,6 @@ set_language_command (char *ignore, int
{
int i;
enum language flang;
- char *err_lang;
-
- if (!language || !language[0])
- {
- printf_unfiltered (_("\
-The currently understood settings are:\n\n\
-local or auto Automatic setting based on source file\n"));
-
- for (i = 0; i < languages_size; ++i)
- {
- /* Already dealt with these above. */
- if (languages[i]->la_language == language_unknown
- || languages[i]->la_language == language_auto)
- continue;
-
- /* FIXME: i18n: for now assume that the human-readable name
- is just a capitalization of the internal name. */
- printf_unfiltered ("%-16s Use the %c%s language\n",
- languages[i]->la_name,
- /* Capitalize first letter of language
- name. */
- toupper (languages[i]->la_name[0]),
- languages[i]->la_name + 1);
- }
- /* Restore the silly string. */
- set_language (current_language->la_language);
- return;
- }
/* Search the list of languages for a match. */
for (i = 0; i < languages_size; i++)
@@ -206,19 +174,15 @@ local or auto Automatic setting based
language_mode = language_mode_manual;
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
expected_language = current_language;
return;
}
}
}
- /* Reset the language (esp. the global string "language") to the
- correct values. */
- err_lang = xstrdup (language);
- make_cleanup (xfree, err_lang); /* Free it after error */
- set_language (current_language->la_language);
- error (_("Unknown language `%s'."), err_lang);
+ internal_error (__FILE__, __LINE__,
+ "Couldn't find language `%s' in known languages list.",
+ language);
}
/* Show command. Display a warning if the type setting does
@@ -227,10 +191,37 @@ static void
show_type_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
- if (type_check != current_language->la_type_check)
- printf_unfiltered (
- "Warning: the current type check setting does not match the language.\n");
+ if (type_mode == type_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (type_check)
+ {
+ case type_check_on:
+ tmp = "on";
+ break;
+ case type_check_off:
+ tmp = "off";
+ break;
+ case type_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized type check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Type checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Type checking is \"%s\".\n"),
+ value);
+
+ if (type_check != current_language->la_type_check)
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Set command. Change the setting for type checking. */
@@ -256,16 +247,15 @@ set_type_command (char *ignore, int from
{
type_mode = type_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_type_str call below. We
- did it in set_type_range_case. */
return;
}
else
- {
- warning (_("Unrecognized type check setting: \"%s\""), type);
- }
- set_type_str ();
- show_type_command (NULL, from_tty, NULL, NULL);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized type check setting: \"%s\""), type);
+
+ if (type_check != current_language->la_type_check)
+ warning (_("the current type check setting"
+ " does not match the language.\n"));
}
/* Show command. Display a warning if the range setting does
@@ -274,10 +264,37 @@ static void
show_range_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (range_mode == range_mode_auto)
+ {
+ char *tmp;
+
+ switch (range_check)
+ {
+ case range_check_on:
+ tmp = "on";
+ break;
+ case range_check_off:
+ tmp = "off";
+ break;
+ case range_check_warn:
+ tmp = "warn";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized range check setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Range checking is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Range checking is \"%s\".\n"),
+ value);
+
if (range_check != current_language->la_range_check)
- printf_unfiltered (
- "Warning: the current range check setting does not match the language.\n");
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Set command. Change the setting for range checking. */
@@ -303,16 +320,16 @@ set_range_command (char *ignore, int fro
{
range_mode = range_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_range_str call below. We
- did it in set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized range check setting: \"%s\""), range);
+ internal_error (__FILE__, __LINE__,
+ _("Unrecognized range check setting: \"%s\""), range);
}
- set_range_str ();
- show_range_command (NULL, from_tty, NULL, NULL);
+ if (range_check != current_language->la_range_check)
+ warning (_("the current range check setting "
+ "does not match the language.\n"));
}
/* Show command. Display a warning if the case sensitivity setting does
@@ -321,10 +338,35 @@ static void
show_case_command (struct ui_file *file, int from_tty,
struct cmd_list_element *c, const char *value)
{
- deprecated_show_value_hack (file, from_tty, c, value);
+ if (case_mode == case_mode_auto)
+ {
+ char *tmp = NULL;
+
+ switch (case_sensitivity)
+ {
+ case case_sensitive_on:
+ tmp = "on";
+ break;
+ case case_sensitive_off:
+ tmp = "off";
+ break;
+ default:
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting.");
+ }
+
+ fprintf_filtered (gdb_stdout,
+ _("Case sensitivity in "
+ "name search is \"auto; currently %s\".\n"),
+ tmp);
+ }
+ else
+ fprintf_filtered (gdb_stdout, _("Case sensitivity in name search is \"%s\".\n"),
+ value);
+
if (case_sensitivity != current_language->la_case_sensitivity)
- printf_unfiltered(
-"Warning: the current case sensitivity setting does not match the language.\n");
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set command. Change the setting for case sensitivity. */
@@ -346,17 +388,18 @@ set_case_command (char *ignore, int from
{
case_mode = case_mode_auto;
set_type_range_case ();
- /* Avoid hitting the set_case_str call below. We did it in
- set_type_range_case. */
return;
}
else
{
- warning (_("Unrecognized case-sensitive setting: \"%s\""),
- case_sensitive);
+ internal_error (__FILE__, __LINE__,
+ "Unrecognized case-sensitive setting: \"%s\"",
+ case_sensitive);
}
- set_case_str();
- show_case_command (NULL, from_tty, NULL, NULL);
+
+ if (case_sensitivity != current_language->la_case_sensitivity)
+ warning (_("the current case sensitivity setting does not match "
+ "the language.\n"));
}
/* Set the status of range and type checking and case sensitivity based on
@@ -366,7 +409,6 @@ set_case_command (char *ignore, int from
static void
set_type_range_case (void)
{
-
if (range_mode == range_mode_auto)
range_check = current_language->la_range_check;
@@ -375,10 +417,6 @@ set_type_range_case (void)
if (case_mode == case_mode_auto)
case_sensitivity = current_language->la_case_sensitivity;
-
- set_type_str ();
- set_range_str ();
- set_case_str ();
}
/* Set current language to (enum language) LANG. Returns previous language. */
@@ -397,7 +435,6 @@ set_language (enum language lang)
{
current_language = languages[i];
set_type_range_case ();
- set_lang_str ();
break;
}
}
@@ -405,100 +442,6 @@ set_language (enum language lang)
return prev_language;
}
\f
-/* This page contains functions that update the global vars
- language, type and range. */
-static void
-set_lang_str (void)
-{
- char *prefix = "";
-
- if (language)
- xfree (language);
- if (language_mode == language_mode_auto)
- prefix = "auto; currently ";
-
- language = concat (prefix, current_language->la_name, (char *)NULL);
-}
-
-static void
-set_type_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (type)
- xfree (type);
- if (type_mode == type_mode_auto)
- prefix = "auto; currently ";
-
- switch (type_check)
- {
- case type_check_on:
- tmp = "on";
- break;
- case type_check_off:
- tmp = "off";
- break;
- case type_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized type check setting."));
- }
-
- type = concat (prefix, tmp, (char *)NULL);
-}
-
-static void
-set_range_str (void)
-{
- char *tmp, *pref = "";
-
- if (range_mode == range_mode_auto)
- pref = "auto; currently ";
-
- switch (range_check)
- {
- case range_check_on:
- tmp = "on";
- break;
- case range_check_off:
- tmp = "off";
- break;
- case range_check_warn:
- tmp = "warn";
- break;
- default:
- error (_("Unrecognized range check setting."));
- }
-
- if (range)
- xfree (range);
- range = concat (pref, tmp, (char *)NULL);
-}
-
-static void
-set_case_str (void)
-{
- char *tmp = NULL, *prefix = "";
-
- if (case_mode==case_mode_auto)
- prefix = "auto; currently ";
-
- switch (case_sensitivity)
- {
- case case_sensitive_on:
- tmp = "on";
- break;
- case case_sensitive_off:
- tmp = "off";
- break;
- default:
- error (_("Unrecognized case-sensitive setting."));
- }
-
- xfree (case_sensitive);
- case_sensitive = concat (prefix, tmp, (char *)NULL);
-}
/* Print out the current language settings: language, range and
type checking. If QUIETLY, print only what has changed. */
@@ -938,6 +881,15 @@ show_check (char *ignore, int from_tty)
void
add_language (const struct language_defn *lang)
{
+ /* For the "set language" command. */
+ static char **language_names = NULL;
+ /* For the "help set language" command. */
+ static char *language_set_doc = NULL;
+
+ int i;
+ struct ui_file *tmp_stream;
+ long len;
+
if (lang->la_magic != LANG_MAGIC)
{
fprintf_unfiltered (gdb_stderr, "Magic number of %s language struct wrong\n",
@@ -958,6 +910,52 @@ add_language (const struct language_defn
languages_allocsize * sizeof (*languages));
}
languages[languages_size++] = lang;
+
+ /* Build the language names array, to be used as enumeration in the
+ set language" enum command. */
+ language_names = xrealloc (language_names,
+ (languages_size + 1) * sizeof (const char *));
+ for (i = 0; i < languages_size; ++i)
+ language_names[i] = languages[i]->la_name;
+ language_names[i] = NULL;
+
+ /* Build the "help set language" docs. */
+ tmp_stream = mem_fileopen ();
+
+ fprintf_unfiltered (tmp_stream, _("\
+Set the current source language.\n\
+The currently understood settings are:\n\n\
+local or auto Automatic setting based on source file\n"));
+
+ for (i = 0; i < languages_size; ++i)
+ {
+ /* Already dealt with these above. */
+ if (languages[i]->la_language == language_unknown
+ || languages[i]->la_language == language_auto)
+ continue;
+
+ /* FIXME: i18n: for now assume that the human-readable name
+ is just a capitalization of the internal name. */
+ fprintf_unfiltered (tmp_stream, "%-16s Use the %c%s language\n",
+ languages[i]->la_name,
+ /* Capitalize first letter of language
+ name. */
+ toupper (languages[i]->la_name[0]),
+ languages[i]->la_name + 1);
+ }
+
+ xfree (language_set_doc);
+ language_set_doc = ui_file_xstrdup (tmp_stream, &len);
+ ui_file_delete (tmp_stream);
+
+ add_setshow_enum_cmd ("language", class_support,
+ (const char **) language_names,
+ &language,
+ language_set_doc, _("\
+Show the current source language."), NULL,
+ set_language_command,
+ show_language_command,
+ &setlist, &showlist);
}
/* Iterate through all registered languages looking for and calling
@@ -1340,22 +1338,17 @@ language_lookup_primitive_type_by_name (
void
_initialize_language (void)
{
- struct cmd_list_element *set, *show;
+ static const char *type_or_range_names[]
+ = { "on", "off", "warn", "auto", NULL };
+
+ static const char *case_sensitive_names[]
+ = { "on", "off", "auto", NULL };
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, _("\
-Set the current source language."), _("\
-Show the current source language."), NULL,
- set_language_command,
- show_language_command,
- &setlist, &showlist);
-
add_prefix_cmd ("check", no_class, set_check,
_("Set the status of the type/range checker."),
&setchecklist, "set check ", 0, &setlist);
@@ -1368,38 +1361,33 @@ Show the current source language."), NUL
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, _("\
+ add_setshow_enum_cmd ("type", class_support, type_or_range_names, &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);
+
+ add_setshow_enum_cmd ("range", class_support, type_or_range_names,
+ &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);
+
+ add_setshow_enum_cmd ("case-sensitive", class_support, case_sensitive_names,
+ &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);
- add_language (&unknown_language_defn);
- add_language (&local_language_defn);
add_language (&auto_language_defn);
+ add_language (&local_language_defn);
+ add_language (&unknown_language_defn);
language = xstrdup ("auto");
type = xstrdup ("auto");
Index: src/gdb/testsuite/gdb.base/default.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/default.exp 2009-08-13 15:15:10.000000000 +0100
+++ src/gdb/testsuite/gdb.base/default.exp 2009-08-13 15:26:28.000000000 +0100
@@ -530,7 +530,7 @@ gdb_test "set history size" "Argument re
#test set history
gdb_test "set history" "\"set history\" must be followed by the name of a history subcommand.(\[^\r\n\]*\[\r\n\])+List of set history subcommands:(\[^\r\n\]*\[\r\n\])+set history expansion -- Set history expansion on command input(\[^\r\n\]*\[\r\n\])+set history filename -- Set the filename in which to record the command history(\[^\r\n\]*\[\r\n\])+set history save -- Set saving of the history record on exit(\[^\r\n\]*\[\r\n\])+set history size -- Set the size of the command history(\[^\r\n\]*\[\r\n\])+Type \"help set history\" followed by set history subcommand name for full documentation.(\[^\r\n\]*\[\r\n\])+Command name abbreviations are allowed if unambiguous." "set history"
#test set language
-gdb_test "set language" "The currently understood settings are:(\[^\r\n\]*\[\r\n\])+local or auto *Automatic setting based on source file(\[^\r\n\]*\[\r\n\])+c *Use the C language(\[^\r\n\]*\[\r\n\])+c\[+\]+ *Use the C\[+\]+ language(\[^\r\n\]*\[\r\n\])+modula-2 *Use the Modula-2 language.*" "set language"
+gdb_test "set language" "Requires an argument. Valid arguments are auto, local, unknown, ada, c, c.., asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme." "set language"
#test set listsize
gdb_test "set listsize" "Argument required .integer to set it to.*" "set listsize"
#test set print "p" abbreviation
Index: src/gdb/testsuite/gdb.base/help.exp
===================================================================
--- src.orig/gdb/testsuite/gdb.base/help.exp 2009-08-13 15:15:10.000000000 +0100
+++ src/gdb/testsuite/gdb.base/help.exp 2009-08-13 15:26:28.000000000 +0100
@@ -418,7 +418,8 @@ test_prefix_command_help {"set history"}
"Generic command for setting command history parameters\.\[\r\n\]+"
}
# test help set language
-gdb_test "help set language" "Set the current source language\." "help set language"
+gdb_test "help set language" "Set the current source language\.\[\r\n\]+The currently understood settings are:(\[^\r\n\]*\[\r\n\])+local or auto *Automatic setting based on source file(\[^\r\n\]*\[\r\n\])+c *Use the C language(\[^\r\n\]*\[\r\n\])+c\[+\]+ *Use the C\[+\]+ language(\[^\r\n\]*\[\r\n\])+modula-2 *Use the Modula-2 language.*" "help set language"
+
# test help set listsize
gdb_test "help set listsize" "Set number of source lines gdb will list by default\." "help set listsize"
# test help set print "p" abbreviation
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-13 17:06 ` Pedro Alves
@ 2009-08-13 17:34 ` Eli Zaretskii
2009-08-13 18:30 ` Pedro Alves
0 siblings, 1 reply; 17+ messages in thread
From: Eli Zaretskii @ 2009-08-13 17:34 UTC (permalink / raw)
To: Pedro Alves; +Cc: gdb-patches
> From: Pedro Alves <pedro@codesourcery.com>
> Date: Thu, 13 Aug 2009 16:03:03 +0100
>
> (gdb) set language
> Requires an argument. Valid arguments are unknown, local, auto, ada, c, c++, asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme.
>
> vs.
>
> (gdb) set language
> Requires an argument. Valid arguments are auto, local, unknown, ada, c, c++, asm, minimal, fortran, objective-c, java, modula-2, pascal, scheme.
>
> "Valid arguments are unknown" strikes me as odd.
You could say
Valid arguments are: unknown, local, auto, ...
It is also more grammatically correct, I believe.
> I guess we can also claim that it is weird that
> "set language" doesn't show an alphabetically sorted list, while
> "set language<TAB>" does. Anyone bothered enough to go address that?
I indeed think the list should be alphabetized. As the list grows,
having any other order will make it easier to miss some language you
are looking for.
^ permalink raw reply [flat|nested] 17+ messages in thread
* Re: FYI: fix PR gdb/8869
2009-08-13 17:34 ` Eli Zaretskii
@ 2009-08-13 18:30 ` Pedro Alves
0 siblings, 0 replies; 17+ messages in thread
From: Pedro Alves @ 2009-08-13 18:30 UTC (permalink / raw)
To: gdb-patches, Eli Zaretskii
On Thursday 13 August 2009 18:15:03, Eli Zaretskii wrote:
> You could say
>
> Valid arguments are: unknown, local, auto, ...
>
> It is also more grammatically correct, I believe.
Good idea, even obvious in hindsight.
> > I guess we can also claim that it is weird that
> > "set language" doesn't show an alphabetically sorted list, while
> > "set language<TAB>" does. Anyone bothered enough to go address that?
>
> I indeed think the list should be alphabetized. As the list grows,
> having any other order will make it easier to miss some language you
> are looking for.
Okay. To be clear, this is an issue with the generic enum command
support, so addressing this one addresses all enum commands, which
is probably a good thing.
--
Pedro Alves
^ permalink raw reply [flat|nested] 17+ messages in thread
end of thread, other threads:[~2009-08-13 17:34 UTC | newest]
Thread overview: 17+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2009-08-07 20:48 FYI: fix PR gdb/8869 Tom Tromey
2009-08-07 22:05 ` Tom Tromey
2009-08-07 22:16 ` Pedro Alves
2009-08-07 22:29 ` Tom Tromey
2009-08-08 1:55 ` Tom Tromey
2009-08-08 16:17 ` Pedro Alves
2009-08-08 16:39 ` Pedro Alves
2009-08-08 18:08 ` Pedro Alves
2009-08-12 23:00 ` Tom Tromey
2009-08-13 17:06 ` Pedro Alves
2009-08-13 17:34 ` Eli Zaretskii
2009-08-13 18:30 ` Pedro Alves
2009-08-08 8:37 ` Eli Zaretskii
2009-08-10 17:59 ` Tom Tromey
2009-08-10 19:38 ` Eli Zaretskii
2009-08-10 19:59 ` Tom Tromey
2009-08-10 20:10 ` Eli Zaretskii
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox