Index: ChangeLog
[deliverable/binutils-gdb.git] / gdb / mi / mi-out.c
index 1aaac6afa34d638cff2e060c0a1cff382e049707..2aac5289829ae6ed05d6bab5e1b89fc67b104726 100644 (file)
@@ -1,5 +1,7 @@
 /* MI Command Set - output generating routines.
-   Copyright 2000 Free Software Foundation, Inc.
+
+   Copyright 2000, 2002, 2003 Free Software Foundation, Inc.
+
    Contributed by Cygnus Solutions (a Red Hat company).
 
    This file is part of GDB.
 #include "ui-out.h"
 #include "mi-out.h"
 
-/* Convenience macro for allocting typesafe memory. */
-
-#ifndef XMALLOC
-#define XMALLOC(TYPE) (TYPE*) xmalloc (sizeof (TYPE))
-#endif
-
 struct ui_out_data
   {
     int suppress_field_separator;
-    int first_header;
+    int suppress_output;
     int mi_version;
     struct ui_file *buffer;
   };
+typedef struct ui_out_data mi_out_data;
 
 /* These are the MI output functions */
 
@@ -44,7 +41,7 @@ static void mi_table_begin (struct ui_out *uiout, int nbrofcols,
 static void mi_table_body (struct ui_out *uiout);
 static void mi_table_end (struct ui_out *uiout);
 static void mi_table_header (struct ui_out *uiout, int width,
-                            enum ui_align alig,
+                            enum ui_align alig, const char *col_name,
                             const char *colhdr);
 static void mi_begin (struct ui_out *uiout, enum ui_out_type type,
                      int level, const char *id);
@@ -88,7 +85,8 @@ struct ui_out_impl mi_ui_out_impl =
   mi_text,
   mi_message,
   mi_wrap_hint,
-  mi_flush
+  mi_flush,
+  1, /* Needs MI hacks.  */
 };
 
 /* Prototypes for local functions */
@@ -105,13 +103,18 @@ static void out_field_fmt (struct ui_out *uiout, int fldno, char *fldname,
 /* Mark beginning of a table */
 
 void
-mi_table_begin (struct ui_out *uiout, int nbrofcols,
+mi_table_begin (struct ui_out *uiout,
+               int nr_cols,
                int nr_rows,
                const char *tblid)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   mi_open (uiout, tblid, ui_out_type_tuple);
-  data->first_header = 0;
+  mi_field_int (uiout, -1/*fldno*/, -1/*width*/, -1/*alin*/,
+               "nr_rows", nr_rows);
+  mi_field_int (uiout, -1/*fldno*/, -1/*width*/, -1/*alin*/,
+               "nr_cols", nr_cols);
+  mi_open (uiout, "hdr", ui_out_type_list);
 }
 
 /* Mark beginning of a table body */
@@ -119,10 +122,12 @@ mi_table_begin (struct ui_out *uiout, int nbrofcols,
 void
 mi_table_body (struct ui_out *uiout)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   /* close the table header line if there were any headers */
-  if (data->first_header)
-    mi_close (uiout, ui_out_type_tuple);
+  mi_close (uiout, ui_out_type_list);
+  mi_open (uiout, "body", ui_out_type_list);
 }
 
 /* Mark end of a table */
@@ -130,22 +135,28 @@ mi_table_body (struct ui_out *uiout)
 void
 mi_table_end (struct ui_out *uiout)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
+  data->suppress_output = 0;
+  mi_close (uiout, ui_out_type_list); /* body */
   mi_close (uiout, ui_out_type_tuple);
 }
 
 /* Specify table header */
 
 void
-mi_table_header (struct ui_out *uiout, int width, int alignment,
+mi_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
+                const char *col_name,
                 const char *colhdr)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
-  if (!data->first_header++)
-    {
-      mi_open (uiout, "hdr", ui_out_type_tuple);
-    }
-  mi_field_string (uiout, 0, width, alignment, 0, colhdr);
+  mi_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
+  mi_open (uiout, NULL, ui_out_type_tuple);
+  mi_field_int (uiout, 0, 0, 0, "width", width);
+  mi_field_int (uiout, 0, 0, 0, "alignment", alignment);
+  mi_field_string (uiout, 0, 0, 0, "col_name", col_name);
+  mi_field_string (uiout, 0, width, alignment, "colhdr", colhdr);
+  mi_close (uiout, ui_out_type_tuple);
 }
 
 /* Mark beginning of a list */
@@ -156,7 +167,9 @@ mi_begin (struct ui_out *uiout,
          int level,
          const char *id)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   mi_open (uiout, id, type);
 }
 
@@ -167,17 +180,22 @@ mi_end (struct ui_out *uiout,
        enum ui_out_type type,
        int level)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   mi_close (uiout, type);
 }
 
 /* output an int field */
 
 void
-mi_field_int (struct ui_out *uiout, int fldno, int width, int alignment,
-             const char *fldname, int value)
+mi_field_int (struct ui_out *uiout, int fldno, int width,
+              enum ui_align alignment, const char *fldname, int value)
 {
   char buffer[20];             /* FIXME: how many chars long a %d can become? */
+  mi_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
 
   sprintf (buffer, "%d", value);
   mi_field_string (uiout, fldno, width, alignment, fldname, buffer);
@@ -186,9 +204,12 @@ mi_field_int (struct ui_out *uiout, int fldno, int width, int alignment,
 /* used to ommit a field */
 
 void
-mi_field_skip (struct ui_out *uiout, int fldno, int width, int alignment,
-              const char *fldname)
+mi_field_skip (struct ui_out *uiout, int fldno, int width,
+               enum ui_align alignment, const char *fldname)
 {
+  mi_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   mi_field_string (uiout, fldno, width, alignment, fldname, "");
 }
 
@@ -199,11 +220,13 @@ void
 mi_field_string (struct ui_out *uiout,
                 int fldno,
                 int width,
-                int align,
+                enum ui_align align,
                 const char *fldname,
                 const char *string)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   field_separator (uiout);
   if (fldname)
     fprintf_unfiltered (data->buffer, "%s=", fldname);
@@ -222,7 +245,9 @@ mi_field_fmt (struct ui_out *uiout, int fldno,
              const char *format,
              va_list args)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   field_separator (uiout);
   if (fldname)
     fprintf_unfiltered (data->buffer, "%s=\"", fldname);
@@ -258,7 +283,7 @@ mi_wrap_hint (struct ui_out *uiout, char *identstring)
 void
 mi_flush (struct ui_out *uiout)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   gdb_flush (data->buffer);
 }
 
@@ -272,7 +297,7 @@ static void
 out_field_fmt (struct ui_out *uiout, int fldno, char *fldname,
               char *format,...)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   va_list args;
 
   field_separator (uiout);
@@ -294,7 +319,7 @@ out_field_fmt (struct ui_out *uiout, int fldno, char *fldname,
 static void
 field_separator (struct ui_out *uiout)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   if (data->suppress_field_separator)
     data->suppress_field_separator = 0;
   else
@@ -306,7 +331,7 @@ mi_open (struct ui_out *uiout,
         const char *name,
         enum ui_out_type type)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   field_separator (uiout);
   data->suppress_field_separator = 1;
   if (name)
@@ -328,7 +353,7 @@ static void
 mi_close (struct ui_out *uiout,
          enum ui_out_type type)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   switch (type)
     {
     case ui_out_type_tuple:
@@ -348,7 +373,7 @@ mi_close (struct ui_out *uiout,
 void
 mi_out_buffered (struct ui_out *uiout, char *string)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   fprintf_unfiltered (data->buffer, "%s", string);
 }
 
@@ -357,7 +382,7 @@ mi_out_buffered (struct ui_out *uiout, char *string)
 void
 mi_out_rewind (struct ui_out *uiout)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   ui_file_rewind (data->buffer);
 }
 
@@ -373,19 +398,29 @@ void
 mi_out_put (struct ui_out *uiout,
            struct ui_file *stream)
 {
-  struct ui_out_data *data = ui_out_data (uiout);
+  mi_out_data *data = ui_out_data (uiout);
   ui_file_put (data->buffer, do_write, stream);
   ui_file_rewind (data->buffer);
 }
 
+/* Current MI version.  */
+
+int
+mi_version (struct ui_out *uiout)
+{
+  mi_out_data *data = ui_out_data (uiout);
+  return data->mi_version;
+}
+
 /* initalize private members at startup */
 
 struct ui_out *
 mi_out_new (int mi_version)
 {
   int flags = 0;
-  struct ui_out_data *data = XMALLOC (struct ui_out_data);
+  mi_out_data *data = XMALLOC (mi_out_data);
   data->suppress_field_separator = 0;
+  data->suppress_output = 0;
   data->mi_version = mi_version;
   /* FIXME: This code should be using a ``string_file'' and not the
      TUI buffer hack. */
This page took 0.027343 seconds and 4 git commands to generate.