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:
Keith Seitz 2022-02-24 16:42:22 -08:00
parent 685c6a8637
commit 2f2c677e67
4 changed files with 81 additions and 84 deletions

View file

@ -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 ()