]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mi/mi-out.c
Update Copyright year range in all files maintained by GDB.
[thirdparty/binutils-gdb.git] / gdb / mi / mi-out.c
CommitLineData
fb40c209 1/* MI Command Set - output generating routines.
349c5d5f 2
ecd75fc8 3 Copyright (C) 2000-2014 Free Software Foundation, Inc.
349c5d5f 4
ab91fdd5 5 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
6
7 This file is part of GDB.
8
9 This program is free software; you can redistribute it and/or modify
10 it under the terms of the GNU General Public License as published by
a9762ec7 11 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
12 (at your option) any later version.
13
14 This program is distributed in the hope that it will be useful,
15 but WITHOUT ANY WARRANTY; without even the implied warranty of
16 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
17 GNU General Public License for more details.
18
19 You should have received a copy of the GNU General Public License
a9762ec7 20 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209
AC
21
22#include "defs.h"
23#include "ui-out.h"
24#include "mi-out.h"
25
fb40c209
AC
26struct ui_out_data
27 {
59807497 28 int suppress_field_separator;
76fe6b98 29 int suppress_output;
b30bf9ee 30 int mi_version;
fb40c209 31 struct ui_file *buffer;
8d3788bd 32 struct ui_file *original_buffer;
fb40c209 33 };
1248ede2 34typedef struct ui_out_data mi_out_data;
fb40c209
AC
35
36/* These are the MI output functions */
37
e2e11a41 38static void mi_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 39 int nr_rows, const char *tblid);
fb40c209
AC
40static void mi_table_body (struct ui_out *uiout);
41static void mi_table_end (struct ui_out *uiout);
42static void mi_table_header (struct ui_out *uiout, int width,
b25959ec 43 enum ui_align alig, const char *col_name,
e2e11a41 44 const char *colhdr);
631ec795
AC
45static void mi_begin (struct ui_out *uiout, enum ui_out_type type,
46 int level, const char *id);
47static void mi_end (struct ui_out *uiout, enum ui_out_type type, int level);
fb40c209 48static void mi_field_int (struct ui_out *uiout, int fldno, int width,
e2e11a41 49 enum ui_align alig, const char *fldname, int value);
fb40c209 50static void mi_field_skip (struct ui_out *uiout, int fldno, int width,
e2e11a41 51 enum ui_align alig, const char *fldname);
fb40c209 52static void mi_field_string (struct ui_out *uiout, int fldno, int width,
e2e11a41 53 enum ui_align alig, const char *fldname,
fb40c209
AC
54 const char *string);
55static void mi_field_fmt (struct ui_out *uiout, int fldno,
56 int width, enum ui_align align,
e2e11a41 57 const char *fldname, const char *format,
a0b31db1 58 va_list args) ATTRIBUTE_PRINTF (6, 0);
fb40c209 59static void mi_spaces (struct ui_out *uiout, int numspaces);
e2e11a41
AC
60static void mi_text (struct ui_out *uiout, const char *string);
61static void mi_message (struct ui_out *uiout, int verbosity,
bee0189a 62 const char *format, va_list args)
a0b31db1 63 ATTRIBUTE_PRINTF (3, 0);
fb40c209
AC
64static void mi_wrap_hint (struct ui_out *uiout, char *identstring);
65static void mi_flush (struct ui_out *uiout);
8d3788bd 66static int mi_redirect (struct ui_out *uiout, struct ui_file *outstream);
fb40c209
AC
67
68/* This is the MI ui-out implementation functions vector */
69
70/* FIXME: This can be initialized dynamically after default is set to
71 handle initial output in main.c */
72
73struct ui_out_impl mi_ui_out_impl =
74{
75 mi_table_begin,
76 mi_table_body,
77 mi_table_end,
78 mi_table_header,
631ec795
AC
79 mi_begin,
80 mi_end,
fb40c209
AC
81 mi_field_int,
82 mi_field_skip,
83 mi_field_string,
84 mi_field_fmt,
85 mi_spaces,
86 mi_text,
87 mi_message,
88 mi_wrap_hint,
9dc5e2a9 89 mi_flush,
8d3788bd 90 mi_redirect,
b65a2bd9 91 0,
9dc5e2a9 92 1, /* Needs MI hacks. */
fb40c209
AC
93};
94
95/* Prototypes for local functions */
96
a14ed312 97extern void _initialize_mi_out (void);
fb40c209 98static void field_separator (struct ui_out *uiout);
d5e8ba62
AC
99static void mi_open (struct ui_out *uiout, const char *name,
100 enum ui_out_type type);
9a0f0643 101static void mi_close (struct ui_out *uiout, enum ui_out_type type);
fb40c209 102
2b03b41d 103/* Mark beginning of a table. */
fb40c209
AC
104
105void
cff22675
AC
106mi_table_begin (struct ui_out *uiout,
107 int nr_cols,
d63f1d40 108 int nr_rows,
e2e11a41 109 const char *tblid)
fb40c209 110{
d5e8ba62 111 mi_open (uiout, tblid, ui_out_type_tuple);
2b03b41d
SS
112 mi_field_int (uiout, -1, -1, -1, "nr_rows", nr_rows);
113 mi_field_int (uiout, -1, -1, -1, "nr_cols", nr_cols);
cff22675 114 mi_open (uiout, "hdr", ui_out_type_list);
fb40c209
AC
115}
116
2b03b41d 117/* Mark beginning of a table body. */
fb40c209
AC
118
119void
fba45db2 120mi_table_body (struct ui_out *uiout)
fb40c209 121{
1248ede2 122 mi_out_data *data = ui_out_data (uiout);
102040f0 123
76fe6b98
AC
124 if (data->suppress_output)
125 return;
cff22675
AC
126 /* close the table header line if there were any headers */
127 mi_close (uiout, ui_out_type_list);
cff22675 128 mi_open (uiout, "body", ui_out_type_list);
fb40c209
AC
129}
130
2b03b41d 131/* Mark end of a table. */
fb40c209
AC
132
133void
fba45db2 134mi_table_end (struct ui_out *uiout)
fb40c209 135{
1248ede2 136 mi_out_data *data = ui_out_data (uiout);
102040f0 137
76fe6b98 138 data->suppress_output = 0;
cff22675 139 mi_close (uiout, ui_out_type_list); /* body */
666547aa 140 mi_close (uiout, ui_out_type_tuple);
fb40c209
AC
141}
142
2b03b41d 143/* Specify table header. */
fb40c209
AC
144
145void
46712191 146mi_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
2b03b41d 147 const char *col_name, const char *colhdr)
fb40c209 148{
1248ede2 149 mi_out_data *data = ui_out_data (uiout);
102040f0 150
76fe6b98
AC
151 if (data->suppress_output)
152 return;
2b03b41d 153
cff22675
AC
154 mi_open (uiout, NULL, ui_out_type_tuple);
155 mi_field_int (uiout, 0, 0, 0, "width", width);
156 mi_field_int (uiout, 0, 0, 0, "alignment", alignment);
157 mi_field_string (uiout, 0, 0, 0, "col_name", col_name);
158 mi_field_string (uiout, 0, width, alignment, "colhdr", colhdr);
159 mi_close (uiout, ui_out_type_tuple);
fb40c209
AC
160}
161
2b03b41d 162/* Mark beginning of a list. */
fb40c209
AC
163
164void
2b03b41d 165mi_begin (struct ui_out *uiout, enum ui_out_type type, int level,
9a0f0643 166 const char *id)
fb40c209 167{
1248ede2 168 mi_out_data *data = ui_out_data (uiout);
102040f0 169
76fe6b98
AC
170 if (data->suppress_output)
171 return;
2b03b41d 172
d5e8ba62 173 mi_open (uiout, id, type);
fb40c209
AC
174}
175
2b03b41d 176/* Mark end of a list. */
fb40c209
AC
177
178void
2b03b41d 179mi_end (struct ui_out *uiout, enum ui_out_type type, int level)
fb40c209 180{
1248ede2 181 mi_out_data *data = ui_out_data (uiout);
102040f0 182
76fe6b98
AC
183 if (data->suppress_output)
184 return;
2b03b41d 185
9a0f0643 186 mi_close (uiout, type);
fb40c209
AC
187}
188
2b03b41d 189/* Output an int field. */
fb40c209 190
2b03b41d 191static void
46712191
KB
192mi_field_int (struct ui_out *uiout, int fldno, int width,
193 enum ui_align alignment, const char *fldname, int value)
fb40c209 194{
102040f0 195 char buffer[20]; /* FIXME: how many chars long a %d can become? */
1248ede2 196 mi_out_data *data = ui_out_data (uiout);
102040f0 197
76fe6b98
AC
198 if (data->suppress_output)
199 return;
fb40c209 200
08850b56 201 xsnprintf (buffer, sizeof (buffer), "%d", value);
fb40c209
AC
202 mi_field_string (uiout, fldno, width, alignment, fldname, buffer);
203}
204
2b03b41d 205/* Used to omit a field. */
fb40c209
AC
206
207void
46712191
KB
208mi_field_skip (struct ui_out *uiout, int fldno, int width,
209 enum ui_align alignment, const char *fldname)
fb40c209 210{
fb40c209
AC
211}
212
2b03b41d
SS
213/* Other specific mi_field_* end up here so alignment and field
214 separators are both handled by mi_field_string. */
fb40c209
AC
215
216void
2b03b41d
SS
217mi_field_string (struct ui_out *uiout, int fldno, int width,
218 enum ui_align align, const char *fldname, const char *string)
fb40c209 219{
1248ede2 220 mi_out_data *data = ui_out_data (uiout);
102040f0 221
76fe6b98
AC
222 if (data->suppress_output)
223 return;
2b03b41d 224
fb40c209
AC
225 field_separator (uiout);
226 if (fldname)
227 fprintf_unfiltered (data->buffer, "%s=", fldname);
228 fprintf_unfiltered (data->buffer, "\"");
229 if (string)
230 fputstr_unfiltered (string, '"', data->buffer);
231 fprintf_unfiltered (data->buffer, "\"");
232}
233
2b03b41d 234/* This is the only field function that does not align. */
fb40c209
AC
235
236void
2b03b41d
SS
237mi_field_fmt (struct ui_out *uiout, int fldno, int width,
238 enum ui_align align, const char *fldname,
239 const char *format, va_list args)
fb40c209 240{
1248ede2 241 mi_out_data *data = ui_out_data (uiout);
102040f0 242
76fe6b98
AC
243 if (data->suppress_output)
244 return;
2b03b41d 245
fb40c209
AC
246 field_separator (uiout);
247 if (fldname)
248 fprintf_unfiltered (data->buffer, "%s=\"", fldname);
249 else
250 fputs_unfiltered ("\"", data->buffer);
251 vfprintf_unfiltered (data->buffer, format, args);
252 fputs_unfiltered ("\"", data->buffer);
253}
254
255void
fba45db2 256mi_spaces (struct ui_out *uiout, int numspaces)
fb40c209
AC
257{
258}
259
260void
e2e11a41 261mi_text (struct ui_out *uiout, const char *string)
fb40c209
AC
262{
263}
264
265void
e2e11a41 266mi_message (struct ui_out *uiout, int verbosity,
2b03b41d 267 const char *format, va_list args)
fb40c209
AC
268{
269}
270
271void
fba45db2 272mi_wrap_hint (struct ui_out *uiout, char *identstring)
fb40c209
AC
273{
274 wrap_here (identstring);
275}
276
277void
fba45db2 278mi_flush (struct ui_out *uiout)
fb40c209 279{
1248ede2 280 mi_out_data *data = ui_out_data (uiout);
102040f0 281
fb40c209
AC
282 gdb_flush (data->buffer);
283}
284
8d3788bd
VP
285int
286mi_redirect (struct ui_out *uiout, struct ui_file *outstream)
287{
288 mi_out_data *data = ui_out_data (uiout);
289
290 if (outstream != NULL)
291 {
292 data->original_buffer = data->buffer;
293 data->buffer = outstream;
294 }
295 else if (data->original_buffer != NULL)
296 {
297 data->buffer = data->original_buffer;
298 data->original_buffer = NULL;
299 }
300
301 return 0;
302}
303
fb40c209
AC
304/* local functions */
305
fb40c209
AC
306/* access to ui_out format private members */
307
308static void
309field_separator (struct ui_out *uiout)
310{
1248ede2 311 mi_out_data *data = ui_out_data (uiout);
102040f0 312
59807497
AC
313 if (data->suppress_field_separator)
314 data->suppress_field_separator = 0;
fb40c209
AC
315 else
316 fputc_unfiltered (',', data->buffer);
317}
318
319static void
2b03b41d 320mi_open (struct ui_out *uiout, const char *name, enum ui_out_type type)
fb40c209 321{
1248ede2 322 mi_out_data *data = ui_out_data (uiout);
102040f0 323
d5e8ba62 324 field_separator (uiout);
59807497 325 data->suppress_field_separator = 1;
d5e8ba62
AC
326 if (name)
327 fprintf_unfiltered (data->buffer, "%s=", name);
5a9aa5dc
AC
328 switch (type)
329 {
330 case ui_out_type_tuple:
331 fputc_unfiltered ('{', data->buffer);
332 break;
333 case ui_out_type_list:
da0f9dcd 334 fputc_unfiltered ('[', data->buffer);
5a9aa5dc
AC
335 break;
336 default:
e2e0b3e5 337 internal_error (__FILE__, __LINE__, _("bad switch"));
5a9aa5dc 338 }
fb40c209
AC
339}
340
341static void
2b03b41d 342mi_close (struct ui_out *uiout, enum ui_out_type type)
fb40c209 343{
1248ede2 344 mi_out_data *data = ui_out_data (uiout);
102040f0 345
5a9aa5dc
AC
346 switch (type)
347 {
348 case ui_out_type_tuple:
349 fputc_unfiltered ('}', data->buffer);
350 break;
351 case ui_out_type_list:
da0f9dcd 352 fputc_unfiltered (']', data->buffer);
5a9aa5dc
AC
353 break;
354 default:
e2e0b3e5 355 internal_error (__FILE__, __LINE__, _("bad switch"));
5a9aa5dc 356 }
59807497 357 data->suppress_field_separator = 0;
fb40c209
AC
358}
359
2b03b41d 360/* Add a string to the buffer. */
fb40c209
AC
361
362void
363mi_out_buffered (struct ui_out *uiout, char *string)
364{
1248ede2 365 mi_out_data *data = ui_out_data (uiout);
102040f0 366
fb40c209
AC
367 fprintf_unfiltered (data->buffer, "%s", string);
368}
369
2b03b41d 370/* Clear the buffer. */
fb40c209
AC
371
372void
373mi_out_rewind (struct ui_out *uiout)
374{
1248ede2 375 mi_out_data *data = ui_out_data (uiout);
102040f0 376
fb40c209
AC
377 ui_file_rewind (data->buffer);
378}
379
2b03b41d 380/* Dump the buffer onto the specified stream. */
fb40c209
AC
381
382static void
383do_write (void *data, const char *buffer, long length_buffer)
384{
385 ui_file_write (data, buffer, length_buffer);
386}
387
388void
2b03b41d 389mi_out_put (struct ui_out *uiout, struct ui_file *stream)
fb40c209 390{
1248ede2 391 mi_out_data *data = ui_out_data (uiout);
102040f0 392
fb40c209
AC
393 ui_file_put (data->buffer, do_write, stream);
394 ui_file_rewind (data->buffer);
395}
396
2b03b41d 397/* Return the current MI version. */
c7ec4050
AC
398
399int
400mi_version (struct ui_out *uiout)
401{
1248ede2 402 mi_out_data *data = ui_out_data (uiout);
102040f0 403
c7ec4050
AC
404 return data->mi_version;
405}
406
2b03b41d 407/* Initialize private members at startup. */
fb40c209
AC
408
409struct ui_out *
b30bf9ee 410mi_out_new (int mi_version)
fb40c209
AC
411{
412 int flags = 0;
102040f0 413
1248ede2 414 mi_out_data *data = XMALLOC (mi_out_data);
59807497 415 data->suppress_field_separator = 0;
bf702e7e 416 data->suppress_output = 0;
b30bf9ee 417 data->mi_version = mi_version;
fb40c209
AC
418 /* FIXME: This code should be using a ``string_file'' and not the
419 TUI buffer hack. */
420 data->buffer = mem_fileopen ();
421 return ui_out_new (&mi_ui_out_impl, data, flags);
422}