diff options
author | Tom Tromey <tromey@redhat.com> | 2011-02-21 18:13:17 +0000 |
---|---|---|
committer | Tom Tromey <tromey@redhat.com> | 2011-02-21 18:13:17 +0000 |
commit | e9cafbccd26b045ba6a3db2fde83dd33228e473b (patch) | |
tree | 2ff85b840a2849b1564202ebac2e3d2f17b541ce /gdb/cli | |
parent | f67fd822d03bd263034b549d89d98e98356ff194 (diff) | |
download | gdb-e9cafbccd26b045ba6a3db2fde83dd33228e473b.zip gdb-e9cafbccd26b045ba6a3db2fde83dd33228e473b.tar.gz gdb-e9cafbccd26b045ba6a3db2fde83dd33228e473b.tar.bz2 |
* reverse.c: Include cli-utils.h.
* printcmd.c: Include cli-utils.h.
(string_printf): Use skip_spaces.
* cli/cli-utils.h: New file.
* cli/cli-utils.c: New file.
* cli/cli-dump.h (skip_spaces): Move to cli-utils.h.
* cli/cli-dump.c (skip_spaces): Move to cli-utils.c.
* breakpoint.h (get_number, get_number_or_range): Move to
cli-utils.h.
* breakpoint.c: Include cli-utils.h.
(get_number_trailer, get_number, get_number_or_range)
(ep_skip_leading_whitespace): Move to cli-utils.c.
(create_breakpoint_sal, find_condition_and_thread)
(decode_static_tracepoint_spec, watch_command_1)
(watch_maybe_just_location, ep_parse_optional_if_clause)
(catch_fork_command_1, catch_exec_command_1)
(catch_syscall_command_1): Use skip_spaces, skip_to_space.
* Makefile.in (SUBDIR_CLI_OBS): Add cli-utils.o.
(SUBDIR_CLI_SRCS): Add cli-utils.c.
(HFILES_NO_SRCDIR): Add cli-utils.h.
(cli-utils.o): New target.
Diffstat (limited to 'gdb/cli')
-rw-r--r-- | gdb/cli/cli-dump.c | 11 | ||||
-rw-r--r-- | gdb/cli/cli-dump.h | 2 | ||||
-rw-r--r-- | gdb/cli/cli-utils.c | 186 | ||||
-rw-r--r-- | gdb/cli/cli-utils.h | 58 |
4 files changed, 245 insertions, 12 deletions
diff --git a/gdb/cli/cli-dump.c b/gdb/cli/cli-dump.c index 95c1b34..e288ee6 100644 --- a/gdb/cli/cli-dump.c +++ b/gdb/cli/cli-dump.c @@ -32,21 +32,12 @@ #include "target.h" #include "readline/readline.h" #include "gdbcore.h" +#include "cli/cli-utils.h" #define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE))) char * -skip_spaces (char *chp) -{ - if (chp == NULL) - return NULL; - while (isspace (*chp)) - chp++; - return chp; -} - -char * scan_expression_with_cleanup (char **cmd, const char *def) { if ((*cmd) == NULL || (**cmd) == '\0') diff --git a/gdb/cli/cli-dump.h b/gdb/cli/cli-dump.h index f4eae6c..384aa48 100644 --- a/gdb/cli/cli-dump.h +++ b/gdb/cli/cli-dump.h @@ -32,6 +32,4 @@ extern char *scan_expression_with_cleanup (char **cmd, const char *defname); extern FILE *fopen_with_cleanup (const char *filename, const char *mode); -extern char *skip_spaces (char *inp); - #endif diff --git a/gdb/cli/cli-utils.c b/gdb/cli/cli-utils.c new file mode 100644 index 0000000..0c98ca9 --- /dev/null +++ b/gdb/cli/cli-utils.c @@ -0,0 +1,186 @@ +/* CLI utilities. + + Copyright (c) 2011 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#include "defs.h" +#include "cli/cli-utils.h" +#include "gdb_string.h" +#include "value.h" + +#include <ctype.h> + +/* *PP is a string denoting a number. Get the number of the. Advance + *PP after the string and any trailing whitespace. + + Currently the string can either be a number or "$" followed by the + name of a convenience variable. + + TRAILER is a character which can be found after the number; most + commonly this is `-'. If you don't want a trailer, use \0. */ + +static int +get_number_trailer (char **pp, int trailer) +{ + int retval = 0; /* default */ + char *p = *pp; + + if (*p == '$') + { + /* Make a copy of the name, so we can null-terminate it + to pass to lookup_internalvar(). */ + char *varname; + char *start = ++p; + LONGEST val; + + while (isalnum (*p) || *p == '_') + p++; + varname = (char *) alloca (p - start + 1); + strncpy (varname, start, p - start); + varname[p - start] = '\0'; + if (get_internalvar_integer (lookup_internalvar (varname), &val)) + retval = (int) val; + else + { + printf_filtered (_("Convenience variable must " + "have integer value.\n")); + retval = 0; + } + } + else + { + if (*p == '-') + ++p; + while (*p >= '0' && *p <= '9') + ++p; + if (p == *pp) + /* There is no number here. (e.g. "cond a == b"). */ + { + /* Skip non-numeric token. */ + while (*p && !isspace((int) *p)) + ++p; + /* Return zero, which caller must interpret as error. */ + retval = 0; + } + else + retval = atoi (*pp); + } + if (!(isspace (*p) || *p == '\0' || *p == trailer)) + { + /* Trailing junk: return 0 and let caller print error msg. */ + while (!(isspace (*p) || *p == '\0' || *p == trailer)) + ++p; + retval = 0; + } + p = skip_spaces (p); + *pp = p; + return retval; +} + +/* See documentation in cli-utils.h. */ + +int +get_number (char **pp) +{ + return get_number_trailer (pp, '\0'); +} + +/* See documentation in cli-utils.h. */ + +int +get_number_or_range (char **pp) +{ + static int last_retval, end_value; + static char *end_ptr; + static int in_range = 0; + + if (**pp != '-') + { + /* Default case: pp is pointing either to a solo number, + or to the first number of a range. */ + last_retval = get_number_trailer (pp, '-'); + if (**pp == '-') + { + char **temp; + + /* This is the start of a range (<number1> - <number2>). + Skip the '-', parse and remember the second number, + and also remember the end of the final token. */ + + temp = &end_ptr; + end_ptr = *pp + 1; + while (isspace ((int) *end_ptr)) + end_ptr++; /* skip white space */ + end_value = get_number (temp); + if (end_value < last_retval) + { + error (_("inverted range")); + } + else if (end_value == last_retval) + { + /* Degenerate range (number1 == number2). Advance the + token pointer so that the range will be treated as a + single number. */ + *pp = end_ptr; + } + else + in_range = 1; + } + } + else if (! in_range) + error (_("negative value")); + else + { + /* pp points to the '-' that betokens a range. All + number-parsing has already been done. Return the next + integer value (one greater than the saved previous value). + Do not advance the token pointer 'pp' until the end of range + is reached. */ + + if (++last_retval == end_value) + { + /* End of range reached; advance token pointer. */ + *pp = end_ptr; + in_range = 0; + } + } + return last_retval; +} + +/* See documentation in cli-utils.h. */ + +char * +skip_spaces (char *chp) +{ + if (chp == NULL) + return NULL; + while (*chp && isspace (*chp)) + chp++; + return chp; +} + +/* See documentation in cli-utils.h. */ + +char * +skip_to_space (char *chp) +{ + if (chp == NULL) + return NULL; + while (*chp && !isspace (*chp)) + chp++; + return chp; +} diff --git a/gdb/cli/cli-utils.h b/gdb/cli/cli-utils.h new file mode 100644 index 0000000..e79b82e --- /dev/null +++ b/gdb/cli/cli-utils.h @@ -0,0 +1,58 @@ +/* CLI utilities. + + Copyright (c) 2011 Free Software Foundation, Inc. + + This file is part of GDB. + + This program is free software; you can redistribute it and/or modify + it under the terms of the GNU General Public License as published by + the Free Software Foundation; either version 3 of the License, or + (at your option) any later version. + + This program is distributed in the hope that it will be useful, + but WITHOUT ANY WARRANTY; without even the implied warranty of + MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + GNU General Public License for more details. + + You should have received a copy of the GNU General Public License + along with this program. If not, see <http://www.gnu.org/licenses/>. */ + +#ifndef CLI_UTILS_H +#define CLI_UTILS_H + +/* *PP is a string denoting a number. Get the number of the. Advance + *PP after the string and any trailing whitespace. + + Currently the string can either be a number or "$" followed by the + name of a convenience variable. */ + +extern int get_number (char **); + +/* Parse a number or a range. + A number will be of the form handled by get_number. + A range will be of the form <number1> - <number2>, and + will represent all the integers between number1 and number2, + inclusive. + + 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 PP will + be advanced past <number1> 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 + pointer PP past <number2>. */ + +extern int get_number_or_range (char **); + +/* Skip leading whitespace characters in INP, returning an updated + pointer. If INP is NULL, return NULL. */ + +extern char *skip_spaces (char *inp); + +/* Skip leading non-whitespace characters in INP, returning an updated + pointer. If INP is NULL, return NULL. */ + +extern char *skip_to_space (char *inp); + +#endif /* CLI_UTILS_H */ |