For MI>0, output full breakpoint table header information. Output the
[deliverable/binutils-gdb.git] / gdb / mi / mi-out.c
index 1063d57b5001691ac5a6d2083192d6d036e7d9b8..040e2e409103b4eee46dd6689b6a014ab735800a 100644 (file)
 
 struct ui_out_data
   {
-    int supress_field_separator;
-    int first_header;
+    int suppress_field_separator;
+    int suppress_output;
+    int mi_version;
     struct ui_file *buffer;
   };
 
 /* These are the MI output functions */
 
 static void mi_table_begin (struct ui_out *uiout, int nbrofcols,
-                           const char *tblid);
+                           int nr_rows, const char *tblid);
 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);
@@ -94,7 +95,8 @@ struct ui_out_impl mi_ui_out_impl =
 
 extern void _initialize_mi_out (void);
 static void field_separator (struct ui_out *uiout);
-static void mi_open (struct ui_out *uiout, enum ui_out_type type);
+static void mi_open (struct ui_out *uiout, const char *name,
+                    enum ui_out_type type);
 static void mi_close (struct ui_out *uiout, enum ui_out_type type);
 
 static void out_field_fmt (struct ui_out *uiout, int fldno, char *fldname,
@@ -103,16 +105,26 @@ 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);
-  field_separator (uiout);
-  if (tblid)
-    fprintf_unfiltered (data->buffer, "%s=", tblid);
-  mi_open (uiout, ui_out_type_tuple);
-  data->first_header = 0;
-  data->supress_field_separator = 1;
+  mi_open (uiout, tblid, ui_out_type_tuple);
+  if (data->mi_version == 0)
+    {
+      if (nr_rows == 0)
+       data->suppress_output = 1;
+      else
+       mi_open (uiout, "hdr", ui_out_type_list);
+      return;
+    }
+  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 */
@@ -121,9 +133,13 @@ void
 mi_table_body (struct ui_out *uiout)
 {
   struct ui_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);
+  if (data->mi_version == 0)
+    return;
+  mi_open (uiout, "body", ui_out_type_list);
 }
 
 /* Mark end of a table */
@@ -132,24 +148,37 @@ void
 mi_table_end (struct ui_out *uiout)
 {
   struct ui_out_data *data = ui_out_data (uiout);
+  data->suppress_output = 0;
+  if (data->mi_version == 0)
+    {
+      mi_close (uiout, ui_out_type_tuple);
+      return;
+    }
+  mi_close (uiout, ui_out_type_list); /* body */
   mi_close (uiout, ui_out_type_tuple);
-  /* If table was empty this flag did not get reset yet */
-  data->supress_field_separator = 0;
 }
 
 /* Specify table header */
 
 void
 mi_table_header (struct ui_out *uiout, int width, int alignment,
+                const char *col_name,
                 const char *colhdr)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  if (!data->first_header++)
+  if (data->suppress_output)
+    return;
+  if (data->mi_version == 0)
     {
-      fputs_unfiltered ("hdr=", data->buffer);
-      mi_open (uiout, ui_out_type_tuple);
+      mi_field_string (uiout, 0, width, alignment, 0, colhdr);
+      return;
     }
-  mi_field_string (uiout, 0, width, alignment, 0, colhdr);
+  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 */
@@ -161,11 +190,9 @@ mi_begin (struct ui_out *uiout,
          const char *id)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  field_separator (uiout);
-  data->supress_field_separator = 1;
-  if (id)
-    fprintf_unfiltered (data->buffer, "%s=", id);
-  mi_open (uiout, type);
+  if (data->suppress_output)
+    return;
+  mi_open (uiout, id, type);
 }
 
 /* Mark end of a list */
@@ -176,9 +203,9 @@ mi_end (struct ui_out *uiout,
        int level)
 {
   struct ui_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   mi_close (uiout, type);
-  /* If list was empty this flag did not get reset yet */
-  data->supress_field_separator = 0;
 }
 
 /* output an int field */
@@ -188,6 +215,9 @@ mi_field_int (struct ui_out *uiout, int fldno, int width, int alignment,
              const char *fldname, int value)
 {
   char buffer[20];             /* FIXME: how many chars long a %d can become? */
+  struct ui_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);
@@ -199,6 +229,9 @@ void
 mi_field_skip (struct ui_out *uiout, int fldno, int width, int alignment,
               const char *fldname)
 {
+  struct ui_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   mi_field_string (uiout, fldno, width, alignment, fldname, "");
 }
 
@@ -214,6 +247,8 @@ mi_field_string (struct ui_out *uiout,
                 const char *string)
 {
   struct ui_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   field_separator (uiout);
   if (fldname)
     fprintf_unfiltered (data->buffer, "%s=", fldname);
@@ -233,6 +268,8 @@ mi_field_fmt (struct ui_out *uiout, int fldno,
              va_list args)
 {
   struct ui_out_data *data = ui_out_data (uiout);
+  if (data->suppress_output)
+    return;
   field_separator (uiout);
   if (fldname)
     fprintf_unfiltered (data->buffer, "%s=\"", fldname);
@@ -305,24 +342,32 @@ static void
 field_separator (struct ui_out *uiout)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  if (data->supress_field_separator)
-    data->supress_field_separator = 0;
+  if (data->suppress_field_separator)
+    data->suppress_field_separator = 0;
   else
     fputc_unfiltered (',', data->buffer);
 }
 
 static void
 mi_open (struct ui_out *uiout,
+        const char *name,
         enum ui_out_type type)
 {
   struct ui_out_data *data = ui_out_data (uiout);
+  field_separator (uiout);
+  data->suppress_field_separator = 1;
+  if (name)
+    fprintf_unfiltered (data->buffer, "%s=", name);
   switch (type)
     {
     case ui_out_type_tuple:
       fputc_unfiltered ('{', data->buffer);
       break;
     case ui_out_type_list:
-      fputc_unfiltered ('[', data->buffer);
+      if (data->mi_version == 0)
+       fputc_unfiltered ('{', data->buffer);
+      else
+       fputc_unfiltered ('[', data->buffer);
       break;
     default:
       internal_error (__FILE__, __LINE__, "bad switch");
@@ -340,11 +385,15 @@ mi_close (struct ui_out *uiout,
       fputc_unfiltered ('}', data->buffer);
       break;
     case ui_out_type_list:
-      fputc_unfiltered (']', data->buffer);
+      if (data->mi_version == 0)
+       fputc_unfiltered ('}', data->buffer);
+      else
+       fputc_unfiltered (']', data->buffer);
       break;
     default:
       internal_error (__FILE__, __LINE__, "bad switch");
     }
+  data->suppress_field_separator = 0;
 }
 
 /* add a string to the buffer */
@@ -385,11 +434,12 @@ mi_out_put (struct ui_out *uiout,
 /* initalize private members at startup */
 
 struct ui_out *
-mi_out_new (void)
+mi_out_new (int mi_version)
 {
   int flags = 0;
   struct ui_out_data *data = XMALLOC (struct ui_out_data);
-  data->supress_field_separator = 0;
+  data->suppress_field_separator = 0;
+  data->mi_version = mi_version;
   /* FIXME: This code should be using a ``string_file'' and not the
      TUI buffer hack. */
   data->buffer = mem_fileopen ();
This page took 0.025817 seconds and 4 git commands to generate.