2002-04-24 Michael Snyder <msnyder@redhat.com>
[deliverable/binutils-gdb.git] / gdb / demangle.c
index 23ebcdea3788016460c54e0586b48336d8579315..1fd69be4c58f5c15327bc1881c7aa2ba758d66c7 100644 (file)
@@ -1,5 +1,6 @@
 /* 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
+   Free Software Foundation, Inc.
    Written by Fred Fish at Cygnus Support.
 
    This file is part of GDB.
@@ -49,6 +50,11 @@ 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 set_demangling_command (char *, int, struct cmd_list_element *);
 
 /* Set current demangling style.  Called by the "set demangle-style"
@@ -109,7 +115,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));
@@ -138,7 +144,7 @@ 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);
@@ -173,14 +179,28 @@ 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\
+  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);
+
+  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);
+                         &setlist);
   show = add_show_from_set (set, &showlist);
-  set->function.sfunc = set_demangling_command;
+  set_cmd_sfunc (set, set_demangling_command);
 
   /* Set the default demangling style chosen at compilation time. */
   set_demangling_style (DEFAULT_DEMANGLING_STYLE);
This page took 0.049859 seconds and 4 git commands to generate.