diff options
-rw-r--r-- | gdb/ChangeLog | 14 | ||||
-rw-r--r-- | gdb/doc/ChangeLog | 5 | ||||
-rw-r--r-- | gdb/doc/gdb.texinfo | 16 | ||||
-rw-r--r-- | gdb/printcmd.c | 148 |
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\ |