Index: gdb/demangle.c |
diff --git a/gdb/demangle.c b/gdb/demangle.c |
index fa6f4a635d62a557a3a368ff486928b3151211b8..2d4b0c5181569240a6874f1c3629679ea7e4efff 100644 |
--- a/gdb/demangle.c |
+++ b/gdb/demangle.c |
@@ -1,7 +1,6 @@ |
/* Basic C++ demangling support for GDB. |
- Copyright (C) 1991-1996, 1998-2001, 2003, 2007-2012 Free Software |
- Foundation, Inc. |
+ Copyright (C) 1991-2013 Free Software Foundation, Inc. |
Written by Fred Fish at Cygnus Support. |
@@ -29,7 +28,7 @@ |
#include "gdbcmd.h" |
#include "demangle.h" |
#include "gdb-demangle.h" |
-#include "gdb_string.h" |
+#include <string.h> |
/* Select the default C++ demangling style to use. The default is "auto", |
which allows gdb to attempt to pick an appropriate demangling style for |
@@ -73,7 +72,7 @@ show_asm_demangle (struct ui_file *file, int from_tty, |
"set demangle-style" command, printed as part of the output by the |
"show demangle-style" command. */ |
-static char *current_demangling_style_string; |
+static const char *current_demangling_style_string; |
/* The array of names of the known demanglyng styles. Generated by |
_initialize_demangler from libiberty_demanglers[] array. */ |
@@ -107,13 +106,14 @@ static void |
set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c) |
{ |
const struct demangler_engine *dem; |
+ int i; |
/* First just try to match whatever style name the user supplied with |
one of the known ones. Don't bother special casing for an empty |
name, we just treat it as any other style name that doesn't match. |
If we match, update the current demangling style enum. */ |
- for (dem = libiberty_demanglers; |
+ for (dem = libiberty_demanglers, i = 0; |
dem->demangling_style != unknown_demangling; |
dem++) |
{ |
@@ -121,60 +121,15 @@ set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c) |
dem->demangling_style_name) == 0) |
{ |
current_demangling_style = dem->demangling_style; |
+ current_demangling_style_string = demangling_style_names[i]; |
break; |
} |
+ i++; |
} |
- /* Check to see if we found a match. If not, gripe about any non-empty |
- style name and supply a list of valid ones. FIXME: This should |
- probably be done with some sort of completion and with help. */ |
- |
- if (dem->demangling_style == unknown_demangling) |
- { |
- if (*current_demangling_style_string != '\0') |
- { |
- printf_unfiltered (_("Unknown demangling style `%s'.\n"), |
- current_demangling_style_string); |
- } |
- printf_unfiltered (_("The currently understood settings are:\n\n")); |
- for (dem = libiberty_demanglers; |
- dem->demangling_style != unknown_demangling; |
- dem++) |
- { |
- printf_unfiltered ("%-10s %s\n", dem->demangling_style_name, |
- dem->demangling_style_doc); |
- if (dem->demangling_style == current_demangling_style) |
- { |
- xfree (current_demangling_style_string); |
- current_demangling_style_string = |
- xstrdup (dem->demangling_style_name); |
- } |
- } |
- if (current_demangling_style == unknown_demangling) |
- { |
- /* This can happen during initialization if gdb is compiled with |
- a DEMANGLING_STYLE value that is unknown, so pick the first |
- one as the default. */ |
- current_demangling_style = libiberty_demanglers[0].demangling_style; |
- current_demangling_style_string = |
- xstrdup (libiberty_demanglers[0].demangling_style_name); |
- warning (_("`%s' style demangling chosen as the default."), |
- current_demangling_style_string); |
- } |
- } |
-} |
- |
-/* See documentation in gdb-demangle.h. */ |
- |
-void |
-set_demangling_style (char *style) |
-{ |
- if (current_demangling_style_string != NULL) |
- { |
- xfree (current_demangling_style_string); |
- } |
- current_demangling_style_string = xstrdup (style); |
- set_demangling_command ((char *) NULL, 0, (struct cmd_list_element *) NULL); |
+ /* We should have found a match, given we only add known styles to |
+ the enumeration list. */ |
+ gdb_assert (dem->demangling_style != unknown_demangling); |
} |
/* G++ uses a special character to indicate certain internal names. Which |
@@ -205,7 +160,8 @@ _initialize_demangler (void) |
{ |
int i, ndems; |
- /* Fill the demangling_style_names[] array. */ |
+ /* Fill the demangling_style_names[] array, and set the default |
+ demangling style chosen at compilation time. */ |
for (ndems = 0; |
libiberty_demanglers[ndems].demangling_style != unknown_demangling; |
ndems++) |
@@ -214,8 +170,14 @@ _initialize_demangler (void) |
for (i = 0; |
libiberty_demanglers[i].demangling_style != unknown_demangling; |
i++) |
- demangling_style_names[i] = |
- xstrdup (libiberty_demanglers[i].demangling_style_name); |
+ { |
+ demangling_style_names[i] |
+ = xstrdup (libiberty_demanglers[i].demangling_style_name); |
+ |
+ if (current_demangling_style_string == NULL |
+ && strcmp (DEFAULT_DEMANGLING_STYLE, demangling_style_names[i]) == 0) |
+ current_demangling_style_string = demangling_style_names[i]; |
+ } |
add_setshow_boolean_cmd ("demangle", class_support, &demangle, _("\ |
Set demangling of encoded C++/ObjC names when displaying symbols."), _("\ |
@@ -231,20 +193,13 @@ Show demangling of C++/ObjC names in disassembly listings."), NULL, |
show_asm_demangle, |
&setprintlist, &showprintlist); |
- /* FIXME: cagney/2005-02-20: The code implementing this variable are |
- malloc-ing and free-ing current_demangling_style_string when it |
- should instead just point to an element of |
- demangling_style_names. */ |
add_setshow_enum_cmd ("demangle-style", class_support, |
demangling_style_names, |
- (const char **) ¤t_demangling_style_string, _("\ |
+ ¤t_demangling_style_string, _("\ |
Set the current C++ demangling style."), _("\ |
Show the current C++ demangling style."), _("\ |
Use `set demangle-style' without arguments for a list of demangling styles."), |
set_demangling_command, |
show_demangling_style_names, |
&setlist, &showlist); |
- |
- /* Set the default demangling style chosen at compilation time. */ |
- set_demangling_style (DEFAULT_DEMANGLING_STYLE); |
} |