all remaining *.c *.h files from hp merge.
[deliverable/binutils-gdb.git] / gdb / demangle.c
index cdf7b40209b89c2079498599840b268543c38cdb..9c5e521d928a4c8d0f04ca5a30cc629bea89de8b 100644 (file)
@@ -1,5 +1,5 @@
 /* Basic C++ demangling support for GDB.
-   Copyright 1991, 1992 Free Software Foundation, Inc.
+   Copyright 1991, 1992, 1996 Free Software Foundation, Inc.
    Written by Fred Fish at Cygnus Support.
 
 This file is part of GDB.
@@ -16,7 +16,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., 675 Mass Ave, Cambridge, MA 02139, USA.  */
+Foundation, Inc., 59 Temple Place - Suite 330, Boston, MA 02111-1307, USA.  */
 
 
 /*  This file contains support code for C++ demangling that is common
@@ -26,12 +26,12 @@ Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.  */
 #include "command.h"
 #include "gdbcmd.h"
 #include "demangle.h"
-#include <string.h>
+#include "gdb_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
    the executable it has loaded.  It can be set to a specific style ("gnu",
-   "lucid", "arm", etc.) in which case gdb will never attempt to do auto
+   "lucid", "arm", "hp", etc.) in which case gdb will never attempt to do auto
    selection of the style unless you do an explicit "set demangle auto".
    To select one of these as the default, set DEFAULT_DEMANGLING_STYLE in
    the appropriate target configuration file. */
@@ -67,19 +67,17 @@ static const struct demangler
   {ARM_DEMANGLING_STYLE_STRING,
      arm_demangling,
      "ARM style demangling"},
+  {HP_DEMANGLING_STYLE_STRING,
+     hp_demangling,
+     "HP (aCC) style demangling"},
+  {EDG_DEMANGLING_STYLE_STRING,
+     edg_demangling,
+     "EDG style demangling"},
   {NULL, unknown_demangling, NULL}
 };
 
-/* show current demangling style. */
-
 static void
-show_demangling_command (ignore, from_tty)
-   char *ignore;
-   int from_tty;
-{
-  /* done automatically by show command. */
-}
-
+set_demangling_command PARAMS ((char *, int, struct cmd_list_element *));
 
 /* set current demangling style.  called by the "set demangling" command
    after it has updated the current_demangling_style_string to match
@@ -98,9 +96,10 @@ show_demangling_command (ignore, from_tty)
    a malloc'd string, even if it is a null-string. */
 
 static void
-set_demangling_command (ignore, from_tty)
-   char *ignore;
-   int from_tty;
+set_demangling_command (ignore, from_tty, c)
+     char *ignore;
+     int from_tty;
+     struct cmd_list_element *c;
 {
   const struct demangler *dem;
 
@@ -127,19 +126,20 @@ set_demangling_command (ignore, from_tty)
     {
       if (*current_demangling_style_string != '\0')
        {
-         printf ("Unknown demangling style `%s'.\n",
+         printf_unfiltered ("Unknown demangling style `%s'.\n",
                  current_demangling_style_string);
        }
-      printf ("The currently understood settings are:\n\n");
+      printf_unfiltered ("The currently understood settings are:\n\n");
       for (dem = demanglers; dem -> demangling_style_name != NULL; dem++)
        {
-         printf ("%-10s %s\n", dem -> demangling_style_name,
+         printf_unfiltered ("%-10s %s\n", dem -> demangling_style_name,
                  dem -> demangling_style_doc);
          if (dem -> demangling_style == current_demangling_style)
            {
              free (current_demangling_style_string);
              current_demangling_style_string =
-               strdup (dem -> demangling_style_name);
+               savestring (dem -> demangling_style_name,
+                           strlen (dem -> demangling_style_name));
            }
        }
       if (current_demangling_style == unknown_demangling)
@@ -149,7 +149,8 @@ set_demangling_command (ignore, from_tty)
             one as the default. */
          current_demangling_style = demanglers[0].demangling_style;
          current_demangling_style_string =
-           strdup (demanglers[0].demangling_style_name);
+           savestring (demanglers[0].demangling_style_name,
+                       strlen (demanglers[0].demangling_style_name));
          warning ("`%s' style demangling chosen as the default.\n",
                   current_demangling_style_string);
        }
@@ -166,8 +167,33 @@ set_demangling_style (style)
     {
       free (current_demangling_style_string);
     }
-  current_demangling_style_string = strdup (style);
-  set_demangling_command ((char *) NULL, 0);
+  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' };
+
+int
+is_cplus_marker (c)
+     int c;
+{
+  return c && strchr (cplus_markers, c) != NULL;
 }
 
 void
@@ -177,11 +203,11 @@ _initialize_demangler ()
 
    set = add_set_cmd ("demangle-style", class_support, var_string_noescape,
                      (char *) &current_demangling_style_string,
-                     "Set the current C++ demangling style.",
+                     "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.cfunc = set_demangling_command;
-   show -> function.cfunc = show_demangling_command;
+   set -> function.sfunc = set_demangling_command;
 
    /* Set the default demangling style chosen at compilation time. */
    set_demangling_style (DEFAULT_DEMANGLING_STYLE);
This page took 0.129161 seconds and 4 git commands to generate.