mirror of
https://sourceware.org/git/binutils-gdb.git
synced 2024-11-23 18:14:13 +08:00
Move find_toplevel_char to cp-support.[ch]
find_toplevel_char is being used more and more outside of linespec.c, so this patch moves it into cp-support.[ch].
This commit is contained in:
parent
685c6a8637
commit
2f2c677e67
@ -2199,6 +2199,80 @@ info_vtbl_command (const char *arg, int from_tty)
|
||||
cplus_print_vtable (value);
|
||||
}
|
||||
|
||||
/* See description in cp-support.h. */
|
||||
|
||||
const char *
|
||||
find_toplevel_char (const char *s, char c)
|
||||
{
|
||||
int quoted = 0; /* zero if we're not in quotes;
|
||||
'"' if we're in a double-quoted string;
|
||||
'\'' if we're in a single-quoted string. */
|
||||
int depth = 0; /* Number of unclosed parens we've seen. */
|
||||
const char *scan;
|
||||
|
||||
for (scan = s; *scan; scan++)
|
||||
{
|
||||
if (quoted)
|
||||
{
|
||||
if (*scan == quoted)
|
||||
quoted = 0;
|
||||
else if (*scan == '\\' && *(scan + 1))
|
||||
scan++;
|
||||
}
|
||||
else if (*scan == c && ! quoted && depth == 0)
|
||||
return scan;
|
||||
else if (*scan == '"' || *scan == '\'')
|
||||
quoted = *scan;
|
||||
else if (*scan == '(' || *scan == '<')
|
||||
depth++;
|
||||
else if ((*scan == ')' || *scan == '>') && depth > 0)
|
||||
depth--;
|
||||
else if (*scan == 'o' && !quoted && depth == 0)
|
||||
{
|
||||
/* Handle C++ operator names. */
|
||||
if (strncmp (scan, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0)
|
||||
{
|
||||
scan += CP_OPERATOR_LEN;
|
||||
if (*scan == c)
|
||||
return scan;
|
||||
while (ISSPACE (*scan))
|
||||
{
|
||||
++scan;
|
||||
if (*scan == c)
|
||||
return scan;
|
||||
}
|
||||
if (*scan == '\0')
|
||||
break;
|
||||
|
||||
switch (*scan)
|
||||
{
|
||||
/* Skip over one less than the appropriate number of
|
||||
characters: the for loop will skip over the last
|
||||
one. */
|
||||
case '<':
|
||||
if (scan[1] == '<')
|
||||
{
|
||||
scan++;
|
||||
if (*scan == c)
|
||||
return scan;
|
||||
}
|
||||
break;
|
||||
case '>':
|
||||
if (scan[1] == '>')
|
||||
{
|
||||
scan++;
|
||||
if (*scan == c)
|
||||
return scan;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
void _initialize_cp_support ();
|
||||
void
|
||||
_initialize_cp_support ()
|
||||
|
@ -190,4 +190,11 @@ extern struct cmd_list_element *maint_cplus_cmd_list;
|
||||
|
||||
gdb::unique_xmalloc_ptr<char> gdb_demangle (const char *name, int options);
|
||||
|
||||
/* Find an instance of the character C in the string S that is outside
|
||||
of all parenthesis pairs, single-quoted strings, and double-quoted
|
||||
strings. Also, ignore the char within a template name, like a ','
|
||||
within foo<int, int>. */
|
||||
|
||||
extern const char *find_toplevel_char (const char *s, char c);
|
||||
|
||||
#endif /* CP_SUPPORT_H */
|
||||
|
@ -1298,83 +1298,6 @@ find_methods (struct type *t, enum language t_lang, const char *name,
|
||||
superclasses->push_back (TYPE_BASECLASS (t, ibase));
|
||||
}
|
||||
|
||||
/* Find an instance of the character C in the string S that is outside
|
||||
of all parenthesis pairs, single-quoted strings, and double-quoted
|
||||
strings. Also, ignore the char within a template name, like a ','
|
||||
within foo<int, int>, while considering C++ operator</operator<<. */
|
||||
|
||||
const char *
|
||||
find_toplevel_char (const char *s, char c)
|
||||
{
|
||||
int quoted = 0; /* zero if we're not in quotes;
|
||||
'"' if we're in a double-quoted string;
|
||||
'\'' if we're in a single-quoted string. */
|
||||
int depth = 0; /* Number of unclosed parens we've seen. */
|
||||
const char *scan;
|
||||
|
||||
for (scan = s; *scan; scan++)
|
||||
{
|
||||
if (quoted)
|
||||
{
|
||||
if (*scan == quoted)
|
||||
quoted = 0;
|
||||
else if (*scan == '\\' && *(scan + 1))
|
||||
scan++;
|
||||
}
|
||||
else if (*scan == c && ! quoted && depth == 0)
|
||||
return scan;
|
||||
else if (*scan == '"' || *scan == '\'')
|
||||
quoted = *scan;
|
||||
else if (*scan == '(' || *scan == '<')
|
||||
depth++;
|
||||
else if ((*scan == ')' || *scan == '>') && depth > 0)
|
||||
depth--;
|
||||
else if (*scan == 'o' && !quoted && depth == 0)
|
||||
{
|
||||
/* Handle C++ operator names. */
|
||||
if (strncmp (scan, CP_OPERATOR_STR, CP_OPERATOR_LEN) == 0)
|
||||
{
|
||||
scan += CP_OPERATOR_LEN;
|
||||
if (*scan == c)
|
||||
return scan;
|
||||
while (isspace (*scan))
|
||||
{
|
||||
++scan;
|
||||
if (*scan == c)
|
||||
return scan;
|
||||
}
|
||||
if (*scan == '\0')
|
||||
break;
|
||||
|
||||
switch (*scan)
|
||||
{
|
||||
/* Skip over one less than the appropriate number of
|
||||
characters: the for loop will skip over the last
|
||||
one. */
|
||||
case '<':
|
||||
if (scan[1] == '<')
|
||||
{
|
||||
scan++;
|
||||
if (*scan == c)
|
||||
return scan;
|
||||
}
|
||||
break;
|
||||
case '>':
|
||||
if (scan[1] == '>')
|
||||
{
|
||||
scan++;
|
||||
if (*scan == c)
|
||||
return scan;
|
||||
}
|
||||
break;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
/* The string equivalent of find_toplevel_char. Returns a pointer
|
||||
to the location of NEEDLE in HAYSTACK, ignoring any occurrences
|
||||
inside "()" and "<>". Returns NULL if NEEDLE was not found. */
|
||||
|
@ -162,13 +162,6 @@ extern const char *get_gdb_linespec_parser_quote_characters (void);
|
||||
|
||||
extern int is_ada_operator (const char *string);
|
||||
|
||||
/* Find an instance of the character C in the string S that is outside
|
||||
of all parenthesis pairs, single-quoted strings, and double-quoted
|
||||
strings. Also, ignore the char within a template name, like a ','
|
||||
within foo<int, int>. */
|
||||
|
||||
extern const char *find_toplevel_char (const char *s, char c);
|
||||
|
||||
/* Find the end of the (first) linespec pointed to by *STRINGP.
|
||||
STRINGP will be advanced to this point. */
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user