aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--gdb/ChangeLog14
-rw-r--r--gdb/doc/ChangeLog5
-rw-r--r--gdb/doc/gdb.texinfo16
-rw-r--r--gdb/printcmd.c148
4 files changed, 112 insertions, 71 deletions
diff --git a/gdb/ChangeLog b/gdb/ChangeLog
index ee87b64..f441a9f 100644
--- a/gdb/ChangeLog
+++ b/gdb/ChangeLog
@@ -1,3 +1,17 @@
+2011-03-15 Pedro Alves <pedro@codesourcery.com>
+
+ * 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.
+
2011-03-14 Phil Muldoon <pmuldoon@redhat.com>
* NEWS: Add Python breakpoint 'stop' operation.
diff --git a/gdb/doc/ChangeLog b/gdb/doc/ChangeLog
index f0fa2ca..b7f63eb 100644
--- a/gdb/doc/ChangeLog
+++ b/gdb/doc/ChangeLog
@@ -1,3 +1,8 @@
+2011-03-15 Pedro Alves <pedro@codesourcery.com>
+
+ * gdb.texinfo (Auto Display) <undisplay, enable display, disable
+ display>: Explain that the commands accept number ranges.
+
2011-03-14 Phil Muldoon <pmuldoon@redhat.com>
* gdb.texinfo (Breakpoints In Python): Add description and example
diff --git a/gdb/doc/gdb.texinfo b/gdb/doc/gdb.texinfo
index 01455d1..0eeb38c 100644
--- a/gdb/doc/gdb.texinfo
+++ b/gdb/doc/gdb.texinfo
@@ -7647,7 +7647,11 @@ is a common name for the program counter; @pxref{Registers, ,Registers}).
@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 list of expressions to display.
@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
diff --git a/gdb/printcmd.c b/gdb/printcmd.c
index efc89cf..81360ad 100644
--- a/gdb/printcmd.c
+++ b/gdb/printcmd.c
@@ -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_tty)
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 disables 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;
+}
- if (p == 0)
+/* Implamentation of both the "disable display" and "enable display"
+ commands. ENABLE decides what to do. */
+
+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;
- }
- else
- while (*p)
- {
- p1 = p;
- while (*p1 >= '0' && *p1 <= '9')
- p1++;
- if (*p1 && *p1 != ' ' && *p1 != '\t')
- error (_("Arguments must be display numbers."));
+ struct display *d;
- num = atoi (p);
+ ALL_DISPLAYS (d)
+ d->enabled_p = enable;
+ return;
+ }
- 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\" command.\n\n\
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\