Rotate GDB's main ChangeLog file
[deliverable/binutils-gdb.git] / gdb / demangle.c
index 0104d8f3f6e92a53fca907913b74ee9a0dc1273c..af306a5ea900ed29384a3ab491b0a3f4b3ec4546 100644 (file)
@@ -1,13 +1,15 @@
 /* Basic C++ demangling support for GDB.
-   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001
-   Free Software Foundation, Inc.
+
+   Copyright (C) 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000, 2001,
+   2003, 2007, 2008, 2009, 2010 Free Software Foundation, Inc.
+
    Written by Fred Fish at Cygnus Support.
 
    This file is part of GDB.
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -16,9 +18,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 
 /*  This file contains support code for C++ demangling that is common
@@ -54,6 +54,14 @@ static char *current_demangling_style_string;
    _initialize_demangler from libiberty_demanglers[] array.  */
 
 static const char **demangling_style_names;
+static void
+show_demangling_style_names(struct ui_file *file, int from_tty,
+                           struct cmd_list_element *c, const char *value)
+{
+  fprintf_filtered (file, _("The current C++ demangling style is \"%s\".\n"),
+                   value);
+}
+
 
 static void set_demangling_command (char *, int, struct cmd_list_element *);
 
@@ -87,8 +95,8 @@ set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c)
        dem->demangling_style != unknown_demangling; 
        dem++)
     {
-      if (STREQ (current_demangling_style_string,
-                dem->demangling_style_name))
+      if (strcmp (current_demangling_style_string,
+                 dem->demangling_style_name) == 0)
        {
          current_demangling_style = dem->demangling_style;
          break;
@@ -103,10 +111,10 @@ set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c)
     {
       if (*current_demangling_style_string != '\0')
        {
-         printf_unfiltered ("Unknown demangling style `%s'.\n",
+         printf_unfiltered (_("Unknown demangling style `%s'.\n"),
                             current_demangling_style_string);
        }
-      printf_unfiltered ("The currently understood settings are:\n\n");
+      printf_unfiltered (_("The currently understood settings are:\n\n"));
       for (dem = libiberty_demanglers; 
           dem->demangling_style != unknown_demangling; 
           dem++)
@@ -117,8 +125,7 @@ set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c)
            {
              xfree (current_demangling_style_string);
              current_demangling_style_string =
-               savestring (dem->demangling_style_name,
-                           strlen (dem->demangling_style_name));
+               xstrdup (dem->demangling_style_name);
            }
        }
       if (current_demangling_style == unknown_demangling)
@@ -128,10 +135,8 @@ set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c)
             one as the default. */
          current_demangling_style = libiberty_demanglers[0].demangling_style;
          current_demangling_style_string =
-           savestring (
-              libiberty_demanglers[0].demangling_style_name,
-             strlen (libiberty_demanglers[0].demangling_style_name));
-         warning ("`%s' style demangling chosen as the default.\n",
+           xstrdup (libiberty_demanglers[0].demangling_style_name);
+         warning (_("`%s' style demangling chosen as the default."),
                   current_demangling_style_string);
        }
     }
@@ -146,28 +151,22 @@ set_demangling_style (char *style)
     {
       xfree (current_demangling_style_string);
     }
-  current_demangling_style_string = savestring (style, strlen (style));
+  current_demangling_style_string = xstrdup (style);
   set_demangling_command ((char *) NULL, 0, (struct cmd_list_element *) NULL);
 }
 
-/* In order to allow a single demangler executable to demangle strings
-   using various common values of CPLUS_MARKER, as well as any specific
-   one set at compile time, we maintain a string containing all the
-   commonly used ones, and check to see if the marker we are looking for
-   is in that string.  CPLUS_MARKER is usually '$' on systems where the
-   assembler can deal with that.  Where the assembler can't, it's usually
-   '.' (but on many systems '.' is used for other things).  We put the
-   current defined CPLUS_MARKER first (which defaults to '$'), followed
-   by the next most common value, followed by an explicit '$' in case
-   the value of CPLUS_MARKER is not '$'.
-
-   We could avoid this if we could just get g++ to tell us what the actual
-   cplus marker character is as part of the debug information, perhaps by
-   ensuring that it is the character that terminates the gcc<n>_compiled
-   marker symbol (FIXME). */
-
-static char cplus_markers[] =
-{CPLUS_MARKER, '.', '$', '\0'};
+/* G++ uses a special character to indicate certain internal names.  Which
+   character it is depends on the platform:
+   - Usually '$' on systems where the assembler will accept that
+   - Usually '.' otherwise (this includes most sysv4-like systems and most
+     ELF targets)
+   - Occasionally '_' if neither of the above is usable
+
+   We check '$' first because it is the safest, and '.' often has another
+   meaning.  We don't currently try to handle '_' because the precise forms
+   of the names are different on those targets.  */
+
+static char cplus_markers[] = {'$', '.', '\0'};
 
 int
 is_cplus_marker (int c)
@@ -178,7 +177,6 @@ is_cplus_marker (int c)
 void
 _initialize_demangler (void)
 {
-  struct cmd_list_element *set, *show;
   int i, ndems;
 
   /* Fill the demangling_style_names[] array.  */
@@ -193,16 +191,20 @@ _initialize_demangler (void)
     demangling_style_names[i] =
       xstrdup (libiberty_demanglers[i].demangling_style_name);
 
-  set = add_set_enum_cmd ("demangle-style", class_support,
-                         demangling_style_names,
-                         (const char **) &current_demangling_style_string,
-                         "Set the current C++ demangling style.\n\
-Use `set demangle-style' without arguments for a list of demangling styles.",
-                         &setlist);
-  show = add_show_from_set (set, &showlist);
-  set->function.sfunc = set_demangling_command;
+  /* 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 **) &current_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);
-  set_cplus_marker_for_demangling (CPLUS_MARKER);
 }
This page took 0.027597 seconds and 4 git commands to generate.