1 /* MI Command Set - output generating routines.
3 Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007, 2008, 2009, 2010
4 Free Software Foundation, Inc.
6 Contributed by Cygnus Solutions (a Red Hat company).
8 This file is part of GDB.
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
12 the Free Software Foundation; either version 3 of the License, or
13 (at your option) any later version.
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
20 You should have received a copy of the GNU General Public License
21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
29 int suppress_field_separator
;
32 struct ui_file
*buffer
;
34 typedef struct ui_out_data mi_out_data
;
36 /* These are the MI output functions */
38 static void mi_table_begin (struct ui_out
*uiout
, int nbrofcols
,
39 int nr_rows
, const char *tblid
);
40 static void mi_table_body (struct ui_out
*uiout
);
41 static void mi_table_end (struct ui_out
*uiout
);
42 static void mi_table_header (struct ui_out
*uiout
, int width
,
43 enum ui_align alig
, const char *col_name
,
45 static void mi_begin (struct ui_out
*uiout
, enum ui_out_type type
,
46 int level
, const char *id
);
47 static void mi_end (struct ui_out
*uiout
, enum ui_out_type type
, int level
);
48 static void mi_field_int (struct ui_out
*uiout
, int fldno
, int width
,
49 enum ui_align alig
, const char *fldname
, int value
);
50 static void mi_field_skip (struct ui_out
*uiout
, int fldno
, int width
,
51 enum ui_align alig
, const char *fldname
);
52 static void mi_field_string (struct ui_out
*uiout
, int fldno
, int width
,
53 enum ui_align alig
, const char *fldname
,
55 static void mi_field_fmt (struct ui_out
*uiout
, int fldno
,
56 int width
, enum ui_align align
,
57 const char *fldname
, const char *format
,
58 va_list args
) ATTR_FORMAT (printf
, 6, 0);
59 static void mi_spaces (struct ui_out
*uiout
, int numspaces
);
60 static void mi_text (struct ui_out
*uiout
, const char *string
);
61 static void mi_message (struct ui_out
*uiout
, int verbosity
,
62 const char *format
, va_list args
)
63 ATTR_FORMAT (printf
, 3, 0);
64 static void mi_wrap_hint (struct ui_out
*uiout
, char *identstring
);
65 static void mi_flush (struct ui_out
*uiout
);
67 /* This is the MI ui-out implementation functions vector */
69 /* FIXME: This can be initialized dynamically after default is set to
70 handle initial output in main.c */
72 struct ui_out_impl mi_ui_out_impl
=
90 1, /* Needs MI hacks. */
93 /* Prototypes for local functions */
95 extern void _initialize_mi_out (void);
96 static void field_separator (struct ui_out
*uiout
);
97 static void mi_open (struct ui_out
*uiout
, const char *name
,
98 enum ui_out_type type
);
99 static void mi_close (struct ui_out
*uiout
, enum ui_out_type type
);
101 /* Mark beginning of a table */
104 mi_table_begin (struct ui_out
*uiout
,
109 mi_out_data
*data
= ui_out_data (uiout
);
110 mi_open (uiout
, tblid
, ui_out_type_tuple
);
111 mi_field_int (uiout
, -1/*fldno*/, -1/*width*/, -1/*alin*/,
113 mi_field_int (uiout
, -1/*fldno*/, -1/*width*/, -1/*alin*/,
115 mi_open (uiout
, "hdr", ui_out_type_list
);
118 /* Mark beginning of a table body */
121 mi_table_body (struct ui_out
*uiout
)
123 mi_out_data
*data
= ui_out_data (uiout
);
124 if (data
->suppress_output
)
126 /* close the table header line if there were any headers */
127 mi_close (uiout
, ui_out_type_list
);
128 mi_open (uiout
, "body", ui_out_type_list
);
131 /* Mark end of a table */
134 mi_table_end (struct ui_out
*uiout
)
136 mi_out_data
*data
= ui_out_data (uiout
);
137 data
->suppress_output
= 0;
138 mi_close (uiout
, ui_out_type_list
); /* body */
139 mi_close (uiout
, ui_out_type_tuple
);
142 /* Specify table header */
145 mi_table_header (struct ui_out
*uiout
, int width
, enum ui_align alignment
,
146 const char *col_name
,
149 mi_out_data
*data
= ui_out_data (uiout
);
150 if (data
->suppress_output
)
152 mi_open (uiout
, NULL
, ui_out_type_tuple
);
153 mi_field_int (uiout
, 0, 0, 0, "width", width
);
154 mi_field_int (uiout
, 0, 0, 0, "alignment", alignment
);
155 mi_field_string (uiout
, 0, 0, 0, "col_name", col_name
);
156 mi_field_string (uiout
, 0, width
, alignment
, "colhdr", colhdr
);
157 mi_close (uiout
, ui_out_type_tuple
);
160 /* Mark beginning of a list */
163 mi_begin (struct ui_out
*uiout
,
164 enum ui_out_type type
,
168 mi_out_data
*data
= ui_out_data (uiout
);
169 if (data
->suppress_output
)
171 mi_open (uiout
, id
, type
);
174 /* Mark end of a list */
177 mi_end (struct ui_out
*uiout
,
178 enum ui_out_type type
,
181 mi_out_data
*data
= ui_out_data (uiout
);
182 if (data
->suppress_output
)
184 mi_close (uiout
, type
);
187 /* output an int field */
190 mi_field_int (struct ui_out
*uiout
, int fldno
, int width
,
191 enum ui_align alignment
, const char *fldname
, int value
)
193 char buffer
[20]; /* FIXME: how many chars long a %d can become? */
194 mi_out_data
*data
= ui_out_data (uiout
);
195 if (data
->suppress_output
)
198 sprintf (buffer
, "%d", value
);
199 mi_field_string (uiout
, fldno
, width
, alignment
, fldname
, buffer
);
202 /* used to ommit a field */
205 mi_field_skip (struct ui_out
*uiout
, int fldno
, int width
,
206 enum ui_align alignment
, const char *fldname
)
208 mi_out_data
*data
= ui_out_data (uiout
);
209 if (data
->suppress_output
)
211 mi_field_string (uiout
, fldno
, width
, alignment
, fldname
, "");
214 /* other specific mi_field_* end up here so alignment and field
215 separators are both handled by mi_field_string */
218 mi_field_string (struct ui_out
*uiout
,
225 mi_out_data
*data
= ui_out_data (uiout
);
226 if (data
->suppress_output
)
228 field_separator (uiout
);
230 fprintf_unfiltered (data
->buffer
, "%s=", fldname
);
231 fprintf_unfiltered (data
->buffer
, "\"");
233 fputstr_unfiltered (string
, '"', data
->buffer
);
234 fprintf_unfiltered (data
->buffer
, "\"");
237 /* This is the only field function that does not align */
240 mi_field_fmt (struct ui_out
*uiout
, int fldno
,
241 int width
, enum ui_align align
,
246 mi_out_data
*data
= ui_out_data (uiout
);
247 if (data
->suppress_output
)
249 field_separator (uiout
);
251 fprintf_unfiltered (data
->buffer
, "%s=\"", fldname
);
253 fputs_unfiltered ("\"", data
->buffer
);
254 vfprintf_unfiltered (data
->buffer
, format
, args
);
255 fputs_unfiltered ("\"", data
->buffer
);
259 mi_spaces (struct ui_out
*uiout
, int numspaces
)
264 mi_text (struct ui_out
*uiout
, const char *string
)
269 mi_message (struct ui_out
*uiout
, int verbosity
,
276 mi_wrap_hint (struct ui_out
*uiout
, char *identstring
)
278 wrap_here (identstring
);
282 mi_flush (struct ui_out
*uiout
)
284 mi_out_data
*data
= ui_out_data (uiout
);
285 gdb_flush (data
->buffer
);
288 /* local functions */
290 /* access to ui_out format private members */
293 field_separator (struct ui_out
*uiout
)
295 mi_out_data
*data
= ui_out_data (uiout
);
296 if (data
->suppress_field_separator
)
297 data
->suppress_field_separator
= 0;
299 fputc_unfiltered (',', data
->buffer
);
303 mi_open (struct ui_out
*uiout
,
305 enum ui_out_type type
)
307 mi_out_data
*data
= ui_out_data (uiout
);
308 field_separator (uiout
);
309 data
->suppress_field_separator
= 1;
311 fprintf_unfiltered (data
->buffer
, "%s=", name
);
314 case ui_out_type_tuple
:
315 fputc_unfiltered ('{', data
->buffer
);
317 case ui_out_type_list
:
318 fputc_unfiltered ('[', data
->buffer
);
321 internal_error (__FILE__
, __LINE__
, _("bad switch"));
326 mi_close (struct ui_out
*uiout
,
327 enum ui_out_type type
)
329 mi_out_data
*data
= ui_out_data (uiout
);
332 case ui_out_type_tuple
:
333 fputc_unfiltered ('}', data
->buffer
);
335 case ui_out_type_list
:
336 fputc_unfiltered (']', data
->buffer
);
339 internal_error (__FILE__
, __LINE__
, _("bad switch"));
341 data
->suppress_field_separator
= 0;
344 /* add a string to the buffer */
347 mi_out_buffered (struct ui_out
*uiout
, char *string
)
349 mi_out_data
*data
= ui_out_data (uiout
);
350 fprintf_unfiltered (data
->buffer
, "%s", string
);
353 /* clear the buffer */
356 mi_out_rewind (struct ui_out
*uiout
)
358 mi_out_data
*data
= ui_out_data (uiout
);
359 ui_file_rewind (data
->buffer
);
362 /* dump the buffer onto the specified stream */
365 do_write (void *data
, const char *buffer
, long length_buffer
)
367 ui_file_write (data
, buffer
, length_buffer
);
371 mi_out_put (struct ui_out
*uiout
,
372 struct ui_file
*stream
)
374 mi_out_data
*data
= ui_out_data (uiout
);
375 ui_file_put (data
->buffer
, do_write
, stream
);
376 ui_file_rewind (data
->buffer
);
379 /* Current MI version. */
382 mi_version (struct ui_out
*uiout
)
384 mi_out_data
*data
= ui_out_data (uiout
);
385 return data
->mi_version
;
388 /* initalize private members at startup */
391 mi_out_new (int mi_version
)
394 mi_out_data
*data
= XMALLOC (mi_out_data
);
395 data
->suppress_field_separator
= 0;
396 data
->suppress_output
= 0;
397 data
->mi_version
= mi_version
;
398 /* FIXME: This code should be using a ``string_file'' and not the
400 data
->buffer
= mem_fileopen ();
401 return ui_out_new (&mi_ui_out_impl
, data
, flags
);
404 /* standard gdb initialization hook */
406 _initialize_mi_out (void)
408 /* nothing happens here */