2010-05-16 Michael Snyder <msnyder@vmware.com>
[deliverable/binutils-gdb.git] / gdb / ui-out.c
index 4a4a9228540c7d077f342a8de59a11677637f30f..4d3bf0cd34b52185fa88b1df6b9d15fcd7da12f8 100644 (file)
@@ -1,6 +1,7 @@
 /* Output generating routines for GDB.
 
 /* Output generating routines for GDB.
 
-   Copyright 1999, 2000, 2001, 2002 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.
 
    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
 
    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,
    (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
    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"
 
 #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. */
 
    is always available.  Stack/nested level 0 is reserved for the
    top-level result. */
 
-enum { MAX_UI_OUT_LEVELS = 5 };
+enum { MAX_UI_OUT_LEVELS = 8 };
 
 struct ui_out_level
   {
 
 struct ui_out_level
   {
@@ -101,7 +100,7 @@ struct ui_out
     int flags;
     /* specific implementation of ui-out */
     struct ui_out_impl *impl;
     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;
 
     /* 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;
            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);
   /* 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,
                               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,
 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);
 
 static void default_wrap_hint (struct ui_out *uiout, char *identstring);
 static void default_flush (struct ui_out *uiout);
 
@@ -206,6 +206,7 @@ struct ui_out_impl default_ui_out_impl =
   default_message,
   default_wrap_hint,
   default_flush,
   default_message,
   default_wrap_hint,
   default_flush,
+  NULL,
   0, /* Does not need MI hacks.  */
 };
 
   0, /* Does not need MI hacks.  */
 };
 
@@ -242,18 +243,18 @@ 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);
                          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,
 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,
 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 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);
 
 /* Prototypes for local functions */
 
 
 /* Prototypes for local functions */
 
@@ -267,21 +268,19 @@ static void clear_header_list (struct ui_out *uiout);
 static void verify_field (struct ui_out *uiout, int *fldno, int *width,
                          int *align);
 
 static void verify_field (struct ui_out *uiout, int *fldno, int *width,
                          int *align);
 
-static void init_ui_out_state (struct ui_out *uiout);
-
 /* exported functions (ui_out API) */
 
 /* Mark beginning of a table */
 
 /* exported functions (ui_out API) */
 
 /* Mark beginning of a table */
 
-void
+static void
 ui_out_table_begin (struct ui_out *uiout, int nbrofcols,
                    int nr_rows,
                    const char *tblid)
 {
   if (uiout->table.flag)
     internal_error (__FILE__, __LINE__,
 ui_out_table_begin (struct ui_out *uiout, int nbrofcols,
                    int nr_rows,
                    const char *tblid)
 {
   if (uiout->table.flag)
     internal_error (__FILE__, __LINE__,
-                   "tables cannot be nested; table_begin found before \
-previous table_end.");
+                   _("tables cannot be nested; table_begin found before \
+previous table_end."));
 
   uiout->table.flag = 1;
   uiout->table.body_flag = 0;
 
   uiout->table.flag = 1;
   uiout->table.body_flag = 0;
@@ -301,16 +300,16 @@ ui_out_table_body (struct ui_out *uiout)
 {
   if (!uiout->table.flag)
     internal_error (__FILE__, __LINE__,
 {
   if (!uiout->table.flag)
     internal_error (__FILE__, __LINE__,
-                   "table_body outside a table is not valid; it must be \
-after a table_begin and before a table_end.");
+                   _("table_body outside a table is not valid; it must be \
+after a table_begin and before a table_end."));
   if (uiout->table.body_flag)
     internal_error (__FILE__, __LINE__,
   if (uiout->table.body_flag)
     internal_error (__FILE__, __LINE__,
-                   "extra table_body call not allowed; there must be \
-only one table_body after a table_begin and before a table_end.");
+                   _("extra table_body call not allowed; there must be \
+only one table_body after a table_begin and before a table_end."));
   if (uiout->table.header_next->colno != uiout->table.columns)
     internal_error (__FILE__, __LINE__,
   if (uiout->table.header_next->colno != uiout->table.columns)
     internal_error (__FILE__, __LINE__,
-                   "number of headers differ from number of table \
-columns.");
+                   _("number of headers differ from number of table \
+columns."));
 
   uiout->table.body_flag = 1;
   uiout->table.header_next = uiout->table.header_first;
 
   uiout->table.body_flag = 1;
   uiout->table.header_next = uiout->table.header_first;
@@ -318,12 +317,12 @@ columns.");
   uo_table_body (uiout);
 }
 
   uo_table_body (uiout);
 }
 
-void
+static void
 ui_out_table_end (struct ui_out *uiout)
 {
   if (!uiout->table.flag)
     internal_error (__FILE__, __LINE__,
 ui_out_table_end (struct ui_out *uiout)
 {
   if (!uiout->table.flag)
     internal_error (__FILE__, __LINE__,
-                   "misplaced table_end or missing table_begin.");
+                   _("misplaced table_end or missing table_begin."));
 
   uiout->table.entry_level = 0;
   uiout->table.body_flag = 0;
 
   uiout->table.entry_level = 0;
   uiout->table.body_flag = 0;
@@ -343,24 +342,41 @@ ui_out_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
 {
   if (!uiout->table.flag || uiout->table.body_flag)
     internal_error (__FILE__, __LINE__,
 {
   if (!uiout->table.flag || uiout->table.body_flag)
     internal_error (__FILE__, __LINE__,
-                   "table header must be specified after table_begin \
-and before table_body.");
+                   _("table header must be specified after table_begin \
+and before table_body."));
 
   append_header_to_list (uiout, width, alignment, col_name, colhdr);
 
   uo_table_header (uiout, width, alignment, col_name, colhdr);
 }
 
 
   append_header_to_list (uiout, width, alignment, col_name, colhdr);
 
   uo_table_header (uiout, width, alignment, col_name, colhdr);
 }
 
+static void
+do_cleanup_table_end (void *data)
+{
+  struct ui_out *ui_out = data;
+
+  ui_out_table_end (ui_out);
+}
+
+struct cleanup *
+make_cleanup_ui_out_table_begin_end (struct ui_out *ui_out, int nr_cols,
+                                     int nr_rows, const char *tblid)
+{
+  ui_out_table_begin (ui_out, nr_cols, nr_rows, tblid);
+  return make_cleanup (do_cleanup_table_end, ui_out);
+}
+
 void
 ui_out_begin (struct ui_out *uiout,
              enum ui_out_type type,
              const char *id)
 {
   int new_level;
 void
 ui_out_begin (struct ui_out *uiout,
              enum ui_out_type type,
              const char *id)
 {
   int new_level;
+
   if (uiout->table.flag && !uiout->table.body_flag)
     internal_error (__FILE__, __LINE__,
   if (uiout->table.flag && !uiout->table.body_flag)
     internal_error (__FILE__, __LINE__,
-                   "table header or table_body expected; lists must be \
-specified after table_body.");
+                   _("table header or table_body expected; lists must be \
+specified after table_body."));
 
   /* Be careful to verify the ``field'' before the new tuple/list is
      pushed onto the stack.  That way the containing list/table/row is
 
   /* Be careful to verify the ``field'' before the new tuple/list is
      pushed onto the stack.  That way the containing list/table/row is
@@ -373,6 +389,7 @@ specified after table_body.");
     int fldno;
     int width;
     int align;
     int fldno;
     int width;
     int align;
+
     verify_field (uiout, &fldno, &width, &align);
   }
 
     verify_field (uiout, &fldno, &width, &align);
   }
 
@@ -387,37 +404,13 @@ specified after table_body.");
   uo_begin (uiout, type, new_level, id);
 }
 
   uo_begin (uiout, type, new_level, id);
 }
 
-void
-ui_out_list_begin (struct ui_out *uiout,
-                  const char *id)
-{
-  ui_out_begin (uiout, ui_out_type_list, id);
-}
-
-void
-ui_out_tuple_begin (struct ui_out *uiout, const char *id)
-{
-  ui_out_begin (uiout, ui_out_type_tuple, id);
-}
-
 void
 ui_out_end (struct ui_out *uiout,
            enum ui_out_type type)
 {
   int old_level = pop_level (uiout, type);
 void
 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);
-}
 
 
-void
-ui_out_list_end (struct ui_out *uiout)
-{
-  ui_out_end (uiout, ui_out_type_list);
-}
-
-void
-ui_out_tuple_end (struct ui_out *uiout)
-{
-  ui_out_end (uiout, ui_out_type_tuple);
+  uo_end (uiout, type, old_level);
 }
 
 struct ui_out_end_cleanup_data
 }
 
 struct ui_out_end_cleanup_data
@@ -430,6 +423,7 @@ static void
 do_cleanup_end (void *data)
 {
   struct ui_out_end_cleanup_data *end_cleanup_data = data;
 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);
 }
   ui_out_end (end_cleanup_data->uiout, end_cleanup_data->type);
   xfree (end_cleanup_data);
 }
@@ -439,26 +433,18 @@ make_cleanup_ui_out_end (struct ui_out *uiout,
                         enum ui_out_type type)
 {
   struct ui_out_end_cleanup_data *end_cleanup_data;
                         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;
   return make_cleanup (do_cleanup_end, end_cleanup_data);
 }
 
   end_cleanup_data = XMALLOC (struct ui_out_end_cleanup_data);
   end_cleanup_data->uiout = uiout;
   end_cleanup_data->type = type;
   return make_cleanup (do_cleanup_end, end_cleanup_data);
 }
 
-struct cleanup *
-make_cleanup_ui_out_begin_end (struct ui_out *uiout,
-                              enum ui_out_type type,
-                              const char *id)
-{
-  ui_out_begin (uiout, type, id);
-  return make_cleanup_ui_out_end (uiout, type);
-}
-
 struct cleanup *
 make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
                                     const char *id)
 {
 struct cleanup *
 make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
                                     const char *id)
 {
-  ui_out_tuple_begin (uiout, id);
+  ui_out_begin (uiout, ui_out_type_tuple, id);
   return make_cleanup_ui_out_end (uiout, ui_out_type_tuple);
 }
 
   return make_cleanup_ui_out_end (uiout, ui_out_type_tuple);
 }
 
@@ -466,7 +452,7 @@ struct cleanup *
 make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
                                    const char *id)
 {
 make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
                                    const char *id)
 {
-  ui_out_list_begin (uiout, id);
+  ui_out_begin (uiout, ui_out_type_list, id);
   return make_cleanup_ui_out_end (uiout, ui_out_type_list);
 }
 
   return make_cleanup_ui_out_end (uiout, ui_out_type_list);
 }
 
@@ -478,28 +464,47 @@ ui_out_field_int (struct ui_out *uiout,
   int fldno;
   int width;
   int align;
   int fldno;
   int width;
   int align;
-  struct ui_out_level *current = current_level (uiout);
 
   verify_field (uiout, &fldno, &width, &align);
 
   uo_field_int (uiout, fldno, width, align, fldname, value);
 }
 
 
   verify_field (uiout, &fldno, &width, &align);
 
   uo_field_int (uiout, fldno, width, align, fldname, value);
 }
 
+void
+ui_out_field_fmt_int (struct ui_out *uiout,
+                      int input_width,
+                      enum ui_align input_align,
+                     const char *fldname,
+                     int value)
+{
+  int fldno;
+  int width;
+  int align;
+
+  verify_field (uiout, &fldno, &width, &align);
+
+  uo_field_int (uiout, fldno, input_width, input_align, fldname, value);
+}
+
 void
 ui_out_field_core_addr (struct ui_out *uiout,
                        const char *fldname,
 void
 ui_out_field_core_addr (struct ui_out *uiout,
                        const char *fldname,
+                       struct gdbarch *gdbarch,
                        CORE_ADDR address)
 {
   char addstr[20];
                        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
 
   /* 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)
-    strcpy (addstr, local_hex_string_custom (address, "08l"));
+     based on gdbarch_addr_bit.  */
+  if (addr_bit <= 32)
+    strcpy (addstr, hex_string_custom (address, 8));
   else
   else
-    strcpy (addstr, local_hex_string_custom (address, "016l"));
+    strcpy (addstr, hex_string_custom (address, 16));
 
   ui_out_field_string (uiout, fldname, addstr);
 }
 
   ui_out_field_string (uiout, fldname, addstr);
 }
@@ -512,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);
   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
   if (length > 0)
     ui_out_field_string (uiout, fldname, buffer);
   else
@@ -590,9 +596,7 @@ ui_out_message (struct ui_out *uiout, int verbosity,
   va_list args;
 
   va_start (args, format);
   va_list args;
 
   va_start (args, format);
-
   uo_message (uiout, verbosity, format, args);
   uo_message (uiout, verbosity, format, args);
-
   va_end (args);
 }
 
   va_end (args);
 }
 
@@ -639,6 +643,12 @@ ui_out_flush (struct ui_out *uiout)
   uo_flush (uiout);
 }
 
   uo_flush (uiout);
 }
 
+int
+ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream)
+{
+  return uo_redirect (uiout, outstream);
+}
+
 /* set the flags specified by the mask given */
 int
 ui_out_set_flags (struct ui_out *uiout, int mask)
 /* set the flags specified by the mask given */
 int
 ui_out_set_flags (struct ui_out *uiout, int mask)
@@ -646,7 +656,6 @@ ui_out_set_flags (struct ui_out *uiout, int mask)
   int oldflags = uiout->flags;
 
   uiout->flags |= mask;
   int oldflags = uiout->flags;
 
   uiout->flags |= mask;
-
   return oldflags;
 }
 
   return oldflags;
 }
 
@@ -657,7 +666,6 @@ ui_out_clear_flags (struct ui_out *uiout, int mask)
   int oldflags = uiout->flags;
 
   uiout->flags &= ~mask;
   int oldflags = uiout->flags;
 
   uiout->flags &= ~mask;
-
   return oldflags;
 }
 
   return oldflags;
 }
 
@@ -982,6 +990,15 @@ uo_flush (struct ui_out *uiout)
   uiout->impl->flush (uiout);
 }
 
   uiout->impl->flush (uiout);
 }
 
+int
+uo_redirect (struct ui_out *uiout, struct ui_file *outstream)
+{
+  if (!uiout->impl->redirect)
+    return -1;
+  uiout->impl->redirect (uiout, outstream);
+  return 0;
+}
+
 /* local functions */
 
 /* list of column headers manipulation routines */
 /* local functions */
 
 /* list of column headers manipulation routines */
@@ -1014,15 +1031,20 @@ append_header_to_list (struct ui_out *uiout,
   temphdr = XMALLOC (struct ui_out_hdr);
   temphdr->width = width;
   temphdr->alignment = alignment;
   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 (colhdr != NULL)
     temphdr->colhdr = xstrdup (colhdr);
   else
     temphdr->colhdr = NULL;
+
   if (col_name != 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);
   else
-    temphdr->col_name = xstrdup (colhdr);
+    temphdr->col_name = NULL;
+
   temphdr->next = NULL;
   if (uiout->table.header_first == NULL)
     {
   temphdr->next = NULL;
   if (uiout->table.header_first == NULL)
     {
@@ -1076,8 +1098,8 @@ verify_field (struct ui_out *uiout, int *fldno, int *width, int *align)
     {
       if (!uiout->table.body_flag)
        internal_error (__FILE__, __LINE__,
     {
       if (!uiout->table.body_flag)
        internal_error (__FILE__, __LINE__,
-                       "table_body missing; table fields must be \
-specified after table_body and inside a list.");
+                       _("table_body missing; table fields must be \
+specified after table_body and inside a list."));
       /* NOTE: cagney/2001-12-08: There was a check here to ensure
         that this code was only executed when uiout->level was
         greater than zero.  That no longer applies - this code is run
       /* NOTE: cagney/2001-12-08: There was a check here to ensure
         that this code was only executed when uiout->level was
         greater than zero.  That no longer applies - this code is run
@@ -1093,7 +1115,7 @@ specified after table_body and inside a list.");
     {
       if (*fldno != current->field_count)
        internal_error (__FILE__, __LINE__,
     {
       if (*fldno != current->field_count)
        internal_error (__FILE__, __LINE__,
-                       "ui-out internal error in handling headers.");
+                       _("ui-out internal error in handling headers."));
     }
   else
     {
     }
   else
     {
@@ -1113,7 +1135,7 @@ ui_out_get_field_separator (struct ui_out *uiout)
 
 /* Access to ui-out members data */
 
 
 /* Access to ui-out members data */
 
-struct ui_out_data *
+void *
 ui_out_data (struct ui_out *uiout)
 {
   return uiout->data;
 ui_out_data (struct ui_out *uiout)
 {
   return uiout->data;
@@ -1122,11 +1144,11 @@ ui_out_data (struct ui_out *uiout)
 /* initalize private members at startup */
 
 struct ui_out *
 /* 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);
            int flags)
 {
   struct ui_out *uiout = XMALLOC (struct ui_out);
+
   uiout->data = data;
   uiout->impl = impl;
   uiout->flags = flags;
   uiout->data = data;
   uiout->impl = impl;
   uiout->flags = flags;
This page took 0.031671 seconds and 4 git commands to generate.