2010-07-30 Hui Zhu <teawater@gmail.com>
[deliverable/binutils-gdb.git] / gdb / ui-out.c
index 53abebf2485756ea8aa85378aa84b66a36c9b079..4d3bf0cd34b52185fa88b1df6b9d15fcd7da12f8 100644 (file)
@@ -1,6 +1,7 @@
 /* Output generating routines for GDB.
 
-   Copyright 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
+   Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2008, 2009, 2010
+   Free Software Foundation, Inc.
 
    Contributed by Cygnus Solutions.
    Written by Fernando Nasser for Cygnus.
@@ -9,7 +10,7 @@
 
    This program is free software; you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
-   the Free Software Foundation; either version 2 of the License, or
+   the Free Software Foundation; either version 3 of the License, or
    (at your option) any later version.
 
    This program is distributed in the hope that it will be useful,
@@ -18,9 +19,7 @@
    GNU General Public License for more details.
 
    You should have received a copy of the GNU General Public License
-   along with this program; if not, write to the Free Software
-   Foundation, Inc., 59 Temple Place - Suite 330,
-   Boston, MA 02111-1307, USA.  */
+   along with this program.  If not, see <http://www.gnu.org/licenses/>.  */
 
 #include "defs.h"
 #include "gdb_string.h"
@@ -45,7 +44,7 @@ struct ui_out_hdr
    is always available.  Stack/nested level 0 is reserved for the
    top-level result. */
 
-enum { MAX_UI_OUT_LEVELS = 6 };
+enum { MAX_UI_OUT_LEVELS = 8 };
 
 struct ui_out_level
   {
@@ -101,7 +100,7 @@ struct ui_out
     int flags;
     /* specific implementation of ui-out */
     struct ui_out_impl *impl;
-    struct ui_out_data *data;
+    void *data;
 
     /* Sub structure tracking the ui-out depth.  */
     int level;
@@ -125,6 +124,7 @@ push_level (struct ui_out *uiout,
            const char *id)
 {
   struct ui_out_level *current;
+
   /* We had better not overflow the buffer. */
   uiout->level++;
   gdb_assert (uiout->level >= 0 && uiout->level < MAX_UI_OUT_LEVELS);
@@ -178,12 +178,12 @@ static void default_field_fmt (struct ui_out *uiout, int fldno,
                               int width, enum ui_align align,
                               const char *fldname,
                               const char *format,
-                              va_list args);
+                              va_list args) ATTRIBUTE_PRINTF (6, 0);
 static void default_spaces (struct ui_out *uiout, int numspaces);
 static void default_text (struct ui_out *uiout, const char *string);
 static void default_message (struct ui_out *uiout, int verbosity,
                             const char *format,
-                            va_list args);
+                            va_list args) ATTRIBUTE_PRINTF (3, 0);
 static void default_wrap_hint (struct ui_out *uiout, char *identstring);
 static void default_flush (struct ui_out *uiout);
 
@@ -243,16 +243,15 @@ static void uo_field_int (struct ui_out *uiout, int fldno, int width,
                          enum ui_align align, const char *fldname, int value);
 static void uo_field_skip (struct ui_out *uiout, int fldno, int width,
                           enum ui_align align, const char *fldname);
-static void uo_field_string (struct ui_out *uiout, int fldno, int width,
-                            enum ui_align align, const char *fldname,
-                            const char *string);
 static void uo_field_fmt (struct ui_out *uiout, int fldno, int width,
                          enum ui_align align, const char *fldname,
-                         const char *format, va_list args);
+                         const char *format, va_list args)
+     ATTRIBUTE_PRINTF (6, 0);
 static void uo_spaces (struct ui_out *uiout, int numspaces);
 static void uo_text (struct ui_out *uiout, const char *string);
 static void uo_message (struct ui_out *uiout, int verbosity,
-                       const char *format, va_list args);
+                       const char *format, va_list args)
+     ATTRIBUTE_PRINTF (3, 0);
 static void uo_wrap_hint (struct ui_out *uiout, char *identstring);
 static void uo_flush (struct ui_out *uiout);
 static int uo_redirect (struct ui_out *uiout, struct ui_file *outstream);
@@ -373,6 +372,7 @@ ui_out_begin (struct ui_out *uiout,
              const char *id)
 {
   int new_level;
+
   if (uiout->table.flag && !uiout->table.body_flag)
     internal_error (__FILE__, __LINE__,
                    _("table header or table_body expected; lists must be \
@@ -389,6 +389,7 @@ specified after table_body."));
     int fldno;
     int width;
     int align;
+
     verify_field (uiout, &fldno, &width, &align);
   }
 
@@ -408,6 +409,7 @@ ui_out_end (struct ui_out *uiout,
            enum ui_out_type type)
 {
   int old_level = pop_level (uiout, type);
+
   uo_end (uiout, type, old_level);
 }
 
@@ -421,6 +423,7 @@ static void
 do_cleanup_end (void *data)
 {
   struct ui_out_end_cleanup_data *end_cleanup_data = data;
+
   ui_out_end (end_cleanup_data->uiout, end_cleanup_data->type);
   xfree (end_cleanup_data);
 }
@@ -430,6 +433,7 @@ make_cleanup_ui_out_end (struct ui_out *uiout,
                         enum ui_out_type type)
 {
   struct ui_out_end_cleanup_data *end_cleanup_data;
+
   end_cleanup_data = XMALLOC (struct ui_out_end_cleanup_data);
   end_cleanup_data->uiout = uiout;
   end_cleanup_data->type = type;
@@ -460,7 +464,6 @@ ui_out_field_int (struct ui_out *uiout,
   int fldno;
   int width;
   int align;
-  struct ui_out_level *current = current_level (uiout);
 
   verify_field (uiout, &fldno, &width, &align);
 
@@ -477,7 +480,6 @@ ui_out_field_fmt_int (struct ui_out *uiout,
   int fldno;
   int width;
   int align;
-  struct ui_out_level *current = current_level (uiout);
 
   verify_field (uiout, &fldno, &width, &align);
 
@@ -487,15 +489,19 @@ ui_out_field_fmt_int (struct ui_out *uiout,
 void
 ui_out_field_core_addr (struct ui_out *uiout,
                        const char *fldname,
+                       struct gdbarch *gdbarch,
                        CORE_ADDR address)
 {
   char addstr[20];
+  int addr_bit = gdbarch_addr_bit (gdbarch);
+
+  if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
+    address &= ((CORE_ADDR) 1 << addr_bit) - 1;
 
   /* FIXME: cagney/2002-05-03: Need local_address_string() function
      that returns the language localized string formatted to a width
-     based on TARGET_ADDR_BIT.  */
-  /* print_address_numeric (address, 1, local_stream); */
-  if (TARGET_ADDR_BIT <= 32)
+     based on gdbarch_addr_bit.  */
+  if (addr_bit <= 32)
     strcpy (addstr, hex_string_custom (address, 8));
   else
     strcpy (addstr, hex_string_custom (address, 16));
@@ -511,6 +517,7 @@ ui_out_field_stream (struct ui_out *uiout,
   long length;
   char *buffer = ui_file_xstrdup (buf->stream, &length);
   struct cleanup *old_cleanup = make_cleanup (xfree, buffer);
+
   if (length > 0)
     ui_out_field_string (uiout, fldname, buffer);
   else
@@ -589,9 +596,7 @@ ui_out_message (struct ui_out *uiout, int verbosity,
   va_list args;
 
   va_start (args, format);
-
   uo_message (uiout, verbosity, format, args);
-
   va_end (args);
 }
 
@@ -651,7 +656,6 @@ ui_out_set_flags (struct ui_out *uiout, int mask)
   int oldflags = uiout->flags;
 
   uiout->flags |= mask;
-
   return oldflags;
 }
 
@@ -662,7 +666,6 @@ ui_out_clear_flags (struct ui_out *uiout, int mask)
   int oldflags = uiout->flags;
 
   uiout->flags &= ~mask;
-
   return oldflags;
 }
 
@@ -1028,15 +1031,20 @@ append_header_to_list (struct ui_out *uiout,
   temphdr = XMALLOC (struct ui_out_hdr);
   temphdr->width = width;
   temphdr->alignment = alignment;
-  /* we have to copy the column title as the original may be an automatic */
+  /* We have to copy the column title as the original may be an
+     automatic.  */
   if (colhdr != NULL)
     temphdr->colhdr = xstrdup (colhdr);
   else
     temphdr->colhdr = NULL;
+
   if (col_name != NULL)
+    temphdr->col_name = xstrdup (col_name);
+  else if (colhdr != NULL)
     temphdr->col_name = xstrdup (colhdr);
   else
-    temphdr->col_name = xstrdup (colhdr);
+    temphdr->col_name = NULL;
+
   temphdr->next = NULL;
   if (uiout->table.header_first == NULL)
     {
@@ -1127,7 +1135,7 @@ ui_out_get_field_separator (struct ui_out *uiout)
 
 /* Access to ui-out members data */
 
-struct ui_out_data *
+void *
 ui_out_data (struct ui_out *uiout)
 {
   return uiout->data;
@@ -1136,11 +1144,11 @@ ui_out_data (struct ui_out *uiout)
 /* initalize private members at startup */
 
 struct ui_out *
-ui_out_new (struct ui_out_impl *impl,
-           struct ui_out_data *data,
+ui_out_new (struct ui_out_impl *impl, void *data,
            int flags)
 {
   struct ui_out *uiout = XMALLOC (struct ui_out);
+
   uiout->data = data;
   uiout->impl = impl;
   uiout->flags = flags;
This page took 0.026974 seconds and 4 git commands to generate.