* 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-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
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=
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 \
$(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
#include "jit.h"
#include "xml-syscall.h"
#include "parser-defs.h"
+#include "cli/cli-utils.h"
/* readline include files */
#include "readline/readline.h"
static void condition_command (char *, int);
-static int get_number_trailer (char **, int);
-
typedef enum
{
mark_inserted,
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 *,
struct program_space *default_breakpoint_pspace;
\f
-/* *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. */
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;
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;
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);
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)
&& (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;
}
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.
/* 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
if (!arg)
arg = "";
- ep_skip_leading_whitespace (&arg);
+ arg = skip_spaces (arg);
/* The allowed syntax is:
catch [v]fork
if (!arg)
arg = "";
- ep_skip_leading_whitespace (&arg);
+ arg = skip_spaces (arg);
/* The allowed syntax is:
catch exec
if (!arg)
arg = "";
- ep_skip_leading_whitespace (&arg);
+ arg = skip_spaces (arg);
cond_string = ep_parse_optional_if_clause (&arg);
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,
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,
#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)
{
extern FILE *fopen_with_cleanup (const char *filename, const char *mode);
-extern char *skip_spaces (char *inp);
-
#endif
--- /dev/null
+/* 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;
+}
--- /dev/null
+/* 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 */
#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. */
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++ != '"')
/* 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);
#include "top.h"
#include "cli/cli-cmds.h"
#include "cli/cli-decode.h"
+#include "cli/cli-utils.h"
#include "inferior.h"
#include "regcache.h"