* thread.c (thread_apply_command): Update.
* reverse.c (delete_bookmark_command): Update.
(bookmarks_info): Update.
* printcmd.c (undisplay_command): Update.
* memattr.c (mem_enable_command): Update.
(mem_disable_command): Update.
(mem_delete_command): Update.
* inferior.c (detach_inferior_command): Update.
(kill_inferior_command): Update.
(remove_inferior_command): Update.
* cli/cli-utils.h (struct get_number_or_range_state): New.
(init_number_or_range): Declare.
(get_number_or_range): Update.
* cli/cli-utils.c (init_number_or_range): New function.
(get_number_or_range): Change 'pp' parameter to 'state'. Remove
static variables.
(number_is_in_list): Update.
* breakpoint.h (get_tracepoint_by_number): Update.
* breakpoint.c (map_breakpoint_numbers): Update for change to
get_number_or_range.
(find_location_by_number): Use get_number, not
get_number_or_range.
(trace_pass_set_count): New function.
(trace_pass_command): Update for change to get_number_or_range.
Rework loop logic.
(get_tracepoint_by_number): Remove 'multi_p' parameter; add
'state' parameter.
+2011-03-10 Tom Tromey <tromey@redhat.com>
+
+ * tracepoint.c (trace_actions_command): Update.
+ * thread.c (thread_apply_command): Update.
+ * reverse.c (delete_bookmark_command): Update.
+ (bookmarks_info): Update.
+ * printcmd.c (undisplay_command): Update.
+ * memattr.c (mem_enable_command): Update.
+ (mem_disable_command): Update.
+ (mem_delete_command): Update.
+ * inferior.c (detach_inferior_command): Update.
+ (kill_inferior_command): Update.
+ (remove_inferior_command): Update.
+ * cli/cli-utils.h (struct get_number_or_range_state): New.
+ (init_number_or_range): Declare.
+ (get_number_or_range): Update.
+ * cli/cli-utils.c (init_number_or_range): New function.
+ (get_number_or_range): Change 'pp' parameter to 'state'. Remove
+ static variables.
+ (number_is_in_list): Update.
+ * breakpoint.h (get_tracepoint_by_number): Update.
+ * breakpoint.c (map_breakpoint_numbers): Update for change to
+ get_number_or_range.
+ (find_location_by_number): Use get_number, not
+ get_number_or_range.
+ (trace_pass_set_count): New function.
+ (trace_pass_command): Update for change to get_number_or_range.
+ Rework loop logic.
+ (get_tracepoint_by_number): Remove 'multi_p' parameter; add
+ 'state' parameter.
+
2011-03-10 Phil Muldoon <pmuldoon@redhat.com>
* python/py-param.c (add_setshow_generic): Add set/show callback
void *),
void *data)
{
- char *p = args;
- char *p1;
int num;
struct breakpoint *b, *tmp;
int match;
+ struct get_number_or_range_state state;
- if (p == 0)
+ if (args == 0)
error_no_arg (_("one or more breakpoint numbers"));
- while (*p)
+ init_number_or_range (&state, args);
+
+ while (!state.finished)
{
+ char *p = state.string;
+
match = 0;
- p1 = p;
- num = get_number_or_range (&p1);
+ num = get_number_or_range (&state);
if (num == 0)
{
warning (_("bad breakpoint number at or near '%s'"), p);
if (match == 0)
printf_unfiltered (_("No breakpoint number %d.\n"), num);
}
- p = p1;
}
}
*dot = '\0';
p1 = number;
- bp_num = get_number_or_range (&p1);
+ bp_num = get_number (&p1);
if (bp_num == 0)
error (_("Bad breakpoint number '%s'"), number);
error (_("Bad breakpoint number '%s'"), number);
p1 = dot+1;
- loc_num = get_number_or_range (&p1);
+ loc_num = get_number (&p1);
if (loc_num == 0)
error (_("Bad breakpoint location number '%s'"), number);
map_breakpoint_numbers (arg, do_delete_breakpoint, NULL);
}
+/* Helper function for trace_pass_command. */
+
+static void
+trace_pass_set_count (struct breakpoint *bp, int count, int from_tty)
+{
+ bp->pass_count = count;
+ observer_notify_tracepoint_modified (bp->number);
+ if (from_tty)
+ printf_filtered (_("Setting tracepoint %d's passcount to %d\n"),
+ bp->number, count);
+}
+
/* Set passcount for tracepoint.
First command argument is passcount, second is tracepoint number.
static void
trace_pass_command (char *args, int from_tty)
{
- struct breakpoint *t1 = (struct breakpoint *) -1, *t2;
+ struct breakpoint *t1;
unsigned int count;
- int all = 0;
if (args == 0 || *args == 0)
error (_("passcount command requires an "
if (*args && strncasecmp (args, "all", 3) == 0)
{
args += 3; /* Skip special argument "all". */
- all = 1;
if (*args)
error (_("Junk at end of arguments."));
- }
- else
- t1 = get_tracepoint_by_number (&args, 1, 1);
- do
+ ALL_TRACEPOINTS (t1)
+ {
+ trace_pass_set_count (t1, count, from_tty);
+ }
+ }
+ else if (*args == '\0')
{
+ t1 = get_tracepoint_by_number (&args, NULL, 1);
if (t1)
+ trace_pass_set_count (t1, count, from_tty);
+ }
+ else
+ {
+ struct get_number_or_range_state state;
+
+ init_number_or_range (&state, args);
+ while (!state.finished)
{
- ALL_TRACEPOINTS (t2)
- if (t1 == (struct breakpoint *) -1 || t1 == t2)
- {
- t2->pass_count = count;
- observer_notify_tracepoint_modified (t2->number);
- if (from_tty)
- printf_filtered (_("Setting tracepoint %d's "
- "passcount to %d\n"),
- t2->number, count);
- }
- if (! all && *args)
- t1 = get_tracepoint_by_number (&args, 1, 0);
+ t1 = get_tracepoint_by_number (&args, &state, 1);
+ if (t1)
+ trace_pass_set_count (t1, count, from_tty);
}
}
- while (*args);
}
struct breakpoint *
}
/* Utility: parse a tracepoint number and look it up in the list.
- If MULTI_P is true, there might be a range of tracepoints in ARG.
- if OPTIONAL_P is true, then if the argument is missing, the most
+ If STATE is not NULL, use, get_number_or_range_state and ignore ARG.
+ If OPTIONAL_P is true, then if the argument is missing, the most
recent tracepoint (tracepoint_count) is returned. */
struct breakpoint *
-get_tracepoint_by_number (char **arg, int multi_p, int optional_p)
+get_tracepoint_by_number (char **arg,
+ struct get_number_or_range_state *state,
+ int optional_p)
{
extern int tracepoint_count;
struct breakpoint *t;
int tpnum;
char *instring = arg == NULL ? NULL : *arg;
- if (arg == NULL || *arg == NULL || ! **arg)
+ if (state)
+ {
+ gdb_assert (!state->finished);
+ tpnum = get_number_or_range (state);
+ }
+ else if (arg == NULL || *arg == NULL || ! **arg)
{
if (optional_p)
tpnum = tracepoint_count;
error_no_arg (_("tracepoint number"));
}
else
- tpnum = multi_p ? get_number_or_range (arg) : get_number (arg);
+ tpnum = get_number (arg);
if (tpnum <= 0)
{
return t;
}
- /* FIXME: if we are in the middle of a range we don't want to give
- a message. The current interface to get_number_or_range doesn't
- allow us to discover this. */
printf_unfiltered ("No tracepoint number %d.\n", tpnum);
return NULL;
}
struct value;
struct block;
struct breakpoint_object;
+struct get_number_or_range_state;
/* This is the maximum number of bytes a breakpoint instruction can
take. Feel free to increase it. It's just used in a few places to
extern struct breakpoint *get_tracepoint_by_number_on_target (int num);
/* Find a tracepoint by parsing a number in the supplied string. */
-extern struct breakpoint *get_tracepoint_by_number (char **arg,
- int multi_p,
- int optional_p);
+extern struct breakpoint *
+ get_tracepoint_by_number (char **arg,
+ struct get_number_or_range_state *state,
+ int optional_p);
/* Return a vector of all tracepoints currently defined. The vector
is newly allocated; the caller should free when done with it. */
extern int user_breakpoint_p (struct breakpoint *);
-extern int get_number_or_range (char **pp);
-
#endif /* !defined (BREAKPOINT_H) */
/* See documentation in cli-utils.h. */
-int
-get_number_or_range (char **pp)
+void
+init_number_or_range (struct get_number_or_range_state *state,
+ char *string)
{
- static int last_retval, end_value;
- static char *end_ptr;
- static int in_range = 0;
+ memset (state, 0, sizeof (*state));
+ state->string = string;
+}
+
+/* See documentation in cli-utils.h. */
- if (**pp != '-')
+int
+get_number_or_range (struct get_number_or_range_state *state)
+{
+ if (*state->string != '-')
{
- /* 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 == '-')
+ /* Default case: state->string is pointing either to a solo
+ number, or to the first number of a range. */
+ state->last_retval = get_number_trailer (&state->string, '-');
+ if (*state->string == '-')
{
char **temp;
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)
+ temp = &state->end_ptr;
+ state->end_ptr = skip_spaces (state->string + 1);
+ state->end_value = get_number (temp);
+ if (state->end_value < state->last_retval)
{
error (_("inverted range"));
}
- else if (end_value == last_retval)
+ else if (state->end_value == state->last_retval)
{
/* Degenerate range (number1 == number2). Advance the
token pointer so that the range will be treated as a
single number. */
- *pp = end_ptr;
+ state->string = state->end_ptr;
}
else
- in_range = 1;
+ state->in_range = 1;
}
}
- else if (! in_range)
+ else if (! state->in_range)
error (_("negative value"));
else
{
- /* pp points to the '-' that betokens a range. All
+ /* state->string 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
+ Do not advance the token pointer until the end of range
is reached. */
- if (++last_retval == end_value)
+ if (++state->last_retval == state->end_value)
{
/* End of range reached; advance token pointer. */
- *pp = end_ptr;
- in_range = 0;
+ state->string = state->end_ptr;
+ state->in_range = 0;
}
}
- return last_retval;
+ state->finished = *state->string == '\0';
+ return state->last_retval;
}
/* Accept a number and a string-form list of numbers such as is
int
number_is_in_list (char *list, int number)
{
+ struct get_number_or_range_state state;
+
if (list == NULL || *list == '\0')
return 1;
- while (*list != '\0')
+ init_number_or_range (&state, list);
+ while (!state.finished)
{
- int gotnum = get_number_or_range (&list);
+ int gotnum = get_number_or_range (&state);
if (gotnum == 0)
error (_("Args must be numbers or '$' variables."));
extern int get_number (char **);
+/* 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. */
+
+struct get_number_or_range_state
+{
+ /* Non-zero if parsing has completed. */
+ int finished;
+
+ /* The string being parsed. When parsing has finished, this points
+ past the last parsed token. */
+ char *string;
+
+ /* Last value returned. */
+ int last_retval;
+
+ /* When parsing a range, the final value in the range. */
+ int end_value;
+
+ /* When parsing a range, a pointer past the final token in the
+ range. */
+ char *end_ptr;
+
+ /* Non-zero when parsing a range. */
+ int in_range;
+};
+
+/* Initialize a get_number_or_range_state for use with
+ get_number_or_range_state. STRING is the string to be parsed. */
+
+extern void init_number_or_range (struct get_number_or_range_state *state,
+ char *string);
+
/* 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
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
+ At the beginning of parsing a range, the char pointer STATE->string 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>. */
+ the pointer past <number2>. */
-extern int get_number_or_range (char **);
+extern int get_number_or_range (struct get_number_or_range_state *state);
/* 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
{
int num, pid;
struct thread_info *tp;
+ struct get_number_or_range_state state;
if (!args || !*args)
error (_("Requires argument (inferior id(s) to detach)"));
- while (*args != '\0')
+ init_number_or_range (&state, args);
+ while (!state.finished)
{
- num = get_number_or_range (&args);
+ num = get_number_or_range (&state);
if (!valid_gdb_inferior_id (num))
{
{
int num, pid;
struct thread_info *tp;
+ struct get_number_or_range_state state;
if (!args || !*args)
error (_("Requires argument (inferior id(s) to kill)"));
- while (*args != '\0')
+ init_number_or_range (&state, args);
+ while (!state.finished)
{
- num = get_number_or_range (&args);
+ num = get_number_or_range (&state);
if (!valid_gdb_inferior_id (num))
{
{
int num;
struct inferior *inf;
+ struct get_number_or_range_state state;
if (args == NULL || *args == '\0')
error (_("Requires an argument (inferior id(s) to remove)"));
- while (*args != '\0')
+ init_number_or_range (&state, args);
+ while (!state.finished)
{
- num = get_number_or_range (&args);
+ num = get_number_or_range (&state);
inf = find_inferior_id (num);
if (inf == NULL)
#include "vec.h"
#include "gdb_string.h"
#include "breakpoint.h"
+#include "cli/cli-utils.h"
const struct mem_attrib default_mem_attrib =
{
m->enabled_p = 1;
}
else
- while (args != NULL && *args != '\0')
- {
- num = get_number_or_range (&args);
- mem_enable (num);
- }
+ {
+ struct get_number_or_range_state state;
+
+ init_number_or_range (&state, args);
+ while (!state.finished)
+ {
+ num = get_number_or_range (&state);
+ mem_enable (num);
+ }
+ }
}
\f
m->enabled_p = 0;
}
else
- while (args != NULL && *args != '\0')
- {
- num = get_number_or_range (&args);
- mem_disable (num);
- }
+ {
+ struct get_number_or_range_state state;
+
+ init_number_or_range (&state, args);
+ while (!state.finished)
+ {
+ num = get_number_or_range (&state);
+ mem_disable (num);
+ }
+ }
}
/* Delete the memory region number NUM. */
mem_delete_command (char *args, int from_tty)
{
int num;
+ struct get_number_or_range_state state;
require_user_regions (from_tty);
return;
}
- while (args != NULL && *args != '\0')
+ init_number_or_range (&state, args);
+ while (!state.finished)
{
- num = get_number_or_range (&args);
+ num = get_number_or_range (&state);
mem_delete (num);
}
static void
undisplay_command (char *args, int from_tty)
{
- char *p = args;
- char *p1;
int num;
+ struct get_number_or_range_state state;
if (args == 0)
{
return;
}
- while (*p)
+ init_number_or_range (&state, args);
+ while (!state.finished)
{
- p1 = p;
+ char *p = state.string;
- num = get_number_or_range (&p1);
+ num = get_number_or_range (&state);
if (num == 0)
warning (_("bad display number at or near '%s'"), p);
else
else
delete_display (d);
}
-
- p = p1;
}
dont_repeat ();
}
{
struct bookmark *b;
int num;
+ struct get_number_or_range_state state;
if (bookmark_chain == NULL)
{
return;
}
- while (args != NULL && *args != '\0')
+ init_number_or_range (&state, args);
+ while (!state.finished)
{
- num = get_number_or_range (&args);
+ num = get_number_or_range (&state);
if (!delete_one_bookmark (num))
/* Not found. */
warning (_("No bookmark #%d."), num);
else if (args == NULL || *args == '\0')
bookmark_1 (-1);
else
- while (args != NULL && *args != '\0')
- {
- bnum = get_number_or_range (&args);
- bookmark_1 (bnum);
- }
+ {
+ struct get_number_or_range_state state;
+
+ init_number_or_range (&state, args);
+ while (!state.finished)
+ {
+ bnum = get_number_or_range (&state);
+ bookmark_1 (bnum);
+ }
+ }
}
char *cmd;
struct cleanup *old_chain;
char *saved_cmd;
+ struct get_number_or_range_state state;
if (tidlist == NULL || *tidlist == '\000')
error (_("Please specify a thread ID list"));
execute_command. */
saved_cmd = xstrdup (cmd);
old_chain = make_cleanup (xfree, saved_cmd);
- while (tidlist < cmd)
+
+ init_number_or_range (&state, tidlist);
+ while (!state.finished && state.string < cmd)
{
struct thread_info *tp;
int start;
char *p = tidlist;
- start = get_number_or_range (&tidlist);
+ start = get_number_or_range (&state);
make_cleanup_restore_current_thread ();
struct breakpoint *t;
struct command_line *l;
- t = get_tracepoint_by_number (&args, 0, 1);
+ t = get_tracepoint_by_number (&args, NULL, 1);
if (t)
{
char *tmpbuf =