gdb/
authorPedro Alves <palves@redhat.com>
Tue, 15 Mar 2011 14:05:38 +0000 (14:05 +0000)
committerPedro Alves <palves@redhat.com>
Tue, 15 Mar 2011 14:05:38 +0000 (14:05 +0000)
* 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/ChangeLog
gdb/doc/ChangeLog
gdb/doc/gdb.texinfo
gdb/printcmd.c

index ee87b642a5a2ffdfc991bad42c70e244ea37c563..f441a9fda2ab09c25ba4b28aef179e70db10507c 100644 (file)
@@ -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.
index f0fa2ca65a2d974105bc4cc6f5238d812a715500..b7f63eb128539a7393049fd9809ee9e28d82573c 100644 (file)
@@ -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
index 01455d1e0960d52ea9a82e81dff475ab67cd35f4..0eeb38cfc666283405e7e3b6d8481127ca337672 100644 (file)
@@ -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
index efc89cfb0dfb3ec9ba65d03f982bcc4045476a54..81360ada90cdbc83a966357329437a7c5e573f8b 100644 (file)
@@ -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\