2011-03-18 Phil Muldoon <pmuldoon@redhat.com>
[deliverable/binutils-gdb.git] / gdb / printcmd.c
index ebca5a3142e1f6a08a11c52e7031288db68d96de..81360ada90cdbc83a966357329437a7c5e573f8b 100644 (file)
@@ -49,7 +49,6 @@
 #include "parser-defs.h"
 #include "charset.h"
 #include "arch-utils.h"
-#include "printcmd.h"
 #include "cli/cli-utils.h"
 
 #ifdef TUI
@@ -169,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);
@@ -334,8 +340,8 @@ print_formatted (struct value *val, int size,
       || TYPE_CODE (type) == TYPE_CODE_NAMESPACE)
     value_print (val, stream, options);
   else
-    /* User specified format, so don't look to the the type to
-       tell us what to do.  */
+    /* User specified format, so don't look to the type to tell us
+       what to do.  */
     val_print_scalar_formatted (type,
                                value_contents_for_printing (val),
                                value_embedded_offset (val),
@@ -534,7 +540,7 @@ print_scalar_formatted (const void *valaddr, struct type *type,
            if (*cp == '\0')
              cp--;
          }
-       strcpy (buf, cp);
+       strncpy (buf, cp, sizeof (bits));
        fputs_filtered (buf, stream);
       }
       break;
@@ -1584,46 +1590,71 @@ 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)
 {
-  char *p = args;
-  char *p1;
+  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 (*p)
+  while (!state.finished)
     {
-      p1 = p;
+      char *p = state.string;
 
-      num = get_number_or_range (&p1);
+      num = get_number_or_range (&state);
       if (num == 0)
        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;
 
-      p = p1;
+  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 ();
 }
 
@@ -1826,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
@@ -1962,9 +1969,10 @@ print_variable_and_value (const char *name, struct symbol *var,
   fprintf_filtered (stream, "\n");
 }
 
-void
-string_printf (char *arg, struct ui_file *stream, printf_callback callback,
-              void *loc_v, void *aexpr_v)
+/* printf "printf format string" ARG to STREAM.  */
+
+static void
+ui_printf (char *arg, struct ui_file *stream)
 {
   char *f = NULL;
   char *s = arg;
@@ -1975,8 +1983,6 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback,
   int nargs = 0;
   int allocated_args = 20;
   struct cleanup *old_cleanups;
-  struct bp_location *loc = loc_v;
-  struct agent_expr *aexpr = aexpr_v;
 
   val_args = xmalloc (allocated_args * sizeof (struct value *));
   old_cleanups = make_cleanup (free_current_contents, &val_args);
@@ -2295,42 +2301,26 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback,
     /* Now, parse all arguments and evaluate them.
        Store the VALUEs in VAL_ARGS.  */
 
-    if (callback)
-      current_substring = substrings;
     while (*s != '\0')
       {
        char *s1;
 
-       s1 = s;
        if (nargs == allocated_args)
          val_args = (struct value **) xrealloc ((char *) val_args,
                                                 (allocated_args *= 2)
                                                 * sizeof (struct value *));
-       if (callback)
-         {
-           if (nargs >= nargs_wanted)
-             error (_("Wrong number of arguments for specified "
-                      "format-string"));
-           callback (current_substring, &s1, loc, aexpr);
-           current_substring += strlen (current_substring) + 1;
-         }
-       else
-         val_args[nargs] = parse_to_comma_and_eval (&s1);
+       s1 = s;
+       val_args[nargs] = parse_to_comma_and_eval (&s1);
 
        nargs++;
        s = s1;
        if (*s == ',')
          s++;
       }
-    if (callback)
-      callback (last_arg, NULL, loc, aexpr);
 
     if (nargs != nargs_wanted)
       error (_("Wrong number of arguments for specified format-string"));
 
-    if (!stream)
-      goto after_print;
-
     /* Now actually print them.  */
     current_substring = substrings;
     for (i = 0; i < nargs; i++)
@@ -2685,17 +2675,15 @@ string_printf (char *arg, struct ui_file *stream, printf_callback callback,
        by default, which will warn here if there is no argument.  */
     fprintf_filtered (stream, last_arg, 0);
   }
-
-after_print:
   do_cleanups (old_cleanups);
 }
 
 /* Implement the "printf" command.  */
 
-void
+static void
 printf_command (char *arg, int from_tty)
 {
-  string_printf (arg, gdb_stdout, NULL, NULL, NULL);
+  ui_printf (arg, gdb_stdout);
 }
 
 /* Implement the "eval" command.  */
@@ -2707,7 +2695,7 @@ eval_command (char *arg, int from_tty)
   struct cleanup *cleanups = make_cleanup_ui_file_delete (ui_out);
   char *expanded;
 
-  string_printf (arg, ui_out, NULL, NULL, NULL);
+  ui_printf (arg, ui_out);
 
   expanded = ui_file_xstrdup (ui_out, NULL);
   make_cleanup (xfree, expanded);
@@ -2771,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\
This page took 0.029632 seconds and 4 git commands to generate.