* as.h [NEED_DECLARATION_FFS] (ffs): Prototype and alphabetize.
[deliverable/binutils-gdb.git] / gdb / demangle.c
index 23ebcdea3788016460c54e0586b48336d8579315..7b081139a83a279c08789b8ad568472abb8d9420 100644 (file)
@@ -1,5 +1,8 @@
 /* Basic C++ demangling support for GDB.
-   Copyright 1991, 1992, 1996, 1999 Free Software Foundation, Inc.
+
+   Copyright 1991, 1992, 1993, 1994, 1995, 1996, 1998, 1999, 2000,
+   2001, 2003 Free Software Foundation, Inc.
+
    Written by Fred Fish at Cygnus Support.
 
    This file is part of GDB.
@@ -49,6 +52,19 @@ extern void _initialize_demangler (void);
 
 static char *current_demangling_style_string;
 
+/* The array of names of the known demanglyng styles.  Generated by
+   _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 *);
 
 /* Set current demangling style.  Called by the "set demangle-style"
@@ -81,8 +97,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;
@@ -97,10 +113,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++)
@@ -109,7 +125,7 @@ set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c)
                             dem->demangling_style_doc);
          if (dem->demangling_style == current_demangling_style)
            {
-             free (current_demangling_style_string);
+             xfree (current_demangling_style_string);
              current_demangling_style_string =
                savestring (dem->demangling_style_name,
                            strlen (dem->demangling_style_name));
@@ -125,7 +141,7 @@ set_demangling_command (char *ignore, int from_tty, struct cmd_list_element *c)
            savestring (
               libiberty_demanglers[0].demangling_style_name,
              strlen (libiberty_demanglers[0].demangling_style_name));
-         warning ("`%s' style demangling chosen as the default.\n",
+         warning (_("`%s' style demangling chosen as the default."),
                   current_demangling_style_string);
        }
     }
@@ -138,30 +154,24 @@ set_demangling_style (char *style)
 {
   if (current_demangling_style_string != NULL)
     {
-      free (current_demangling_style_string);
+      xfree (current_demangling_style_string);
     }
   current_demangling_style_string = savestring (style, strlen (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)
@@ -173,16 +183,34 @@ void
 _initialize_demangler (void)
 {
   struct cmd_list_element *set, *show;
-
-  set = add_set_cmd ("demangle-style", class_support, var_string_noescape,
-                    (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;
+  int i, ndems;
+
+  /* Fill the demangling_style_names[] array.  */
+  for (ndems = 0;
+       libiberty_demanglers[ndems].demangling_style != unknown_demangling; 
+       ndems++)
+    ;
+  demangling_style_names = xcalloc (ndems + 1, sizeof (char *));
+  for (i = 0;
+       libiberty_demanglers[i].demangling_style != unknown_demangling; 
+       i++)
+    demangling_style_names[i] =
+      xstrdup (libiberty_demanglers[i].demangling_style_name);
+
+  /* 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.026457 seconds and 4 git commands to generate.