Re: FYI: fix PR gdb/8869

Pedro Alves
2009-08-08T16:17:31Z

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