]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/mi/mi-out.c
Update year range in copyright notice of all files owned by the GDB project.
[thirdparty/binutils-gdb.git] / gdb / mi / mi-out.c
CommitLineData
fb40c209 1/* MI Command Set - output generating routines.
349c5d5f 2
32d0add0 3 Copyright (C) 2000-2015 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
89de4da4 70static const struct ui_out_impl mi_ui_out_impl =
fb40c209
AC
71{
72 mi_table_begin,
73 mi_table_body,
74 mi_table_end,
75 mi_table_header,
631ec795
AC
76 mi_begin,
77 mi_end,
fb40c209
AC
78 mi_field_int,
79 mi_field_skip,
80 mi_field_string,
81 mi_field_fmt,
82 mi_spaces,
83 mi_text,
84 mi_message,
85 mi_wrap_hint,
9dc5e2a9 86 mi_flush,
8d3788bd 87 mi_redirect,
b65a2bd9 88 0,
9dc5e2a9 89 1, /* Needs MI hacks. */
fb40c209
AC
90};
91
92/* Prototypes for local functions */
93
a14ed312 94extern void _initialize_mi_out (void);
fb40c209 95static void field_separator (struct ui_out *uiout);
d5e8ba62
AC
96static void mi_open (struct ui_out *uiout, const char *name,
97 enum ui_out_type type);
9a0f0643 98static void mi_close (struct ui_out *uiout, enum ui_out_type type);
fb40c209 99
2b03b41d 100/* Mark beginning of a table. */
fb40c209
AC
101
102void
cff22675
AC
103mi_table_begin (struct ui_out *uiout,
104 int nr_cols,
d63f1d40 105 int nr_rows,
e2e11a41 106 const char *tblid)
fb40c209 107{
d5e8ba62 108 mi_open (uiout, tblid, ui_out_type_tuple);
2b03b41d
SS
109 mi_field_int (uiout, -1, -1, -1, "nr_rows", nr_rows);
110 mi_field_int (uiout, -1, -1, -1, "nr_cols", nr_cols);
cff22675 111 mi_open (uiout, "hdr", ui_out_type_list);
fb40c209
AC
112}
113
2b03b41d 114/* Mark beginning of a table body. */
fb40c209
AC
115
116void
fba45db2 117mi_table_body (struct ui_out *uiout)
fb40c209 118{
1248ede2 119 mi_out_data *data = ui_out_data (uiout);
102040f0 120
76fe6b98
AC
121 if (data->suppress_output)
122 return;
cff22675
AC
123 /* close the table header line if there were any headers */
124 mi_close (uiout, ui_out_type_list);
cff22675 125 mi_open (uiout, "body", ui_out_type_list);
fb40c209
AC
126}
127
2b03b41d 128/* Mark end of a table. */
fb40c209
AC
129
130void
fba45db2 131mi_table_end (struct ui_out *uiout)
fb40c209 132{
1248ede2 133 mi_out_data *data = ui_out_data (uiout);
102040f0 134
76fe6b98 135 data->suppress_output = 0;
cff22675 136 mi_close (uiout, ui_out_type_list); /* body */
666547aa 137 mi_close (uiout, ui_out_type_tuple);
fb40c209
AC
138}
139
2b03b41d 140/* Specify table header. */
fb40c209
AC
141
142void
46712191 143mi_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
2b03b41d 144 const char *col_name, const char *colhdr)
fb40c209 145{
1248ede2 146 mi_out_data *data = ui_out_data (uiout);
102040f0 147
76fe6b98
AC
148 if (data->suppress_output)
149 return;
2b03b41d 150
cff22675
AC
151 mi_open (uiout, NULL, ui_out_type_tuple);
152 mi_field_int (uiout, 0, 0, 0, "width", width);
153 mi_field_int (uiout, 0, 0, 0, "alignment", alignment);
154 mi_field_string (uiout, 0, 0, 0, "col_name", col_name);
155 mi_field_string (uiout, 0, width, alignment, "colhdr", colhdr);
156 mi_close (uiout, ui_out_type_tuple);
fb40c209
AC
157}
158
2b03b41d 159/* Mark beginning of a list. */
fb40c209
AC
160
161void
2b03b41d 162mi_begin (struct ui_out *uiout, enum ui_out_type type, int level,
9a0f0643 163 const char *id)
fb40c209 164{
1248ede2 165 mi_out_data *data = ui_out_data (uiout);
102040f0 166
76fe6b98
AC
167 if (data->suppress_output)
168 return;
2b03b41d 169
d5e8ba62 170 mi_open (uiout, id, type);
fb40c209
AC
171}
172
2b03b41d 173/* Mark end of a list. */
fb40c209
AC
174
175void
2b03b41d 176mi_end (struct ui_out *uiout, enum ui_out_type type, int level)
fb40c209 177{
1248ede2 178 mi_out_data *data = ui_out_data (uiout);
102040f0 179
76fe6b98
AC
180 if (data->suppress_output)
181 return;
2b03b41d 182
9a0f0643 183 mi_close (uiout, type);
fb40c209
AC
184}
185
2b03b41d 186/* Output an int field. */
fb40c209 187
2b03b41d 188static void
46712191
KB
189mi_field_int (struct ui_out *uiout, int fldno, int width,
190 enum ui_align alignment, const char *fldname, int value)
fb40c209 191{
102040f0 192 char buffer[20]; /* FIXME: how many chars long a %d can become? */
1248ede2 193 mi_out_data *data = ui_out_data (uiout);
102040f0 194
76fe6b98
AC
195 if (data->suppress_output)
196 return;
fb40c209 197
08850b56 198 xsnprintf (buffer, sizeof (buffer), "%d", value);
fb40c209
AC
199 mi_field_string (uiout, fldno, width, alignment, fldname, buffer);
200}
201
2b03b41d 202/* Used to omit a field. */
fb40c209
AC
203
204void
46712191
KB
205mi_field_skip (struct ui_out *uiout, int fldno, int width,
206 enum ui_align alignment, const char *fldname)
fb40c209 207{
fb40c209
AC
208}
209
2b03b41d
SS
210/* Other specific mi_field_* end up here so alignment and field
211 separators are both handled by mi_field_string. */
fb40c209
AC
212
213void
2b03b41d
SS
214mi_field_string (struct ui_out *uiout, int fldno, int width,
215 enum ui_align align, const char *fldname, const char *string)
fb40c209 216{
1248ede2 217 mi_out_data *data = ui_out_data (uiout);
102040f0 218
76fe6b98
AC
219 if (data->suppress_output)
220 return;
2b03b41d 221
fb40c209
AC
222 field_separator (uiout);
223 if (fldname)
224 fprintf_unfiltered (data->buffer, "%s=", fldname);
225 fprintf_unfiltered (data->buffer, "\"");
226 if (string)
227 fputstr_unfiltered (string, '"', data->buffer);
228 fprintf_unfiltered (data->buffer, "\"");
229}
230
2b03b41d 231/* This is the only field function that does not align. */
fb40c209
AC
232
233void
2b03b41d
SS
234mi_field_fmt (struct ui_out *uiout, int fldno, int width,
235 enum ui_align align, const char *fldname,
236 const char *format, va_list args)
fb40c209 237{
1248ede2 238 mi_out_data *data = ui_out_data (uiout);
102040f0 239
76fe6b98
AC
240 if (data->suppress_output)
241 return;
2b03b41d 242
fb40c209
AC
243 field_separator (uiout);
244 if (fldname)
245 fprintf_unfiltered (data->buffer, "%s=\"", fldname);
246 else
247 fputs_unfiltered ("\"", data->buffer);
248 vfprintf_unfiltered (data->buffer, format, args);
249 fputs_unfiltered ("\"", data->buffer);
250}
251
252void
fba45db2 253mi_spaces (struct ui_out *uiout, int numspaces)
fb40c209
AC
254{
255}
256
257void
e2e11a41 258mi_text (struct ui_out *uiout, const char *string)
fb40c209
AC
259{
260}
261
262void
e2e11a41 263mi_message (struct ui_out *uiout, int verbosity,
2b03b41d 264 const char *format, va_list args)
fb40c209
AC
265{
266}
267
268void
fba45db2 269mi_wrap_hint (struct ui_out *uiout, char *identstring)
fb40c209
AC
270{
271 wrap_here (identstring);
272}
273
274void
fba45db2 275mi_flush (struct ui_out *uiout)
fb40c209 276{
1248ede2 277 mi_out_data *data = ui_out_data (uiout);
102040f0 278
fb40c209
AC
279 gdb_flush (data->buffer);
280}
281
8d3788bd
VP
282int
283mi_redirect (struct ui_out *uiout, struct ui_file *outstream)
284{
285 mi_out_data *data = ui_out_data (uiout);
286
287 if (outstream != NULL)
288 {
289 data->original_buffer = data->buffer;
290 data->buffer = outstream;
291 }
292 else if (data->original_buffer != NULL)
293 {
294 data->buffer = data->original_buffer;
295 data->original_buffer = NULL;
296 }
297
298 return 0;
299}
300
fb40c209
AC
301/* local functions */
302
fb40c209
AC
303/* access to ui_out format private members */
304
305static void
306field_separator (struct ui_out *uiout)
307{
1248ede2 308 mi_out_data *data = ui_out_data (uiout);
102040f0 309
59807497
AC
310 if (data->suppress_field_separator)
311 data->suppress_field_separator = 0;
fb40c209
AC
312 else
313 fputc_unfiltered (',', data->buffer);
314}
315
316static void
2b03b41d 317mi_open (struct ui_out *uiout, const char *name, enum ui_out_type type)
fb40c209 318{
1248ede2 319 mi_out_data *data = ui_out_data (uiout);
102040f0 320
d5e8ba62 321 field_separator (uiout);
59807497 322 data->suppress_field_separator = 1;
d5e8ba62
AC
323 if (name)
324 fprintf_unfiltered (data->buffer, "%s=", name);
5a9aa5dc
AC
325 switch (type)
326 {
327 case ui_out_type_tuple:
328 fputc_unfiltered ('{', data->buffer);
329 break;
330 case ui_out_type_list:
da0f9dcd 331 fputc_unfiltered ('[', data->buffer);
5a9aa5dc
AC
332 break;
333 default:
e2e0b3e5 334 internal_error (__FILE__, __LINE__, _("bad switch"));
5a9aa5dc 335 }
fb40c209
AC
336}
337
338static void
2b03b41d 339mi_close (struct ui_out *uiout, enum ui_out_type type)
fb40c209 340{
1248ede2 341 mi_out_data *data = ui_out_data (uiout);
102040f0 342
5a9aa5dc
AC
343 switch (type)
344 {
345 case ui_out_type_tuple:
346 fputc_unfiltered ('}', data->buffer);
347 break;
348 case ui_out_type_list:
da0f9dcd 349 fputc_unfiltered (']', data->buffer);
5a9aa5dc
AC
350 break;
351 default:
e2e0b3e5 352 internal_error (__FILE__, __LINE__, _("bad switch"));
5a9aa5dc 353 }
59807497 354 data->suppress_field_separator = 0;
fb40c209
AC
355}
356
2b03b41d 357/* Add a string to the buffer. */
fb40c209
AC
358
359void
360mi_out_buffered (struct ui_out *uiout, char *string)
361{
1248ede2 362 mi_out_data *data = ui_out_data (uiout);
102040f0 363
fb40c209
AC
364 fprintf_unfiltered (data->buffer, "%s", string);
365}
366
2b03b41d 367/* Clear the buffer. */
fb40c209
AC
368
369void
370mi_out_rewind (struct ui_out *uiout)
371{
1248ede2 372 mi_out_data *data = ui_out_data (uiout);
102040f0 373
fb40c209
AC
374 ui_file_rewind (data->buffer);
375}
376
2b03b41d 377/* Dump the buffer onto the specified stream. */
fb40c209 378
fb40c209 379void
2b03b41d 380mi_out_put (struct ui_out *uiout, struct ui_file *stream)
fb40c209 381{
1248ede2 382 mi_out_data *data = ui_out_data (uiout);
102040f0 383
de571fc5 384 ui_file_put (data->buffer, ui_file_write_for_put, stream);
fb40c209
AC
385 ui_file_rewind (data->buffer);
386}
387
2b03b41d 388/* Return the current MI version. */
c7ec4050
AC
389
390int
391mi_version (struct ui_out *uiout)
392{
1248ede2 393 mi_out_data *data = ui_out_data (uiout);
102040f0 394
c7ec4050
AC
395 return data->mi_version;
396}
397
2b03b41d 398/* Initialize private members at startup. */
fb40c209
AC
399
400struct ui_out *
b30bf9ee 401mi_out_new (int mi_version)
fb40c209
AC
402{
403 int flags = 0;
102040f0 404
70ba0933 405 mi_out_data *data = XNEW (mi_out_data);
59807497 406 data->suppress_field_separator = 0;
bf702e7e 407 data->suppress_output = 0;
b30bf9ee 408 data->mi_version = mi_version;
fb40c209
AC
409 /* FIXME: This code should be using a ``string_file'' and not the
410 TUI buffer hack. */
411 data->buffer = mem_fileopen ();
412 return ui_out_new (&mi_ui_out_impl, data, flags);
413}