* 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

@ -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."));