Recognize -i=mi0, -i=mi1 and -i=mi.
[deliverable/binutils-gdb.git] / gdb / mi / mi-out.c
index 7e3f57ad7bc236a97559e74be954f1976a59db8a..034d3c1f166e1edfceee61268a8e069c0de217c7 100644 (file)
@@ -1,5 +1,5 @@
 /* MI Command Set - output generating routines.
-   Copyright (C) 2000, Free Software Foundation, Inc.
+   Copyright 2000 Free Software Foundation, Inc.
    Contributed by Cygnus Solutions (a Red Hat company).
 
    This file is part of GDB.
 
 struct ui_out_data
   {
-    int supress_field_separator;
+    int suppress_field_separator;
     int first_header;
+    int mi_version;
     struct ui_file *buffer;
   };
 
 /* These are the MI output functions */
 
-static void mi_table_begin (struct ui_out *uiout, int nbrofcols, char *tblid);
+static void mi_table_begin (struct ui_out *uiout, int nbrofcols,
+                           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, char *colhdr);
-static void mi_list_begin (struct ui_out *uiout, int list_flag, char *lstid);
-static void mi_list_end (struct ui_out *uiout, int list_flag);
+                            enum ui_align alig,
+                            const char *colhdr);
+static void mi_begin (struct ui_out *uiout, enum ui_out_type type,
+                     int level, const char *id);
+static void mi_end (struct ui_out *uiout, enum ui_out_type type, int level);
 static void mi_field_int (struct ui_out *uiout, int fldno, int width,
-                         enum ui_align alig, char *fldname, int value);
+                         enum ui_align alig, const char *fldname, int value);
 static void mi_field_skip (struct ui_out *uiout, int fldno, int width,
-                          enum ui_align alig, char *fldname);
+                          enum ui_align alig, const char *fldname);
 static void mi_field_string (struct ui_out *uiout, int fldno, int width,
-                            enum ui_align alig, char *fldname,
+                            enum ui_align alig, const char *fldname,
                             const char *string);
 static void mi_field_fmt (struct ui_out *uiout, int fldno,
                          int width, enum ui_align align,
-                         char *fldname, char *format, va_list args);
+                         const char *fldname, const char *format,
+                         va_list args);
 static void mi_spaces (struct ui_out *uiout, int numspaces);
-static void mi_text (struct ui_out *uiout, char *string);
-static void mi_message (struct ui_out *uiout, int verbosity, char *format,
-                       va_list args);
+static void mi_text (struct ui_out *uiout, const char *string);
+static void mi_message (struct ui_out *uiout, int verbosity,
+                       const char *format, va_list args);
 static void mi_wrap_hint (struct ui_out *uiout, char *identstring);
 static void mi_flush (struct ui_out *uiout);
 
@@ -73,8 +78,8 @@ struct ui_out_impl mi_ui_out_impl =
   mi_table_body,
   mi_table_end,
   mi_table_header,
-  mi_list_begin,
-  mi_list_end,
+  mi_begin,
+  mi_end,
   mi_field_int,
   mi_field_skip,
   mi_field_string,
@@ -88,10 +93,11 @@ struct ui_out_impl mi_ui_out_impl =
 
 /* Prototypes for local functions */
 
-extern void _initialize_mi_out PARAMS ((void));
+extern void _initialize_mi_out (void);
 static void field_separator (struct ui_out *uiout);
-static void list_open (struct ui_out *uiout);
-static void list_close (struct ui_out *uiout);
+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,
                           char *format,...);
@@ -99,58 +105,44 @@ static void out_field_fmt (struct ui_out *uiout, int fldno, char *fldname,
 /* Mark beginning of a table */
 
 void
-mi_table_begin (uiout, nbrofcols, tblid)
-     struct ui_out *uiout;
-     int nbrofcols;
-     char *tblid;
+mi_table_begin (struct ui_out *uiout, int nbrofcols,
+               const char *tblid)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  field_separator (uiout);
-  if (tblid)
-    fprintf_unfiltered (data->buffer, "%s=", tblid);
-  list_open (uiout);
+  mi_open (uiout, tblid, ui_out_type_tuple);
   data->first_header = 0;
-  data->supress_field_separator = 1;
 }
 
 /* Mark beginning of a table body */
 
 void
-mi_table_body (uiout)
-     struct ui_out *uiout;
+mi_table_body (struct ui_out *uiout)
 {
   struct ui_out_data *data = ui_out_data (uiout);
   /* close the table header line if there were any headers */
   if (data->first_header)
-    list_close (uiout);
+    mi_close (uiout, ui_out_type_tuple);
 }
 
 /* Mark end of a table */
 
 void
-mi_table_end (uiout)
-     struct ui_out *uiout;
+mi_table_end (struct ui_out *uiout)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  list_close (uiout);
-  /* If table was empty this flag did not get reset yet */
-  data->supress_field_separator = 0;
+  mi_close (uiout, ui_out_type_tuple);
 }
 
 /* Specify table header */
 
 void
-mi_table_header (uiout, width, alignment, colhdr)
-     struct ui_out *uiout;
-     int width;
-     int alignment;
-     char *colhdr;
+mi_table_header (struct ui_out *uiout, int width, int alignment,
+                const char *colhdr)
 {
   struct ui_out_data *data = ui_out_data (uiout);
   if (!data->first_header++)
     {
-      fputs_unfiltered ("hdr=", data->buffer);
-      list_open (uiout);
+      mi_open (uiout, "hdr", ui_out_type_tuple);
     }
   mi_field_string (uiout, 0, width, alignment, 0, colhdr);
 }
@@ -158,42 +150,31 @@ mi_table_header (uiout, width, alignment, colhdr)
 /* Mark beginning of a list */
 
 void
-mi_list_begin (uiout, list_flag, lstid)
-     struct ui_out *uiout;
-     int list_flag;
-     char *lstid;
+mi_begin (struct ui_out *uiout,
+         enum ui_out_type type,
+         int level,
+         const char *id)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  field_separator (uiout);
-  data->supress_field_separator = 1;
-  if (lstid)
-    fprintf_unfiltered (data->buffer, "%s=", lstid);
-  list_open (uiout);
+  mi_open (uiout, id, type);
 }
 
 /* Mark end of a list */
 
 void
-mi_list_end (uiout, list_flag)
-     struct ui_out *uiout;
-     int list_flag;
+mi_end (struct ui_out *uiout,
+       enum ui_out_type type,
+       int level)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  list_close (uiout);
-  /* If list was empty this flag did not get reset yet */
-  data->supress_field_separator = 0;
+  mi_close (uiout, type);
 }
 
 /* output an int field */
 
 void
-mi_field_int (uiout, fldno, width, alignment, fldname, value)
-     struct ui_out *uiout;
-     int fldno;
-     int width;
-     int alignment;
-     char *fldname;
-     int value;
+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? */
 
@@ -204,12 +185,8 @@ mi_field_int (uiout, fldno, width, alignment, fldname, value)
 /* used to ommit a field */
 
 void
-mi_field_skip (uiout, fldno, width, alignment, fldname)
-     struct ui_out *uiout;
-     int fldno;
-     int width;
-     int alignment;
-     char *fldname;
+mi_field_skip (struct ui_out *uiout, int fldno, int width, int alignment,
+              const char *fldname)
 {
   mi_field_string (uiout, fldno, width, alignment, fldname, "");
 }
@@ -222,7 +199,7 @@ mi_field_string (struct ui_out *uiout,
                 int fldno,
                 int width,
                 int align,
-                char *fldname,
+                const char *fldname,
                 const char *string)
 {
   struct ui_out_data *data = ui_out_data (uiout);
@@ -240,7 +217,9 @@ mi_field_string (struct ui_out *uiout,
 void
 mi_field_fmt (struct ui_out *uiout, int fldno,
              int width, enum ui_align align,
-             char *fldname, char *format, va_list args)
+             const char *fldname,
+             const char *format,
+             va_list args)
 {
   struct ui_out_data *data = ui_out_data (uiout);
   field_separator (uiout);
@@ -253,35 +232,30 @@ mi_field_fmt (struct ui_out *uiout, int fldno,
 }
 
 void
-mi_spaces (uiout, numspaces)
-     struct ui_out *uiout;
-     int numspaces;
+mi_spaces (struct ui_out *uiout, int numspaces)
 {
 }
 
 void
-mi_text (uiout, string)
-     struct ui_out *uiout;
-     char *string;
+mi_text (struct ui_out *uiout, const char *string)
 {
 }
 
 void
-mi_message (struct ui_out *uiout, int verbosity, char *format, va_list args)
+mi_message (struct ui_out *uiout, int verbosity,
+           const char *format,
+           va_list args)
 {
 }
 
 void
-mi_wrap_hint (uiout, identstring)
-     struct ui_out *uiout;
-     char *identstring;
+mi_wrap_hint (struct ui_out *uiout, char *identstring)
 {
   wrap_here (identstring);
 }
 
 void
-mi_flush (uiout)
-     struct ui_out *uiout;
+mi_flush (struct ui_out *uiout)
 {
   struct ui_out_data *data = ui_out_data (uiout);
   gdb_flush (data->buffer);
@@ -320,24 +294,52 @@ 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
-list_open (struct ui_out *uiout)
+mi_open (struct ui_out *uiout,
+        const char *name,
+        enum ui_out_type type)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  fputc_unfiltered ('{', data->buffer);
+  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);
+      break;
+    default:
+      internal_error (__FILE__, __LINE__, "bad switch");
+    }
 }
 
 static void
-list_close (struct ui_out *uiout)
+mi_close (struct ui_out *uiout,
+         enum ui_out_type type)
 {
   struct ui_out_data *data = ui_out_data (uiout);
-  fputc_unfiltered ('}', data->buffer);
+  switch (type)
+    {
+    case ui_out_type_tuple:
+      fputc_unfiltered ('}', data->buffer);
+      break;
+    case ui_out_type_list:
+      fputc_unfiltered (']', data->buffer);
+      break;
+    default:
+      internal_error (__FILE__, __LINE__, "bad switch");
+    }
+  data->suppress_field_separator = 0;
 }
 
 /* add a string to the buffer */
@@ -378,11 +380,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 ();
@@ -391,11 +394,7 @@ mi_out_new (void)
 
 /* standard gdb initialization hook */
 void
-_initialize_mi_out ()
+_initialize_mi_out (void)
 {
   /* nothing happens here */
 }
-
-/* Local variables: */
-/* change-log-default-name: "ChangeLog-mi" */
-/* End: */
This page took 0.029294 seconds and 4 git commands to generate.