* 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.
This commit is contained in:
Tom Tromey 2011-03-10 18:33:59 +00:00
parent 5652b4915c
commit 197f0a605d
11 changed files with 226 additions and 110 deletions

View file

@ -1,3 +1,34 @@
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

View file

@ -10804,21 +10804,23 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *,
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)
{
match = 0;
p1 = p;
init_number_or_range (&state, args);
num = get_number_or_range (&p1);
while (!state.finished)
{
char *p = state.string;
match = 0;
num = get_number_or_range (&state);
if (num == 0)
{
warning (_("bad breakpoint number at or near '%s'"), p);
@ -10838,7 +10840,6 @@ map_breakpoint_numbers (char *args, void (*function) (struct breakpoint *,
if (match == 0)
printf_unfiltered (_("No breakpoint number %d.\n"), num);
}
p = p1;
}
}
@ -10855,7 +10856,7 @@ find_location_by_number (char *number)
*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);
@ -10869,7 +10870,7 @@ find_location_by_number (char *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);
@ -11613,6 +11614,18 @@ delete_trace_command (char *arg, int from_tty)
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.
@ -11622,9 +11635,8 @@ delete_trace_command (char *arg, int from_tty)
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 "
@ -11638,32 +11650,32 @@ trace_pass_command (char *args, int from_tty)
if (*args && strncasecmp (args, "all", 3) == 0)
{
args += 3; /* Skip special argument "all". */
all = 1;
if (*args)
error (_("Junk at end of arguments."));
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
t1 = get_tracepoint_by_number (&args, 1, 1);
do
{
if (t1)
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 *
@ -11695,18 +11707,25 @@ get_tracepoint_by_number_on_target (int num)
}
/* 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;
@ -11714,7 +11733,7 @@ get_tracepoint_by_number (char **arg, int multi_p, int optional_p)
error_no_arg (_("tracepoint number"));
}
else
tpnum = multi_p ? get_number_or_range (arg) : get_number (arg);
tpnum = get_number (arg);
if (tpnum <= 0)
{
@ -11733,9 +11752,6 @@ get_tracepoint_by_number (char **arg, int multi_p, int optional_p)
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;
}

View file

@ -28,6 +28,7 @@
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
@ -1150,9 +1151,10 @@ extern struct breakpoint *get_tracepoint (int num);
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. */
@ -1187,6 +1189,4 @@ extern struct breakpoint *iterate_over_breakpoints (int (*) (struct breakpoint *
extern int user_breakpoint_p (struct breakpoint *);
extern int get_number_or_range (char **pp);
#endif /* !defined (BREAKPOINT_H) */

View file

@ -117,19 +117,25 @@ get_number (char **pp)
/* 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;
}
if (**pp != '-')
/* See documentation in cli-utils.h. */
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;
@ -137,44 +143,43 @@ get_number_or_range (char **pp)
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
@ -188,12 +193,15 @@ get_number_or_range (char **pp)
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."));

View file

@ -28,6 +28,40 @@
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
@ -37,13 +71,13 @@ extern int get_number (char **);
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

View file

@ -612,13 +612,15 @@ detach_inferior_command (char *args, int from_tty)
{
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))
{
@ -646,13 +648,15 @@ kill_inferior_command (char *args, int from_tty)
{
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))
{
@ -747,13 +751,15 @@ remove_inferior_command (char *args, int from_tty)
{
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)

View file

@ -28,6 +28,7 @@
#include "vec.h"
#include "gdb_string.h"
#include "breakpoint.h"
#include "cli/cli-utils.h"
const struct mem_attrib default_mem_attrib =
{
@ -577,11 +578,16 @@ mem_enable_command (char *args, int from_tty)
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);
}
}
}
@ -619,11 +625,16 @@ mem_disable_command (char *args, int from_tty)
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. */
@ -657,6 +668,7 @@ static void
mem_delete_command (char *args, int from_tty)
{
int num;
struct get_number_or_range_state state;
require_user_regions (from_tty);
@ -670,9 +682,10 @@ mem_delete_command (char *args, int 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);
}

View file

@ -1589,9 +1589,8 @@ delete_display (struct display *display)
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)
{
@ -1601,11 +1600,12 @@ undisplay_command (char *args, int from_tty)
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
@ -1620,8 +1620,6 @@ undisplay_command (char *args, int from_tty)
else
delete_display (d);
}
p = p1;
}
dont_repeat ();
}

View file

@ -222,6 +222,7 @@ delete_bookmark_command (char *args, int from_tty)
{
struct bookmark *b;
int num;
struct get_number_or_range_state state;
if (bookmark_chain == NULL)
{
@ -237,9 +238,10 @@ delete_bookmark_command (char *args, int 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);
if (!delete_one_bookmark (num))
/* Not found. */
warning (_("No bookmark #%d."), num);
@ -328,11 +330,16 @@ bookmarks_info (char *args, int from_tty)
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);
}
}
}

View file

@ -1214,6 +1214,7 @@ thread_apply_command (char *tidlist, int from_tty)
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"));
@ -1227,13 +1228,15 @@ thread_apply_command (char *tidlist, int from_tty)
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 ();

View file

@ -581,7 +581,7 @@ trace_actions_command (char *args, int from_tty)
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 =