X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fcli%2Fcli-utils.h;h=43e810ffe0a98057fa0d17ed1220b484f15f33cf;hb=036003a671233c43e35b3004f91e4cbd61255cf3;hp=ace46b4b1915c091e0af36ddf1227593ac6c956f;hpb=618f726fcb851883a0094aa7fa17003889b7189f;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/cli/cli-utils.h b/gdb/cli/cli-utils.h index ace46b4b19..43e810ffe0 100644 --- a/gdb/cli/cli-utils.h +++ b/gdb/cli/cli-utils.h @@ -1,6 +1,6 @@ /* CLI utilities. - Copyright (C) 2011-2016 Free Software Foundation, Inc. + Copyright (C) 2011-2019 Free Software Foundation, Inc. This file is part of GDB. @@ -17,71 +17,133 @@ You should have received a copy of the GNU General Public License along with this program. If not, see . */ -#ifndef CLI_UTILS_H -#define CLI_UTILS_H +#ifndef CLI_CLI_UTILS_H +#define CLI_CLI_UTILS_H -/* *PP is a string denoting a number. Get the number of the. Advance - *PP after the string and any trailing whitespace. +#include "completer.h" - Currently the string can either be a number, or "$" followed by the - name of a convenience variable, or ("$" or "$$") followed by digits. */ +struct cmd_list_element; -extern int get_number_const (const char **); +/* *PP is a string denoting a number. Get the number. Advance *PP + after the string and any trailing whitespace. -/* Like get_number_const, but takes a non-const "char **". */ + The string can either be a number, or "$" followed by the name of a + convenience variable, or ("$" or "$$") followed by digits. -extern int get_number (char **); + TRAILER is a character which can be found after the number; most + commonly this is `-'. If you don't want a trailer, use \0. */ -/* An object of this type is passed to get_number_or_range. It must - be initialized by calling init_number_or_range. This type is - defined here so that it can be stack-allocated, but all members - other than `finished' and `string' should be treated as opaque. */ +extern int get_number_trailer (const char **pp, int trailer); -struct get_number_or_range_state -{ - /* Non-zero if parsing has completed. */ - int finished; +/* Convenience. Like get_number_trailer, but with no TRAILER. */ - /* The string being parsed. When parsing has finished, this points - past the last parsed token. */ - const char *string; +extern int get_number (const char **); - /* Last value returned. */ - int last_retval; +/* Like the above, but takes a non-const "char **". */ - /* When parsing a range, the final value in the range. */ - int end_value; +extern int get_number (char **); - /* When parsing a range, a pointer past the final token in the - range. */ - const char *end_ptr; +/* Like get_number_trailer, but works with ULONGEST, and throws on + error instead of returning 0. */ +extern ULONGEST get_ulongest (const char **pp, int trailer = '\0'); - /* Non-zero when parsing a range. */ - int in_range; -}; +/* Throws an error telling the user that ARGS starts with an option + unrecognized by COMMAND. */ -/* Initialize a get_number_or_range_state for use with - get_number_or_range_state. STRING is the string to be parsed. */ +extern void report_unrecognized_option_error (const char *command, + const char *args); -extern void init_number_or_range (struct get_number_or_range_state *state, - const char *string); + +/* Builds the help string for a command documented by PREFIX, + followed by the extract_info_print_args help for ENTITY_KIND. If + DOCUMENT_N_FLAG is true then help text describing the -n flag is also + included. */ + +const char *info_print_args_help (const char *prefix, + const char *entity_kind, + bool document_n_flag); /* 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 + A range will be of the form - , and will represent all the integers between number1 and number2, - inclusive. + inclusive. */ + +class number_or_range_parser +{ +public: + /* Default construction. Must call init before calling + get_next. */ + number_or_range_parser () {} + + /* Calls init automatically. */ + number_or_range_parser (const char *string); + + /* STRING is the string to be parsed. */ + void init (const char *string); + + /* While processing a range, this fuction is called iteratively; At + each call it will return the next value in the range. + + At the beginning of parsing a range, the char pointer + STATE->m_cur_tok will be advanced past and left + pointing at the '-' token. Subsequent calls will not advance the + pointer until the range is completed. The call that completes + the range will advance the pointer past . */ + int get_number (); + + /* Setup internal state such that get_next() returns numbers in the + START_VALUE to END_VALUE range. END_PTR is where the string is + advanced to when get_next() returns END_VALUE. */ + void setup_range (int start_value, int end_value, + const char *end_ptr); + + /* Returns true if parsing has completed. */ + bool finished () const; + + /* Return the string being parsed. When parsing has finished, this + points past the last parsed token. */ + const char *cur_tok () const + { return m_cur_tok; } + + /* True when parsing a range. */ + bool in_range () const + { return m_in_range; } + + /* When parsing a range, the final value in the range. */ + int end_value () const + { return m_end_value; } + + /* When parsing a range, skip past the final token in the range. */ + void skip_range () + { + gdb_assert (m_in_range); + m_cur_tok = m_end_ptr; + m_in_range = false; + } + +private: + /* No need for these. They are intentionally not defined anywhere. */ + number_or_range_parser (const number_or_range_parser &); + number_or_range_parser &operator= (const number_or_range_parser &); + + /* The string being parsed. When parsing has finished, this points + past the last parsed token. */ + const char *m_cur_tok; - While processing a range, this fuction is called iteratively; - At each call it will return the next value in the range. + /* Last value returned. */ + int m_last_retval; - At the beginning of parsing a range, the char pointer STATE->string will - be advanced past and left pointing at the '-' token. - Subsequent calls will not advance the pointer until the range - is completed. The call that completes the range will advance - the pointer past . */ + /* When parsing a range, the final value in the range. */ + int m_end_value; -extern int get_number_or_range (struct get_number_or_range_state *state); + /* When parsing a range, a pointer past the final token in the + range. */ + const char *m_end_ptr; + + /* True when parsing a range. */ + bool m_in_range; +}; /* Accept a number and a string-form list of numbers such as is accepted by get_number_or_range. Return TRUE if the number is @@ -96,25 +158,71 @@ extern int number_is_in_list (const char *list, int number); /* Reverse S to the last non-whitespace character without skipping past START. */ -extern char *remove_trailing_whitespace (const char *start, char *s); +extern const char *remove_trailing_whitespace (const char *start, + const char *s); -/* A helper function to extract an argument from *ARG. An argument is - delimited by whitespace. The return value is either NULL if no - argument was found, or an xmalloc'd string. */ +/* Same, for non-const S. */ + +static inline char * +remove_trailing_whitespace (const char *start, char *s) +{ + return (char *) remove_trailing_whitespace (start, (const char *) s); +} -extern char *extract_arg (char **arg); +/* A helper function to extract an argument from *ARG. An argument is + delimited by whitespace. The return value is empty if no argument + was found. */ -/* A const-correct version of "extract_arg". +extern std::string extract_arg (char **arg); - Since the returned value is xmalloc'd, it eventually needs to be - xfree'ed, which prevents us from making it const as well. */ +/* A const-correct version of the above. */ -extern char *extract_arg_const (const char **arg); +extern std::string extract_arg (const char **arg); /* A helper function that looks for an argument at the start of a string. The argument must also either be at the end of the string, or be followed by whitespace. Returns 1 if it finds the argument, - 0 otherwise. If the argument is found, it updates *STR. */ -extern int check_for_argument (char **str, char *arg, int arg_len); + 0 otherwise. If the argument is found, it updates *STR to point + past the argument and past any whitespace following the + argument. */ +extern int check_for_argument (const char **str, const char *arg, int arg_len); + +/* Same as above, but ARG's length is computed. */ + +static inline int +check_for_argument (const char **str, const char *arg) +{ + return check_for_argument (str, arg, strlen (arg)); +} + +/* Same, for non-const STR. */ + +static inline int +check_for_argument (char **str, const char *arg, int arg_len) +{ + return check_for_argument (const_cast (str), + arg, arg_len); +} + +static inline int +check_for_argument (char **str, const char *arg) +{ + return check_for_argument (str, arg, strlen (arg)); +} + +/* qcs_flags struct groups the -q, -c, and -s flags parsed by "thread + apply" and "frame apply" commands */ + +struct qcs_flags +{ + bool quiet = false; + bool cont = false; + bool silent = false; +}; + +/* Validate FLAGS. Throws an error if both FLAGS->CONT and + FLAGS->SILENT are true. WHICH_COMMAND is included in the error + message. */ +extern void validate_flags_qcs (const char *which_command, qcs_flags *flags); -#endif /* CLI_UTILS_H */ +#endif /* CLI_CLI_UTILS_H */