* breakpoint.c (wrap_indent_at_field): New function.
authorUlrich Weigand <uweigand@de.ibm.com>
Mon, 28 Feb 2011 15:21:21 +0000 (15:21 +0000)
committerUlrich Weigand <uweigand@de.ibm.com>
Mon, 28 Feb 2011 15:21:21 +0000 (15:21 +0000)
(print_breakpoint_location): Use it instead of WRAP_INDENT argument.
Allocate ui_stream locally instead of using STB argument.
(print_one_breakpoint_location): Update call.
* ui-out.c (ui_out_query_field): New function.
* ui-out.h (ui_out_query_field): Add prototype.

gdb/ChangeLog
gdb/breakpoint.c
gdb/ui-out.c
gdb/ui-out.h

index 682c9f1b3566eb560c3e741a54972ac20659b021..a821470f5f415041e9d31f3e86bb42636be976c2 100644 (file)
@@ -1,3 +1,12 @@
+2011-02-28  Ulrich Weigand  <uweigand@de.ibm.com>
+
+       * breakpoint.c (wrap_indent_at_field): New function.
+       (print_breakpoint_location): Use it instead of WRAP_INDENT argument.
+       Allocate ui_stream locally instead of using STB argument.
+       (print_one_breakpoint_location): Update call.
+       * ui-out.c (ui_out_query_field): New function.
+       * ui-out.h (ui_out_query_field): Add prototype.
+
 2011-02-28  Joel Brobecker  <brobecker@adacore.com>
 
        From Michael Snyder  <msnyder@vmware.com>
index 490084e59c5311842f37f7f0dba671ac8da247fb..a38fed9ae9846a5bb08347af9b6eb157d068ab5b 100644 (file)
@@ -4565,12 +4565,40 @@ bpstat_causes_stop (bpstat bs)
 
 \f
 
+/* Compute a string of spaces suitable to indent the next line
+   so it starts at the position corresponding to the table column
+   named COL_NAME in the currently active table of UIOUT.  */
+
+static char *
+wrap_indent_at_field (struct ui_out *uiout, const char *col_name)
+{
+  static char wrap_indent[80];
+  int i, total_width, width, align;
+  char *text;
+
+  total_width = 0;
+  for (i = 1; ui_out_query_field (uiout, i, &width, &align, &text); i++)
+    {
+      if (strcmp (text, col_name) == 0)
+       {
+         gdb_assert (total_width < sizeof wrap_indent);
+         memset (wrap_indent, ' ', total_width);
+         wrap_indent[total_width] = 0;
+
+         return wrap_indent;
+       }
+
+      total_width += width + 1;
+    }
+
+  return NULL;
+}
+
 /* Print the LOC location out of the list of B->LOC locations.  */
 
-static void print_breakpoint_location (struct breakpoint *b,
-                                      struct bp_location *loc,
-                                      char *wrap_indent,
-                                      struct ui_stream *stb)
+static void
+print_breakpoint_location (struct breakpoint *b,
+                          struct bp_location *loc)
 {
   struct cleanup *old_chain = save_current_program_space ();
 
@@ -4589,8 +4617,9 @@ static void print_breakpoint_location (struct breakpoint *b,
          ui_out_text (uiout, "in ");
          ui_out_field_string (uiout, "func",
                               SYMBOL_PRINT_NAME (sym));
-         ui_out_wrap_hint (uiout, wrap_indent);
-         ui_out_text (uiout, " at ");
+         ui_out_text (uiout, " ");
+         ui_out_wrap_hint (uiout, wrap_indent_at_field (uiout, "what"));
+         ui_out_text (uiout, "at ");
        }
       ui_out_field_string (uiout, "file", b->source_file);
       ui_out_text (uiout, ":");
@@ -4608,9 +4637,14 @@ static void print_breakpoint_location (struct breakpoint *b,
     }
   else if (loc)
     {
+      struct ui_stream *stb = ui_out_stream_new (uiout);
+      struct cleanup *stb_chain = make_cleanup_ui_out_stream_delete (stb);
+
       print_address_symbolic (loc->gdbarch, loc->address, stb->stream,
                              demangle, "");
       ui_out_field_stream (uiout, "at", stb);
+
+      do_cleanups (stb_chain);
     }
   else
     ui_out_field_string (uiout, "pending", b->addr_string);
@@ -4679,9 +4713,6 @@ print_one_breakpoint_location (struct breakpoint *b,
 {
   struct command_line *l;
   static char bpenables[] = "nynny";
-  char wrap_indent[80];
-  struct ui_stream *stb = ui_out_stream_new (uiout);
-  struct cleanup *old_chain = make_cleanup_ui_out_stream_delete (stb);
   struct cleanup *bkpt_chain;
 
   int header_of_multiple = 0;
@@ -4743,15 +4774,6 @@ print_one_breakpoint_location (struct breakpoint *b,
 
   
   /* 5 and 6 */
-  strcpy (wrap_indent, "                           ");
-  if (opts.addressprint)
-    {
-      if (print_address_bits <= 32)
-       strcat (wrap_indent, "           ");
-      else
-       strcat (wrap_indent, "                   ");
-    }
-
   if (b->ops != NULL && b->ops->print_one != NULL)
     {
       /* Although the print_one can possibly print all locations,
@@ -4816,7 +4838,7 @@ print_one_breakpoint_location (struct breakpoint *b,
          }
        annotate_field (5);
        if (!header_of_multiple)
-         print_breakpoint_location (b, loc, wrap_indent, stb);
+         print_breakpoint_location (b, loc);
        if (b->loc)
          *last_loc = b->loc;
        break;
@@ -4972,7 +4994,6 @@ print_one_breakpoint_location (struct breakpoint *b,
     }
        
   do_cleanups (bkpt_chain);
-  do_cleanups (old_chain);
 }
 
 static void
index 53ad963a648d0b5b45b614e2f35c7c87428e97d3..72a34f88d9efc2bb44aca270128b0ba15c7fcb0e 100644 (file)
@@ -1141,6 +1141,28 @@ ui_out_data (struct ui_out *uiout)
   return uiout->data;
 }
 
+/* Access table field parameters.  */
+int
+ui_out_query_field (struct ui_out *uiout, int colno,
+                   int *width, int *alignment, char **col_name)
+{
+  struct ui_out_hdr *hdr;
+
+  if (!uiout->table.flag)
+    return 0;
+
+  for (hdr = uiout->table.header_first; hdr; hdr = hdr->next)
+    if (hdr->colno == colno)
+      {
+       *width = hdr->width;
+       *alignment = hdr->alignment;
+       *col_name = hdr->col_name;
+       return 1;
+      }
+
+  return 0;
+}
+
 /* Initalize private members at startup.  */
 
 struct ui_out *
index 4ad0651ad37b6202f4d46d3c5084f33b43c254de..5265902265f02202f003614a934b8be2712fb394 100644 (file)
@@ -156,6 +156,9 @@ extern int ui_out_get_verblvl (struct ui_out *uiout);
 
 extern int ui_out_test_flags (struct ui_out *uiout, int mask);
 
+extern int ui_out_query_field (struct ui_out *uiout, int colno,
+                              int *width, int *alignment, char **col_name);
+
 #if 0
 extern void ui_out_result_begin (struct ui_out *uiout, char *class);