2003-11-22 Jakub Jelinek <jakub@redhat.com>
[binutils-gdb.git] / libiberty / cplus-dem.c
index f42d6181d403b2e06a4d180d769a5a3003c9fc54..5e2e7a7126c1321190b959164ebf8f07cf3b3d50 100644 (file)
@@ -11,6 +11,15 @@ modify it under the terms of the GNU Library General Public
 License as published by the Free Software Foundation; either
 version 2 of the License, or (at your option) any later version.
 
+In addition to the permissions in the GNU Library General Public
+License, the Free Software Foundation gives you unlimited permission
+to link the compiled version of this file into combinations with other
+programs, and to distribute those combinations without any restriction
+coming from the use of this file.  (The Library Public License
+restrictions do apply in other respects; for example, they cover
+modification of the file, and distribution when not linked into a
+combined executable.)
+
 Libiberty is distributed in the hope that it will be useful,
 but WITHOUT ANY WARRANTY; without even the implied warranty of
 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
@@ -1064,7 +1073,7 @@ ada_demangle (mangled, option)
 /* This function performs most of what cplus_demangle use to do, but
    to be able to demangle a name with a B, K or n code, we need to
    have a longer term memory of what types have been seen. The original
-   now intializes and cleans up the squangle code info, while internal
+   now initializes and cleans up the squangle code info, while internal
    calls go directly to this routine to avoid resetting that info. */
 
 static char *
@@ -1429,6 +1438,7 @@ demangle_signature (work, mangled, declp)
              {
                string_append (&s, SCOPE_STRING (work));
                string_prepends (declp, &s);
+               string_delete (&s);
              }
            oldmangled = NULL;
            expect_func = 1;
@@ -1508,7 +1518,6 @@ demangle_signature (work, mangled, declp)
            {
              /* Read the return type. */
              string return_type;
-             string_init (&return_type);
 
              (*mangled)++;
              success = do_type (work, mangled, &return_type);
@@ -1788,31 +1797,34 @@ demangle_integral_value (work, mangled, s)
 
       success = 0;
 
-      /* Negative numbers are indicated with a leading `m'.  */
-      if (**mangled == 'm')
-       {
-         string_appendn (s, "-", 1);
-         (*mangled)++;
-       }
-      else if (mangled[0][0] == '_' && mangled[0][1] == 'm')
-       {
-         /* Since consume_count_with_underscores does not handle the
-            `m'-prefix we must do it here, using consume_count and
-            adjusting underscores: we have to consume the underscore
-            matching the prepended one.  */
-         multidigit_without_leading_underscore = 1;
-         string_appendn (s, "-", 1);
-         (*mangled) += 2;
-       }
-      else if (**mangled == '_')
-       {
-         /* Do not consume a following underscore;
-            multidigit_without_leading_underscore will consume what should be
-            consumed.  */
-         leave_following_underscore = 1;
+      if (**mangled == '_')
+        {
+         if (mangled[0][1] == 'm')
+           {
+             /* Since consume_count_with_underscores does not handle the
+                `m'-prefix we must do it here, using consume_count and
+                adjusting underscores: we have to consume the underscore
+                matching the prepended one.  */
+             multidigit_without_leading_underscore = 1;
+             string_appendn (s, "-", 1);
+             (*mangled) += 2;
+           }
+         else
+           {
+             /* Do not consume a following underscore;
+                consume_count_with_underscores will consume what
+                should be consumed.  */
+             leave_following_underscore = 1;
+           }
        }
       else
        {
+         /* Negative numbers are indicated with a leading `m'.  */
+         if (**mangled == 'm')
+         {
+           string_appendn (s, "-", 1);
+           (*mangled)++;
+         }
          /* Since consume_count_with_underscores does not handle
             multi-digit numbers that do not start with an underscore,
             and this number can be an integer template parameter,
@@ -1853,7 +1865,7 @@ demangle_integral_value (work, mangled, s)
          /* All is well.  */
          success = 1;
        }
-    }
+      }
 
   return success;
 }
@@ -2031,13 +2043,10 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
   const char *start;
   int is_java_array = 0;
   string temp;
-  int bindex = 0;
 
   (*mangled)++;
   if (is_type)
     {
-      if (remember)
-       bindex = register_Btype (work);
       start = *mangled;
       /* get template name */
       if (**mangled == 'z')
@@ -2214,7 +2223,10 @@ demangle_template (work, mangled, tname, trawname, is_type, remember)
     }
 
   if (is_type && remember)
-    remember_Btype (work, tname->b, LEN_STRING (tname), bindex);
+    {
+      const int bindex = register_Btype (work);
+      remember_Btype (work, tname->b, LEN_STRING (tname), bindex);
+    }
 
   /*
     if (work -> static_type)
@@ -2321,7 +2333,7 @@ demangle_arm_hp_template (work, mangled, n, declp)
       string_append (declp, "<");
       while (1)
         {
-          string_clear (&arg);
+          string_delete (&arg);
           switch (**mangled)
             {
               case 'T':
@@ -2378,7 +2390,7 @@ demangle_arm_hp_template (work, mangled, n, declp)
       string_append (declp, "<");
       /* should do error checking here */
       while (args < e) {
-       string_clear (&arg);
+       string_delete (&arg);
 
        /* Check for type or literal here */
        switch (*args)
@@ -2393,6 +2405,7 @@ demangle_arm_hp_template (work, mangled, n, declp)
              goto cfront_template_args_done;
             string_append (&arg, "(");
             string_appends (&arg, &type_str);
+            string_delete (&type_str);
             string_append (&arg, ")");
             if (*args != 'L')
               goto cfront_template_args_done;
@@ -3350,6 +3363,7 @@ demangle_qualified (work, mangled, result, isfuncname, append)
             }
           else
             {
+              string_delete (&last_name);
               success = do_type (work, mangled, &last_name);
               if (!success)
                 break;
@@ -3492,10 +3506,8 @@ do_type (work, mangled, result)
   string decl;
   const char *remembered_type;
   int type_quals;
-  string btype;
   type_kind_t tk = tk_none;
 
-  string_init (&btype);
   string_init (&decl);
   string_init (result);
 
@@ -3613,6 +3625,7 @@ do_type (work, mangled, result)
                string temp;
                do_type (work, mangled, &temp);
                string_prepends (&decl, &temp);
+               string_delete (&temp);
              }
            else if (**mangled == 't')
              {
@@ -3623,7 +3636,7 @@ do_type (work, mangled, result)
                if (success)
                  {
                    string_prependn (&decl, temp.b, temp.p - temp.b);
-                   string_clear (&temp);
+                   string_delete (&temp);
                  }
                else
                  break;
@@ -3803,11 +3816,8 @@ demangle_fund_type (work, mangled, result)
   int success = 1;
   char buf[10];
   unsigned int dec = 0;
-  string btype;
   type_kind_t tk = tk_integral;
 
-  string_init (&btype);
-
   /* First pick off any type qualifiers.  There can be more than one.  */
 
   while (!done)
@@ -3979,8 +3989,11 @@ demangle_fund_type (work, mangled, result)
       }
     case 't':
       {
+        string btype;
+        string_init (&btype);
         success = demangle_template (work, mangled, &btype, 0, 1, 1);
         string_appends (result, &btype);
+        string_delete (&btype);
         break;
       }
     default:
@@ -4182,12 +4195,9 @@ do_arg (work, mangled, result)
      do not want to add additional types to the back-referenceable
      type vector when processing a repeated type.  */
   if (work->previous_argument)
-    string_clear (work->previous_argument);
+    string_delete (work->previous_argument);
   else
-    {
-      work->previous_argument = (string*) xmalloc (sizeof (string));
-      string_init (work->previous_argument);
-    }
+    work->previous_argument = (string*) xmalloc (sizeof (string));
 
   if (!do_type (work, mangled, work->previous_argument))
     return 0;
@@ -4551,7 +4561,10 @@ demangle_nested_args (work, mangled, declp)
 
   /* Restore the previous_argument field.  */
   if (work->previous_argument)
-    string_delete (work->previous_argument);
+    {
+      string_delete (work->previous_argument);
+      free ((char *) work->previous_argument);
+    }
   work->previous_argument = saved_previous_argument;
   --work->forgetting_types;
   work->nrepeats = saved_nrepeats;