diff options
Diffstat (limited to 'gdb/printcmd.c')
-rw-r--r-- | gdb/printcmd.c | 148 |
1 files changed, 79 insertions, 69 deletions
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\ |