Re: [patch] delete a range of display numbers

Michael Snyder
2011-02-18T17:41:25Z

Guillaume Leconte wrote:
> I often have a bunch of display numbers when I use gdb. It's pretty
> annoying to be unable to remove for example the N first ones I've
> previously set.
>
> This patch allow the user to do this:
>
> (gdb) delete display 1-7
>
> Notice that I've change the prototype of delete_display() in order
> to have a silent return in case of unknown number. If you have set
> the display numbers 1, 2, 3 and 5, you can remove 2-5 without any
> error messages (number 4 is missing in the list). As a consequence,
> you can also remove out of bound numbers, as in 'delete display 5-42'
> without having gdb complaining.

I'm concerned about this. What happens if I want to delete 24, but
by mistake I type "delete display 42"? If gdb fails silently, I will
not be informed of my mistake.

>
> diff --git a/gdb/printcmd.c b/gdb/printcmd.c
> index 29ffbf5..6f718c4 100644
> --- a/gdb/printcmd.c
> +++ b/gdb/printcmd.c
> @@ -1420,7 +1420,7 @@ x_command (char *exp, int from_tty)
> val = coerce_ref (val);
> /* In rvalue contexts, such as this, functions are coerced into
> pointers to functions. This makes "x/i main" work. */
> - if (/* last_format == 'i' && */
> + if (/* last_format == 'i' && */
> TYPE_CODE (value_type (val)) == TYPE_CODE_FUNC
> && VALUE_LVAL (val) == lval_memory)
> next_address = value_address (val);
> @@ -1558,12 +1558,17 @@ clear_displays (void)
> /* Delete the auto-display number NUM. */
>
> static void
> -delete_display (int num)
> +delete_display (int num,
> + int ignore)
> {
> struct display *d1, *d;
>
> if (!display_chain)
> - error (_("No display number %d."), num);
> + {
> + if (ignore)
> + return;
> + error (_("No display number %d."), num);
> + }
>
> if (display_chain->number == num)
> {
> @@ -1575,7 +1580,11 @@ delete_display (int num)
> for (d = display_chain;; d = d->next)
> {
> if (d->next == 0)
> - error (_("No display number %d."), num);
> + {
> + if (ignore)
> + return;
> + error (_("No display number %d."), num);
> + }
> if (d->next->number == num)
> {
> d1 = d->next;
> @@ -1586,6 +1595,42 @@ delete_display (int num)
> }
> }
>
> +static int
> +set_int_from_str(char *str,
> + int *result,
> + char *end_delim)
> +{
> + char *p;
> + int ret;
> + char *occurrence;
> +
> + p = str;
> + ret = -1;
> +
> + if (! str)
> + goto err;
> +
> + while (p && *p && (' ' == *p || '\t' == *p))
> + p++;
> +
> + while (p && *p && *p >= '0' && *p <= '9')
> + p++;
> +
> + if (p && *p)
> + {
> + occurrence = strpbrk(p, end_delim);
> + if (! occurrence || occurrence != p)
> + goto err;
> + }
> +
> + if (result)
> + *result = atoi(str);
> +
> + ret = 0;
> + err:
> + return ret;
> +}
> +
> /* Delete some values from the auto-display chain.
> Specify the element numbers. */
>
> @@ -1595,6 +1640,8 @@ undisplay_command (char *args, int from_tty)
> char *p = args;
> char *p1;
> int num;
> + int lower, upper, i;
> + char *dash;
>
> if (args == 0)
> {
> @@ -1604,26 +1651,47 @@ undisplay_command (char *args, int from_tty)
> return;
> }
>
> - while (*p)
> + dash = strchr(p, '-');
> + if (dash) /* remove all the display IDs within a range */
> + {
> + if (-1 == set_int_from_str(p, &lower, "- \t"))
> + error (_("Arguments must be display numbers."));
> +
> + p = dash+1;
> + while (p && *p && (' ' == *p || '\t' == *p))
> + p++;
> +
> + if (-1 == set_int_from_str(p, &upper, " \t"))
> + error (_("Arguments must be display numbers."));
> +
> + for (i = lower; i <= upper; i++)
> + delete_display(i, 1);
> +
> + dont_repeat ();
> + }
> + else
> {
> - p1 = p;
> - while (*p1 >= '0' && *p1 <= '9')
> - p1++;
> - if (*p1 && *p1 != ' ' && *p1 != '\t')
> - error (_("Arguments must be display numbers."));
> + while (*p)
> + {
> + p1 = p;
> + while (*p1 >= '0' && *p1 <= '9')
> + p1++;
> + if (*p1 && *p1 != ' ' && *p1 != '\t')
> + error (_("Arguments must be display numbers."));
>
> - num = atoi (p);
> + num = atoi (p);
>
> - delete_display (num);
> + delete_display (num);
>
> - p = p1;
> - while (*p == ' ' || *p == '\t')
> - p++;
> + p = p1;
> + while (*p == ' ' || *p == '\t')
> + p++;
> + }
> + dont_repeat ();
> }
> - dont_repeat ();
> }
>