From patchwork Fri Feb 2 18:36:40 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Keith Seitz X-Patchwork-Id: 25778 Received: (qmail 20371 invoked by alias); 2 Feb 2018 18:36:46 -0000 Mailing-List: contact gdb-patches-help@sourceware.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Subscribe: List-Archive: List-Post: List-Help: , Sender: gdb-patches-owner@sourceware.org Delivered-To: mailing list gdb-patches@sourceware.org Received: (qmail 20352 invoked by uid 89); 2 Feb 2018 18:36:46 -0000 Authentication-Results: sourceware.org; auth=none X-Virus-Found: No X-Spam-SWARE-Status: No, score=-26.9 required=5.0 tests=BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, SPF_HELO_PASS, T_RP_MATCHES_RCVD autolearn=ham version=3.3.2 spammy=needle, 5594 X-HELO: mx1.redhat.com Received: from mx1.redhat.com (HELO mx1.redhat.com) (209.132.183.28) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Fri, 02 Feb 2018 18:36:44 +0000 Received: from smtp.corp.redhat.com (int-mx02.intmail.prod.int.phx2.redhat.com [10.5.11.12]) (using TLSv1.2 with cipher AECDH-AES256-SHA (256/256 bits)) (No client certificate requested) by mx1.redhat.com (Postfix) with ESMTPS id 6B52C2821B for ; Fri, 2 Feb 2018 18:36:43 +0000 (UTC) Received: from theo.uglyboxes.com (ovpn04.gateway.prod.ext.phx2.redhat.com [10.5.9.4]) by smtp.corp.redhat.com (Postfix) with ESMTP id 3415E7CD67 for ; Fri, 2 Feb 2018 18:36:43 +0000 (UTC) From: Keith Seitz To: gdb-patches@sourceware.org Subject: [PATCH 1/3] Move find_toplevel_char to utils.[ch] Date: Fri, 2 Feb 2018 10:36:40 -0800 Message-Id: <20180202183642.4288-1-keiths@redhat.com> X-IsSubscribed: yes find_toplevel_char is being used more and more outside of linespec.c, so this patch moves it into utils.[ch]. gdb/ChangeLog: * linespec.c (find_toplevel_char): Moved to ... * utils.c (find_toplevel_char): ... here. * linespec.h (find_toplevel_char): Moved to ... * utils.h (find_toplevel_char): ... here. --- gdb/linespec.c | 77 ---------------------------------------------------------- gdb/linespec.h | 7 ------ gdb/utils.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++ gdb/utils.h | 7 ++++++ 4 files changed, 81 insertions(+), 84 deletions(-) diff --git a/gdb/linespec.c b/gdb/linespec.c index 1236b3f475..247b285b99 100644 --- a/gdb/linespec.c +++ b/gdb/linespec.c @@ -1277,83 +1277,6 @@ find_methods (struct type *t, enum language t_lang, const char *name, VEC_safe_push (typep, *superclasses, 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, while considering C++ operator') && 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. */ diff --git a/gdb/linespec.h b/gdb/linespec.h index eced085e3e..2649af9e4f 100644 --- a/gdb/linespec.h +++ b/gdb/linespec.h @@ -163,13 +163,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. */ - -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. */ diff --git a/gdb/utils.c b/gdb/utils.c index c531748fe4..0a072fee6b 100644 --- a/gdb/utils.c +++ b/gdb/utils.c @@ -3431,6 +3431,80 @@ strip_leading_path_elements (const char *path, int n) return p; } +/* See description in utils.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_utils (void) { diff --git a/gdb/utils.h b/gdb/utils.h index b234762929..c1195f65b5 100644 --- a/gdb/utils.h +++ b/gdb/utils.h @@ -559,4 +559,11 @@ extern void dump_core (void); extern char *make_hex_string (const gdb_byte *data, size_t length); +/* 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. */ + +extern const char *find_toplevel_char (const char *s, char c); + #endif /* UTILS_H */