From patchwork Sun Sep 23 21:42:05 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philippe Waroquiers X-Patchwork-Id: 29517 Received: (qmail 85929 invoked by alias); 23 Sep 2018 21:42:23 -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 85859 invoked by uid 89); 23 Sep 2018 21:42:23 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-25.2 required=5.0 tests=AWL, BAYES_00, GIT_PATCH_0, GIT_PATCH_1, GIT_PATCH_2, GIT_PATCH_3, RCVD_IN_DNSWL_LOW, SPF_PASS autolearn=ham version=3.3.2 spammy=similarly, 236 X-HELO: mailsec102.isp.belgacom.be Received: from mailsec102.isp.belgacom.be (HELO mailsec102.isp.belgacom.be) (195.238.20.98) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sun, 23 Sep 2018 21:42:21 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=skynet.be; i=@skynet.be; q=dns/txt; s=securemail; t=1537738941; x=1569274941; h=from:to:cc:subject:date:message-id:in-reply-to: references; bh=M7/gAnlJ2ImqJWECExLLBwHm7uwPxgiZxFCJowlbNPs=; b=FDLZAovSZ/+jWuPJ/y3q4+6VwBQrHGlqADom0Z2/2p3/8K16bvyAewfo eAzZpXvHAWWkbRsirW0jbnCcXsWy1w==; Received: from 148.211-243-81.adsl-dyn.isp.belgacom.be (HELO md.home) ([81.243.211.148]) by relay.skynet.be with ESMTP/TLS/DHE-RSA-AES128-GCM-SHA256; 23 Sep 2018 23:42:17 +0200 From: Philippe Waroquiers To: gdb-patches@sourceware.org Cc: Philippe Waroquiers Subject: [RFAv3 1/5] New cli-utils.h/.c function extract_info_print_args Date: Sun, 23 Sep 2018 23:42:05 +0200 Message-Id: <20180923214209.985-2-philippe.waroquiers@skynet.be> In-Reply-To: <20180923214209.985-1-philippe.waroquiers@skynet.be> References: <20180923214209.985-1-philippe.waroquiers@skynet.be> X-IsSubscribed: yes New cli-utils.h/.c function extract_info_print_args factorises the extraction of the args '[-q] [-t TYPEREGEXP] [NAMEREGEXP]'. This function will be used by the commands info [args|functions|locals|variables] As this function will be used for 'info functions|variables' which already have the NAMEREGEXP arg, it provides a backward compatible behaviour. cli-utils.c has a new static function extract_arg_maybe_quoted that extracts an argument, possibly quoted. The behaviour of this function is similar to the parsing done by gdb_argv. gdb/ChangeLog 2018-09-23 Philippe Waroquiers * cli-utils.c (extract_arg_maybe_quoted): New function. (extract_info_print_args): New function. (info_print_args_help): New function. * cli-utils.h (extract_arg_maybe_quoted): New function. (extract_info_print_args): New function. (info_print_args_help): New function. --- gdb/cli/cli-utils.c | 159 ++++++++++++++++++++++++++++++++++++++++++++ gdb/cli/cli-utils.h | 15 +++++ 2 files changed, 174 insertions(+) diff --git a/gdb/cli/cli-utils.c b/gdb/cli/cli-utils.c index 98b7414991..ea4b4b6f61 100644 --- a/gdb/cli/cli-utils.c +++ b/gdb/cli/cli-utils.c @@ -23,6 +23,8 @@ #include +static std::string extract_arg_maybe_quoted (const char **arg); + /* See documentation in cli-utils.h. */ int @@ -125,6 +127,84 @@ get_number (char **pp) return result; } +/* See documentation in cli-utils.h. */ + +void +extract_info_print_args (const char* command, + const char **args, + bool *quiet, + std::string *regexp, + std::string *t_regexp) +{ + *quiet = false; + *regexp = ""; + *t_regexp = ""; + + while (*args != NULL) + { + if (check_for_argument (args, "--", 2)) + { + *args = skip_spaces (*args); + break; + } + + if (check_for_argument (args, "-t", 2)) + { + *t_regexp = extract_arg_maybe_quoted (args); + *args = skip_spaces (*args); + continue; + } + + if (check_for_argument (args, "-q", 2)) + { + *quiet = true; + *args = skip_spaces (*args); + continue; + } + + if (**args != '-') + break; + + std::string option = extract_arg (args); + error (_("Unrecognized option '%s' to %s command. " + "Try \"help %s\"."), option.c_str (), + command, command); + } + + if (*args != NULL && **args != '\000') + *regexp = *args; + +} + +/* See documentation in cli-utils.h. */ + +const char* +info_print_args_help (const char* prefix, + const char* entity_kind) +{ + std::string h; + + h = prefix; + h += _("If NAMEREGEXP is provided, only prints the "); + h += entity_kind; + h +=_(" whose name\n\ +matches NAMEREGEXP.\n\ +If -t TYPEREGEXP is provided, only prints the "); + h += entity_kind; + h +=_(" whose type\n\ +matches TYPEREGEXP. Note that the matching is done with the type\n\ +printed by the 'whatis' command.\n\ +By default, the command might produce headers and/or messages indicating\n\ +why no "); + h += entity_kind; + h += _(" can be printed.\n\ +The flag -q disables the production of these headers and messages."); + + return xstrdup (h.c_str ()); +} + + + /* See documentation in cli-utils.h. */ number_or_range_parser::number_or_range_parser (const char *string) @@ -282,6 +362,85 @@ remove_trailing_whitespace (const char *start, const char *s) return s; } +/* A helper function to extract an argument from *ARG. An argument is + delimited by whitespace, but it can also be optionally quoted. + The quoting and special characters are handled similarly to + the parsing done by gdb_argv. + The return value is empty if no argument was found. */ + +static std::string +extract_arg_maybe_quoted (const char **arg) +{ + int squote = 0; + int dquote = 0; + int bsquote = 0; + std::string result = std::string (); + + /* Find the start of the argument. */ + *arg = skip_spaces (*arg); + + /* Parse *arg similarly to gdb_argv buildargv function. */ + while (**arg != '\0') + { + if (isspace (**arg) && !squote && !dquote && !bsquote) + { + break; + } + else + { + if (bsquote) + { + bsquote = 0; + result += **arg; + } + else if (**arg == '\\') + { + bsquote = 1; + } + else if (squote) + { + if (**arg == '\'') + { + squote = 0; + } + else + { + result += **arg; + } + } + else if (dquote) + { + if (**arg == '"') + { + dquote = 0; + } + else + { + result += **arg; + } + } + else + { + if (**arg == '\'') + { + squote = 1; + } + else if (**arg == '"') + { + dquote = 1; + } + else + { + result += **arg; + } + } + (*arg)++; + } + } + + return result; +} + /* See documentation in cli-utils.h. */ std::string diff --git a/gdb/cli/cli-utils.h b/gdb/cli/cli-utils.h index fa7d02d719..8ce8db1860 100644 --- a/gdb/cli/cli-utils.h +++ b/gdb/cli/cli-utils.h @@ -39,6 +39,21 @@ extern int get_number (const char **); extern int get_number (char **); +/* Extract from args the arguments [-q] [-t TYPEREGEXP] [--] NAMEREGEXP. + Only the above flags are accepted. Any other flag will raise an error. + COMMAND is used to produce the error message if an invalid flag is + given. */ +extern void extract_info_print_args (const char* command, + const char **args, + bool *quiet, + std::string *regexp, + std::string *t_regexp); + +/* Builds the help string for a command documented by PREFIX, + followed by the extract_info_print_args help for ENTITY_KIND. */ +extern const char* info_print_args_help (const char* prefix, + const char* entity_kind); + /* Parse a number or a range. A number will be of the form handled by get_number. A range will be of the form - , and