Re: [patch] delete a range of display numbers

Guillaume Leconte
2011-02-18T09:47:32Z

This version fits more with the indentation style, and fixes a typo (I
omitted to change a call
to delete_display()). Sorry for the noise.

diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index 29ffbf5..deb1b80 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -1558,12 +1558,16 @@ 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 +1579,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 +1594,40 @@ 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,7 +1637,8 @@ undisplay_command (char *args, int from_tty)
char *p = args;
char *p1;
int num;
-
+ int lower, upper, i;
+ char *dash;
if (args == 0)
{
if (query (_("Delete all auto-display expressions? ")))
@@ -1604,23 +1647,44 @@ 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, 0);

- p = p1;
- while (*p == ' ' || *p == '\t')
- p++;
+ p = p1;
+ while (*p == ' ' || *p == '\t')
+ p++;
+ }
+ dont_repeat ();
}
- dont_repeat ();
}

/* Display a single auto-display.

--
"A fellow of infinite jest, of most excellent fancy."