Remove a static buffer from cp-name-parser.y
[deliverable/binutils-gdb.git] / gdb / cp-name-parser.y
index f522e464191574c878ff65dbfb7ed022a318a951..3e1c9d9e6f0f211f390df58dfcd6e782a055eb6d 100644 (file)
@@ -35,6 +35,7 @@
 #include "safe-ctype.h"
 #include "demangle.h"
 #include "cp-support.h"
+#include "c-support.h"
 
 /* Bison does not make it easy to create a parser without global
    state, unfortunately.  Here are all the global variables used
@@ -1304,28 +1305,6 @@ d_binary (const char *name, struct demangle_component *lhs, struct demangle_comp
                      fill_comp (DEMANGLE_COMPONENT_BINARY_ARGS, lhs, rhs));
 }
 
-/* Like ISALPHA, but also returns true for the union of all UTF-8
-   multi-byte sequence bytes and non-ASCII characters in
-   extended-ASCII charsets (e.g., Latin1).  I.e., returns true if the
-   high bit is set.  Note that not all UTF-8 ranges are allowed in C++
-   identifiers, but we don't need to be pedantic so for simplicity we
-   ignore that here.  Plus this avoids the complication of actually
-   knowing what was the right encoding.  */
-
-static inline bool
-cp_ident_is_alpha (unsigned char ch)
-{
-  return ISALPHA (ch) || ch >= 0x80;
-}
-
-/* Similarly, but Like ISALNUM.  */
-
-static inline bool
-cp_ident_is_alnum (unsigned char ch)
-{
-  return ISALNUM (ch) || ch >= 0x80;
-}
-
 /* Find the end of a symbol name starting at LEXPTR.  */
 
 static const char *
@@ -1333,7 +1312,7 @@ symbol_end (const char *lexptr)
 {
   const char *p = lexptr;
 
-  while (*p && (cp_ident_is_alnum (*p) || *p == '_' || *p == '$' || *p == '.'))
+  while (*p && (c_ident_is_alnum (*p) || *p == '_' || *p == '$' || *p == '.'))
     p++;
 
   return p;
@@ -1813,7 +1792,7 @@ yylex (void)
       return ERROR;
     }
 
-  if (!(c == '_' || c == '$' || cp_ident_is_alpha (c)))
+  if (!(c == '_' || c == '$' || c_ident_is_alpha (c)))
     {
       /* We must have come across a bad character (e.g. ';').  */
       yyerror (_("invalid character"));
@@ -1824,7 +1803,7 @@ yylex (void)
   namelen = 0;
   do
     c = tokstart[++namelen];
-  while (cp_ident_is_alnum (c) || c == '_' || c == '$');
+  while (c_ident_is_alnum (c) || c == '_' || c == '$');
 
   lexptr += namelen;
 
@@ -2054,13 +2033,12 @@ cp_merge_demangle_parse_infos (struct demangle_parse_info *dest,
 /* Convert a demangled name to a demangle_component tree.  On success,
    a structure containing the root of the new tree is returned.  On
    error, NULL is returned, and an error message will be set in
-   *ERRMSG (which does not need to be freed).  */
+   *ERRMSG.  */
 
 struct std::unique_ptr<demangle_parse_info>
-cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg)
+cp_demangled_name_to_comp (const char *demangled_name,
+                          std::string *errmsg)
 {
-  static char errbuf[60];
-
   prev_lexptr = lexptr = demangled_name;
   error_lexptr = NULL;
   global_errmsg = NULL;
@@ -2073,12 +2051,8 @@ cp_demangled_name_to_comp (const char *demangled_name, const char **errmsg)
   if (yyparse ())
     {
       if (global_errmsg && errmsg)
-       {
-         snprintf (errbuf, sizeof (errbuf) - 2, "%s, near `%s",
-                   global_errmsg, error_lexptr);
-         strcat (errbuf, "'");
-         *errmsg = errbuf;
-       }
+       *errmsg = string_printf ("%s, near `%s'", global_errmsg,
+                                error_lexptr);
       return NULL;
     }
 
@@ -2154,7 +2128,6 @@ main (int argc, char **argv)
   char *str2, *extra_chars, c;
   char buf[65536];
   int arg;
-  const char *errmsg;
 
   arg = 1;
   if (argv[arg] && strcmp (argv[arg], "--debug") == 0)
@@ -2181,11 +2154,12 @@ main (int argc, char **argv)
            continue;
          }
 
+       std::string errmsg;
        std::unique_ptr<demangle_parse_info> result
          = cp_demangled_name_to_comp (str2, &errmsg);
        if (result == NULL)
          {
-           fputs (errmsg, stderr);
+           fputs (errmsg.c_str (), stderr);
            fputc ('\n', stderr);
            continue;
          }
@@ -2202,11 +2176,12 @@ main (int argc, char **argv)
       }
   else
     {
+      std::string errmsg;
       std::unique_ptr<demangle_parse_info> result
        = cp_demangled_name_to_comp (argv[arg], &errmsg);
       if (result == NULL)
        {
-         fputs (errmsg, stderr);
+         fputs (errmsg.c_str (), stderr);
          fputc ('\n', stderr);
          return 0;
        }
This page took 0.028581 seconds and 4 git commands to generate.