Remove a static buffer from cp-name-parser.y
[deliverable/binutils-gdb.git] / gdb / cp-name-parser.y
index 33ecf13794b8057b4530ca32f20fc8586d49f917..3e1c9d9e6f0f211f390df58dfcd6e782a055eb6d 100644 (file)
@@ -1,6 +1,6 @@
 /* YACC parser for C++ names, for GDB.
 
-   Copyright (C) 2003-2017 Free Software Foundation, Inc.
+   Copyright (C) 2003-2018 Free Software Foundation, Inc.
 
    Parts of the lexer are based on c-exp.y from GDB.
 
@@ -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
@@ -1311,7 +1312,7 @@ symbol_end (const char *lexptr)
 {
   const char *p = lexptr;
 
-  while (*p && (ISALNUM (*p) || *p == '_' || *p == '$' || *p == '.'))
+  while (*p && (c_ident_is_alnum (*p) || *p == '_' || *p == '$' || *p == '.'))
     p++;
 
   return p;
@@ -1646,7 +1647,7 @@ yylex (void)
          lexptr++;
          return '-';
        }
-      /* FALL THRU into number case.  */
+      /* FALL THRU.  */
 
     try_number:
     case '0':
@@ -1791,7 +1792,7 @@ yylex (void)
       return ERROR;
     }
 
-  if (!(c == '_' || c == '$' || ISALPHA (c)))
+  if (!(c == '_' || c == '$' || c_ident_is_alpha (c)))
     {
       /* We must have come across a bad character (e.g. ';').  */
       yyerror (_("invalid character"));
@@ -1802,7 +1803,7 @@ yylex (void)
   namelen = 0;
   do
     c = tokstart[++namelen];
-  while (ISALNUM (c) || c == '_' || c == '$');
+  while (c_ident_is_alnum (c) || c == '_' || c == '$');
 
   lexptr += namelen;
 
@@ -2032,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;
@@ -2051,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;
     }
 
@@ -2132,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)
@@ -2159,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;
          }
@@ -2180,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.026913 seconds and 4 git commands to generate.