[patch+docs] make 'disable|enable display' also accept ranges (Re: [patch] delete a range of display numbers)

Pedro Alves
2011-03-14T21:16:27Z

I finally took a bit to come back to this:

On Friday 18 February 2011 17:52:02, Pedro Alves wrote:
> "disable display" and "enable display" should get the
> same treatment to accept ranges.

... and that's what the code patch does.

The docs patch tweaks the commands' ("undisplay" too)
docs to mention what they now accept. Does it look okay?

Pedro Alves

2011-03-14 Pedro Alves <pedro@codesourcery.com>

gdb/
* printcmd.c (ALL_DISPLAYS_SAFE): New.
(map_display_numbers): New.
(do_delete_display): New.
(undisplay_command): Use map_display_numbers.
(do_enable_disable_display): New.
(enable_disable_display_command): New function.
(enable_display): Delete.
(enable_display_command): New.
(disable_display_command): Reimplement.
(_initialize_printcmd): Adjust "enable display" command to use
`enable_display_command' as callback.

gdb/doc/
* gdb.texinfo (Auto Display) <undisplay, enable display, disable
display>: Explain that the commands accept number ranges.

---
gdb/doc/gdb.texinfo | 16 ++++-
gdb/printcmd.c | 150 +++++++++++++++++++++++++++-------------------------
2 files changed, 94 insertions(+), 72 deletions(-)

Index: src/gdb/printcmd.c
===================================================================
--- src.orig/gdb/printcmd.c 2011-03-14 12:40:01.000000000 +0000
+++ src/gdb/printcmd.c 2011-03-14 21:12:20.148353561 +0000
@@ -168,11 +168,18 @@ static struct display *display_chain;

static int display_number;

-/* Walk the following statement or block through all displays. */
+/* Walk the following statement or block through all displays.
+ ALL_DISPLAYS_SAFE does so even if the statement deletes the current
+ display. */

#define ALL_DISPLAYS(B) \
for (B = display_chain; B; B = B->next)

+#define ALL_DISPLAYS_SAFE(B,TMP) \
+ for (B = display_chain; \
+ B ? (TMP = B->next, 1): 0; \
+ B = TMP)
+
/* Prototypes for exported functions. */

void output_command (char *, int);
@@ -1583,24 +1590,24 @@ delete_display (struct display *display)
free_display (display);
}

-/* Delete some values from the auto-display chain.
- Specify the element numbers. */
+/* Call FUNCTION on each of the displays whose numbers are given in
+ ARGS. DATA is passed unmodified to FUNCTION. */

static void
-undisplay_command (char *args, int from_tty)
+map_display_numbers (char *args,
+ void (*function) (struct display *,
+ void *),
+ void *data)
{
- int num;
struct get_number_or_range_state state;
+ struct display *b, *tmp;
+ int num;

- if (args == 0)
- {
- if (query (_("Delete all auto-display expressions? ")))
- clear_displays ();
- dont_repeat ();
- return;
- }
+ if (args == NULL)
+ error_no_arg (_("one or more display numbers"));

init_number_or_range (&state, args);
+
while (!state.finished)
{
char *p = state.string;
@@ -1610,17 +1617,44 @@ undisplay_command (char *args, int from_
warning (_("bad display number at or near '%s'"), p);
else
{
- struct display *d;
+ struct display *d, *tmp;

- ALL_DISPLAYS (d)
+ ALL_DISPLAYS_SAFE (d, tmp)
if (d->number == num)
break;
if (d == NULL)
printf_unfiltered (_("No display number %d.\n"), num);
else
- delete_display (d);
+ function (d, data);
}
}
+}
+
+/* Callback for map_display_numbers, that deletes a display. */
+
+static void
+do_delete_display (struct display *d, void *data)
+{
+ delete_display (d);
+}
+
+/* "undisplay" command. */
+
+static void
+undisplay_command (char *args, int from_tty)
+{
+ int num;
+ struct get_number_or_range_state state;
+
+ if (args == NULL)
+ {
+ if (query (_("Delete all auto-display expressions? ")))
+ clear_displays ();
+ dont_repeat ();
+ return;
+ }
+
+ map_display_numbers (args, do_delete_display, NULL);
dont_repeat ();
}

@@ -1823,71 +1857,47 @@ Num Enb Expression\n"));
}
}

+/* Callback fo map_display_numbers, that enables or disable the passed
+ in display D. */
+
static void
-enable_display (char *args, int from_tty)
+do_enable_disable_display (struct display *d, void *data)
{
- char *p = args;
- char *p1;
- int num;
- struct display *d;
+ d->enabled_p = *(int *) data;
+}
+
+/* Implamentation of both the "disable display" and "enable display"
+ commands. ENABLE decides what to do. */

- if (p == 0)
+static void
+enable_disable_display_command (char *args, int from_tty, int enable)
+{
+ if (args == NULL)
{
- for (d = display_chain; d; d = d->next)
- d->enabled_p = 1;
+ struct display *d;
+
+ ALL_DISPLAYS (d)
+ d->enabled_p = enable;
+ return;
}
- else
- while (*p)
- {
- p1 = p;
- while (*p1 >= '0' && *p1 <= '9')
- p1++;
- if (*p1 && *p1 != ' ' && *p1 != '\t')
- error (_("Arguments must be display numbers."));
-
- num = atoi (p);
-
- for (d = display_chain; d; d = d->next)
- if (d->number == num)
- {
- d->enabled_p = 1;
- goto win;
- }
- printf_unfiltered (_("No display number %d.\n"), num);
- win:
- p = p1;
- while (*p == ' ' || *p == '\t')
- p++;
- }
+
+ map_display_numbers (args, do_enable_disable_display, &enable);
}

+/* The "enable display" command. */
+
static void
-disable_display_command (char *args, int from_tty)
+enable_display_command (char *args, int from_tty)
{
- char *p = args;
- char *p1;
- struct display *d;
-
- if (p == 0)
- {
- for (d = display_chain; d; d = d->next)
- d->enabled_p = 0;
- }
- else
- while (*p)
- {
- p1 = p;
- while (*p1 >= '0' && *p1 <= '9')
- p1++;
- if (*p1 && *p1 != ' ' && *p1 != '\t')
- error (_("Arguments must be display numbers."));
+ enable_disable_display_command (args, from_tty, 1);
+}

- disable_display (atoi (p));
+/* The "disable display" command. */

- p = p1;
- while (*p == ' ' || *p == '\t')
- p++;
- }
+static void
+disable_display_command (char *args, int from_tty)
+{
+ enable_disable_display_command (args, from_tty, 0);
}

/* display_chain items point to blocks and expressions. Some expressions in
@@ -2749,7 +2759,7 @@ and examining is done as in the \"x\" co
With no argument, display all currently requested auto-display expressions.\n\
Use \"undisplay\" to cancel display requests previously made."));

- add_cmd ("display", class_vars, enable_display, _("\
+ add_cmd ("display", class_vars, enable_display_command, _("\
Enable some expressions to be displayed when program stops.\n\
Arguments are the code numbers of the expressions to resume displaying.\n\
No argument means enable all automatic-display expressions.\n\
Index: src/gdb/doc/gdb.texinfo
===================================================================
--- src.orig/gdb/doc/gdb.texinfo 2011-03-14 20:47:04.000000000 +0000
+++ src/gdb/doc/gdb.texinfo 2011-03-14 20:47:26.598353561 +0000
@@ -7647,7 +7647,11 @@ is a common name for the program counter
@kindex undisplay
@item undisplay @var{dnums}@dots{}
@itemx delete display @var{dnums}@dots{}
-Remove item numbers @var{dnums} from the list of expressions to display.
+Remove items from the list of expressions to display. Specify the
+numbers of the displays that you want affected with the command
+argument @var{dnums}. It can be a single display number, one of the
+numbers shown in the first field of the @samp{info display} display;
+or it could be a range of display numbers, as in @code{2-4}.

@code{undisplay} does not repeat if you press @key{RET} after using it.
(Otherwise you would just get the error @samp{No display number @dots{}}.)
@@ -7656,12 +7660,20 @@ Remove item numbers @var{dnums} from the
@item disable display @var{dnums}@dots{}
Disable the display of item numbers @var{dnums}. A disabled display
item is not printed automatically, but is not forgotten. It may be
-enabled again later.
+enabled again later. Specify the numbers of the displays that you
+want affected with the command argument @var{dnums}. It can be a
+single display number, one of the numbers shown in the first field of
+the @samp{info display} display; or it could be a range of display
+numbers, as in @code{2-4}.

@kindex enable display
@item enable display @var{dnums}@dots{}
Enable display of item numbers @var{dnums}. It becomes effective once
again in auto display of its expression, until you specify otherwise.
+Specify the numbers of the displays that you want affected with the
+command argument @var{dnums}. It can be a single display number, one
+of the numbers shown in the first field of the @samp{info display}
+display; or it could be a range of display numbers, as in @code{2-4}.

@item display
Display the current values of the expressions on the list, just as is