#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
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 *
{
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;
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"));
namelen = 0;
do
c = tokstart[++namelen];
- while (cp_ident_is_alnum (c) || c == '_' || c == '$');
+ while (c_ident_is_alnum (c) || c == '_' || c == '$');
lexptr += namelen;
/* 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;
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;
}
char *str2, *extra_chars, c;
char buf[65536];
int arg;
- const char *errmsg;
arg = 1;
if (argv[arg] && strcmp (argv[arg], "--debug") == 0)
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;
}
}
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;
}