Move find_toplevel_char to cp-support.[ch]
authorKeith Seitz <keiths@redhat.com>
Fri, 25 Feb 2022 00:42:22 +0000 (16:42 -0800)
committerKeith Seitz <keiths@redhat.com>
Fri, 25 Feb 2022 00:42:22 +0000 (16:42 -0800)
find_toplevel_char is being used more and more outside of linespec.c, so
this patch moves it into cp-support.[ch].

gdb/cp-support.c
gdb/cp-support.h
gdb/linespec.c
gdb/linespec.h

index 0be1a04852f9aa9b095526fdd75549102ea0477e..501d96d43cd96588de1c130ab06fd218ecd1bdd4 100644 (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 ()
index cd473a2c553a6e239843ecf0c1e9865266981768..4fbd53c892358100223045504e8f8d86b2486b12 100644 (file)
@@ -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 */
index 707a3a2586a2ce6d80e5d2f607119befacb78acd..4d41f74ab2fbb9ce4204eebaef962942474c58d4 100644 (file)
@@ -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.  */
index bf9b04008a8cf3d079c0e868d282a4c053e39b95..bb8975548a3c5e467706a5551fc5425f032ec451 100644 (file)
@@ -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.  */