From 0d4cad90ca7c4394a1799efaa79c784f84a18161 Mon Sep 17 00:00:00 2001 From: Philippe Waroquiers Date: Sun, 1 Jul 2018 22:46:41 +0200 Subject: [PATCH] New cli-utils.h/.c function extract_info_print_args 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 1f8e958..ea033a7 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 30ee445..7331599 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 fa7d02d..f591ba1 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 -- 2.7.4