From patchwork Sat Oct 27 12:44:14 2018 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Philippe Waroquiers X-Patchwork-Id: 29916 Received: (qmail 63949 invoked by alias); 27 Oct 2018 12:44:39 -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 63824 invoked by uid 89); 27 Oct 2018 12:44:39 -0000 Authentication-Results: sourceware.org; auth=none X-Spam-SWARE-Status: No, score=-26.5 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=*ARG X-HELO: mailsec112.isp.belgacom.be Received: from mailsec112.isp.belgacom.be (HELO mailsec112.isp.belgacom.be) (195.238.20.108) by sourceware.org (qpsmtpd/0.93/v0.84-503-g423c35a) with ESMTP; Sat, 27 Oct 2018 12:44:37 +0000 DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=skynet.be; i=@skynet.be; q=dns/txt; s=securemail; t=1540644276; x=1572180276; h=from:to:cc:subject:date:message-id:in-reply-to: references:mime-version:content-transfer-encoding; bh=c8Z8+BwvkcoCAMS6X5MQJzIGkIuQQriSLzrKx8cLOd0=; b=W539sJc9r8+48XF1j+0faC27VfXesB4FV8vqfT3dmuIdQKT+pOF0mmah WnhoW+GUVnSRtcGUhG6Mm50Gvt2dwg==; Received: from 110.212-243-81.adsl-dyn.isp.belgacom.be (HELO md.home) ([81.243.212.110]) by relay.skynet.be with ESMTP/TLS/DHE-RSA-AES128-GCM-SHA256; 27 Oct 2018 14:44:23 +0200 From: Philippe Waroquiers To: gdb-patches@sourceware.org Cc: Philippe Waroquiers Subject: [PUSHED 1/5] New cli-utils.h/.c function extract_info_print_args Date: Sat, 27 Oct 2018 14:44:14 +0200 Message-Id: <20181027124418.20394-2-philippe.waroquiers@skynet.be> In-Reply-To: <20181027124418.20394-1-philippe.waroquiers@skynet.be> References: <20181027124418.20394-1-philippe.waroquiers@skynet.be> MIME-Version: 1.0 X-IsSubscribed: yes New cli-utils.h/.c function extract_info_print_args factorizes the extraction of the args '[-q] [-t TYPEREGEXP] [NAMEREGEXP]'. New cli-utils.h/.c function report_unrecognized_option_error factorizes reporting an unknown option for a command. These functions will be used by the commands info [args|functions|locals|variables] As extract_info_print_args 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-10-27 Philippe Waroquiers * cli-utils.c (extract_arg_maybe_quoted): New function. (extract_info_print_args): New function. (info_print_args_help): New function. (report_unrecognized_option_error): New function. * cli-utils.h (extract_arg_maybe_quoted): New function. (extract_info_print_args): New function. (info_print_args_help): New function. (report_unrecognized_option_error): New function. --- gdb/ChangeLog | 11 ++++ gdb/cli/cli-utils.c | 129 ++++++++++++++++++++++++++++++++++++++++++++ gdb/cli/cli-utils.h | 30 +++++++++++ 3 files changed, 170 insertions(+) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 1f8e958c9a..ea033a798f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,14 @@ +2018-10-27 Philippe Waroquiers + + * cli-utils.c (extract_arg_maybe_quoted): New function. + (extract_info_print_args): New function. + (info_print_args_help): New function. + (report_unrecognized_option_error): New function. + * cli-utils.h (extract_arg_maybe_quoted): New function. + (extract_info_print_args): New function. + (info_print_args_help): New function. + (report_unrecognized_option_error): New function. + 2018-10-26 Tom Tromey * dwarf2read.c (recursively_compute_inclusions): Use std::vector. diff --git a/gdb/cli/cli-utils.c b/gdb/cli/cli-utils.c index 30ee4450f9..73315996ad 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 @@ -128,6 +130,70 @@ get_number (char **pp) /* See documentation in cli-utils.h. */ +bool +extract_info_print_args (const char **args, + bool *quiet, + std::string *regexp, + std::string *t_regexp) +{ + /* Check for NAMEREGEXP or -- NAMEREGEXP. */ + if (**args != '-' || check_for_argument (args, "--", 2)) + { + *args = skip_spaces (*args); + *regexp = *args; + *args = NULL; + return true; + } + + if (check_for_argument (args, "-t", 2)) + { + *t_regexp = extract_arg_maybe_quoted (args); + *args = skip_spaces (*args); + return true; + } + + if (check_for_argument (args, "-q", 2)) + { + *quiet = true; + *args = skip_spaces (*args); + return true; + } + + return false; +} + +/* See documentation in cli-utils.h. */ + +void +report_unrecognized_option_error (const char *command, const char *args) +{ + std::string option = extract_arg (&args); + + error (_("Unrecognized option '%s' to %s command. " + "Try \"help %s\"."), option.c_str (), + command, command); +} + +/* See documentation in cli-utils.h. */ + +const char * +info_print_args_help (const char *prefix, + const char *entity_kind) +{ + return xstrprintf (_("\ +%sIf NAMEREGEXP is provided, only prints the %s whose name\n\ +matches NAMEREGEXP.\n\ +If -t TYPEREGEXP is provided, only prints the %s 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 %s can be printed.\n\ +The flag -q disables the production of these headers and messages."), + prefix, entity_kind, entity_kind, entity_kind); +} + +/* See documentation in cli-utils.h. */ + number_or_range_parser::number_or_range_parser (const char *string) { init (string); @@ -283,6 +349,69 @@ 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) +{ + bool squote = false; + bool dquote = false; + bool bsquote = false; + std::string result; + const char *p = *arg; + + /* Find the start of the argument. */ + p = skip_spaces (p); + + /* Parse p similarly to gdb_argv buildargv function. */ + while (*p != '\0') + { + if (isspace (*p) && !squote && !dquote && !bsquote) + break; + else + { + if (bsquote) + { + bsquote = false; + result += *p; + } + else if (*p == '\\') + bsquote = true; + else if (squote) + { + if (*p == '\'') + squote = false; + else + result += *p; + } + else if (dquote) + { + if (*p == '"') + dquote = false; + else + result += *p; + } + else + { + if (*p == '\'') + squote = true; + else if (*p == '"') + dquote = true; + else + result += *p; + } + p++; + } + } + + *arg = p; + 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..f591ba14d6 100644 --- a/gdb/cli/cli-utils.h +++ b/gdb/cli/cli-utils.h @@ -39,6 +39,36 @@ extern int get_number (const char **); extern int get_number (char **); +/* Extract from ARGS the arguments [-q] [-t TYPEREGEXP] [--] NAMEREGEXP. + + The caller is responsible to initialize *QUIET to false, *REGEXP + and *T_REGEXP to "". + extract_info_print_args can then be called iteratively to search + for valid arguments, as part of a 'main parsing loop' searching for + -q/-t/-- arguments together with other flags and options. + + Returns true and updates *ARGS + one of *QUIET, *REGEXP, *T_REGEXP if + it finds a valid argument. + Returns false if no valid argument is found at the beginning of ARGS. */ + +extern bool extract_info_print_args (const char **args, + bool *quiet, + std::string *regexp, + std::string *t_regexp); + +/* Throws an error telling the user that ARGS starts with an option + unrecognized by COMMAND. */ + +extern void report_unrecognized_option_error (const char *command, + const char *args); + + +/* Builds the help string for a command documented by PREFIX, + followed by the extract_info_print_args help for ENTITY_KIND. */ + +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