diff options
-rw-r--r-- | gdb/ChangeLog | 24 | ||||
-rw-r--r-- | gdb/Makefile.in | 10 | ||||
-rw-r--r-- | gdb/breakpoint.c | 210 | ||||
-rw-r--r-- | gdb/breakpoint.h | 4 | ||||
-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 | ||||
-rw-r--r-- | gdb/printcmd.c | 11 | ||||
-rw-r--r-- | gdb/reverse.c | 1 |
10 files changed, 296 insertions, 221 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog index 89f74ac..5fde603 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,27 @@ +2011-02-21 Tom Tromey <tromey@redhat.com> + + * 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. + 2011-02-18 Pierre Muller <muller@ics.u-strasbg.fr> * remote.c (remote_close): Reset INFERIOR_PTID to NULL_PTID diff --git a/gdb/Makefile.in b/gdb/Makefile.in index 8d1cc26..ee79a14 100644 --- a/gdb/Makefile.in +++ b/gdb/Makefile.in @@ -193,12 +193,12 @@ SUBDIR_CLI_OBS = \ cli-dump.o \ cli-decode.o cli-script.o cli-cmds.o cli-setshow.o \ cli-logging.o \ - cli-interp.o + cli-interp.o cli-utils.o SUBDIR_CLI_SRCS = \ cli/cli-dump.c \ cli/cli-decode.c cli/cli-script.c cli/cli-cmds.c cli/cli-setshow.c \ cli/cli-logging.c \ - cli/cli-interp.c + cli/cli-interp.c cli/cli-utils.c SUBDIR_CLI_DEPS = SUBDIR_CLI_LDFLAGS= SUBDIR_CLI_CFLAGS= @@ -767,7 +767,7 @@ exec.h m32r-tdep.h osabi.h gdbcore.h solib-som.h \ i386bsd-nat.h xml-support.h xml-tdesc.h alphabsd-tdep.h gdb_obstack.h \ ia64-tdep.h ada-lang.h varobj.h frv-tdep.h nto-tdep.h serial.h \ c-lang.h d-lang.h frame.h event-loop.h block.h cli/cli-setshow.h \ -cli/cli-decode.h cli/cli-cmds.h cli/cli-dump.h \ +cli/cli-decode.h cli/cli-cmds.h cli/cli-dump.h cli/cli-utils.h \ cli/cli-script.h macrotab.h symtab.h version.h gnulib/wchar.in.h \ gnulib/string.in.h gnulib/str-two-way.h \ gnulib/stdint.in.h remote.h gdb.h sparc-nat.h gdbserver/win32-low.h \ @@ -1756,6 +1756,10 @@ cli-setshow.o: $(srcdir)/cli/cli-setshow.c $(COMPILE) $(srcdir)/cli/cli-setshow.c $(POSTCOMPILE) +cli-utils.o: $(srcdir)/cli/cli-utils.c + $(COMPILE) $(srcdir)/cli/cli-utils.c + $(POSTCOMPILE) + # # GDBTK sub-directory diff --git a/gdb/breakpoint.c b/gdb/breakpoint.c index 27fbcc6..065efa6 100644 --- a/gdb/breakpoint.c +++ b/gdb/breakpoint.c @@ -62,6 +62,7 @@ #include "jit.h" #include "xml-syscall.h" #include "parser-defs.h" +#include "cli/cli-utils.h" /* readline include files */ #include "readline/readline.h" @@ -142,8 +143,6 @@ static void commands_command (char *, int); static void condition_command (char *, int); -static int get_number_trailer (char **, int); - typedef enum { mark_inserted, @@ -185,8 +184,6 @@ static void catch_exception_command_1 (enum exception_event_kind ex_event, static void tcatch_command (char *arg, int from_tty); -static void ep_skip_leading_whitespace (char **s); - static void detach_single_step_breakpoints (void); static int single_step_breakpoint_inserted_here_p (struct address_space *, @@ -553,159 +550,6 @@ int default_breakpoint_line; struct program_space *default_breakpoint_pspace; -/* *PP is a string denoting a breakpoint. Get the number of the - breakpoint. 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. Making it an expression wouldn't - work well for map_breakpoint_numbers (e.g. "4 + 5 + 6"). - - 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; - } - while (isspace (*p)) - p++; - *pp = p; - return retval; -} - - -/* Like get_number_trailer, but don't allow a trailer. */ -int -get_number (char **pp) -{ - return get_number_trailer (pp, '\0'); -} - -/* 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>. */ - -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; -} - /* Return the breakpoint with the specified number, or NULL if the number does not refer to an existing breakpoint. */ @@ -7383,12 +7227,9 @@ create_breakpoint_sal (struct gdbarch *gdbarch, char *marker_str; int i; - while (*p == ' ' || *p == '\t') - p++; + p = skip_spaces (p); - endp = p; - while (*endp != ' ' && *endp != '\t' && *endp != '\0') - endp++; + endp = skip_to_space (p); marker_str = savestring (p, endp - p); b->static_trace_marker_id = marker_str; @@ -7783,13 +7624,9 @@ find_condition_and_thread (char *tok, CORE_ADDR pc, char *cond_start = NULL; char *cond_end = NULL; - while (*tok == ' ' || *tok == '\t') - tok++; - - end_tok = tok; + tok = skip_spaces (tok); - while (*end_tok != ' ' && *end_tok != '\t' && *end_tok != '\000') - end_tok++; + end_tok = skip_to_space (tok); toklen = end_tok - tok; @@ -7848,12 +7685,9 @@ decode_static_tracepoint_spec (char **arg_p) char *marker_str; int i; - while (*p == ' ' || *p == '\t') - p++; + p = skip_spaces (p); - endp = p; - while (*endp != ' ' && *endp != '\t' && *endp != '\0') - endp++; + endp = skip_to_space (p); marker_str = savestring (p, endp - p); old_chain = make_cleanup (xfree, marker_str); @@ -8618,13 +8452,8 @@ watch_command_1 (char *arg, int accessflag, int from_tty, else if (val != NULL) release_value (val); - tok = arg; - while (*tok == ' ' || *tok == '\t') - tok++; - end_tok = tok; - - while (*end_tok != ' ' && *end_tok != '\t' && *end_tok != '\000') - end_tok++; + tok = skip_spaces (arg); + end_tok = skip_to_space (tok); toklen = end_tok - tok; if (toklen >= 1 && strncmp (tok, "if", toklen) == 0) @@ -8908,7 +8737,7 @@ watch_maybe_just_location (char *arg, int accessflag, int from_tty) && (check_for_argument (&arg, "-location", sizeof ("-location") - 1) || check_for_argument (&arg, "-l", sizeof ("-l") - 1))) { - ep_skip_leading_whitespace (&arg); + arg = skip_spaces (arg); just_location = 1; } @@ -9065,15 +8894,6 @@ until_break_command (char *arg, int from_tty, int anywhere) do_cleanups (old_chain); } -static void -ep_skip_leading_whitespace (char **s) -{ - if ((s == NULL) || (*s == NULL)) - return; - while (isspace (**s)) - *s += 1; -} - /* This function attempts to parse an optional "if <cond>" clause from the arg string. If one is not found, it returns NULL. @@ -9095,7 +8915,7 @@ ep_parse_optional_if_clause (char **arg) /* Skip any extra leading whitespace, and record the start of the condition string. */ - ep_skip_leading_whitespace (arg); + *arg = skip_spaces (*arg); cond_string = *arg; /* Assume that the condition occupies the remainder of the arg @@ -9130,7 +8950,7 @@ catch_fork_command_1 (char *arg, int from_tty, if (!arg) arg = ""; - ep_skip_leading_whitespace (&arg); + arg = skip_spaces (arg); /* The allowed syntax is: catch [v]fork @@ -9174,7 +8994,7 @@ catch_exec_command_1 (char *arg, int from_tty, if (!arg) arg = ""; - ep_skip_leading_whitespace (&arg); + arg = skip_spaces (arg); /* The allowed syntax is: catch exec @@ -9324,7 +9144,7 @@ catch_exception_command_1 (enum exception_event_kind ex_event, char *arg, if (!arg) arg = ""; - ep_skip_leading_whitespace (&arg); + arg = skip_spaces (arg); cond_string = ep_parse_optional_if_clause (&arg); @@ -9514,7 +9334,7 @@ this architeture yet.")); tempflag = get_cmd_context (command) == CATCH_TEMPORARY; - ep_skip_leading_whitespace (&arg); + arg = skip_spaces (arg); /* We need to do this first "dummy" translation in order to get the syscall XML file loaded or, most important, diff --git a/gdb/breakpoint.h b/gdb/breakpoint.h index a3927cf..a0fea21 100644 --- a/gdb/breakpoint.h +++ b/gdb/breakpoint.h @@ -1039,10 +1039,6 @@ extern enum command_control_type commands_from_control_command extern void clear_breakpoint_hit_counts (void); -extern int get_number (char **); - -extern int get_number_or_range (char **); - extern struct breakpoint *get_breakpoint (int num); /* The following are for displays, which aren't really breakpoints, 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 */ diff --git a/gdb/printcmd.c b/gdb/printcmd.c index d89004b..ebca5a3 100644 --- a/gdb/printcmd.c +++ b/gdb/printcmd.c @@ -50,6 +50,7 @@ #include "charset.h" #include "arch-utils.h" #include "printcmd.h" +#include "cli/cli-utils.h" #ifdef TUI #include "tui/tui.h" /* For tui_active et al. */ @@ -1983,9 +1984,7 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback, if (s == 0) error_no_arg (_("format-control string and values to print")); - /* Skip white space before format string. */ - while (*s == ' ' || *s == '\t') - s++; + s = skip_spaces (s); /* A format string should follow, enveloped in double quotes. */ if (*s++ != '"') @@ -2049,16 +2048,14 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback, /* Skip over " and following space and comma. */ s++; *f++ = '\0'; - while (*s == ' ' || *s == '\t') - s++; + s = skip_spaces (s); if (*s != ',' && *s != 0) error (_("Invalid argument syntax")); if (*s == ',') s++; - while (*s == ' ' || *s == '\t') - s++; + s = skip_spaces (s); /* Need extra space for the '\0's. Doubling the size is sufficient. */ substrings = alloca (strlen (string) * 2); diff --git a/gdb/reverse.c b/gdb/reverse.c index d501ceb..7169cc3 100644 --- a/gdb/reverse.c +++ b/gdb/reverse.c @@ -24,6 +24,7 @@ #include "top.h" #include "cli/cli-cmds.h" #include "cli/cli-decode.h" +#include "cli/cli-utils.h" #include "inferior.h" #include "regcache.h" |