Switch the license of all .c files to GPLv3.
[deliverable/binutils-gdb.git] / gdb / mi / mi-out.c
CommitLineData
fb40c209 1/* MI Command Set - output generating routines.
349c5d5f 2
6aba47ca
DJ
3 Copyright (C) 2000, 2002, 2003, 2004, 2005, 2007
4 Free Software Foundation, Inc.
349c5d5f 5
ab91fdd5 6 Contributed by Cygnus Solutions (a Red Hat company).
fb40c209
AC
7
8 This file is part of GDB.
9
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
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
fb40c209
AC
13 (at your option) any later version.
14
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.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
fb40c209
AC
22
23#include "defs.h"
24#include "ui-out.h"
25#include "mi-out.h"
26
fb40c209
AC
27struct ui_out_data
28 {
59807497 29 int suppress_field_separator;
76fe6b98 30 int suppress_output;
b30bf9ee 31 int mi_version;
fb40c209
AC
32 struct ui_file *buffer;
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,
bee0189a 58 va_list args) ATTR_FORMAT (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
DJ
62 const char *format, va_list args)
63 ATTR_FORMAT (printf, 3, 0);
fb40c209
AC
64static void mi_wrap_hint (struct ui_out *uiout, char *identstring);
65static void mi_flush (struct ui_out *uiout);
66
67/* This is the MI ui-out implementation functions vector */
68
69/* FIXME: This can be initialized dynamically after default is set to
70 handle initial output in main.c */
71
72struct ui_out_impl mi_ui_out_impl =
73{
74 mi_table_begin,
75 mi_table_body,
76 mi_table_end,
77 mi_table_header,
631ec795
AC
78 mi_begin,
79 mi_end,
fb40c209
AC
80 mi_field_int,
81 mi_field_skip,
82 mi_field_string,
83 mi_field_fmt,
84 mi_spaces,
85 mi_text,
86 mi_message,
87 mi_wrap_hint,
9dc5e2a9 88 mi_flush,
0fac0b41 89 NULL,
9dc5e2a9 90 1, /* Needs MI hacks. */
fb40c209
AC
91};
92
93/* Prototypes for local functions */
94
a14ed312 95extern void _initialize_mi_out (void);
fb40c209 96static void field_separator (struct ui_out *uiout);
d5e8ba62
AC
97static void mi_open (struct ui_out *uiout, const char *name,
98 enum ui_out_type type);
9a0f0643 99static void mi_close (struct ui_out *uiout, enum ui_out_type type);
fb40c209 100
fb40c209
AC
101/* Mark beginning of a table */
102
103void
cff22675
AC
104mi_table_begin (struct ui_out *uiout,
105 int nr_cols,
d63f1d40 106 int nr_rows,
e2e11a41 107 const char *tblid)
fb40c209 108{
1248ede2 109 mi_out_data *data = ui_out_data (uiout);
d5e8ba62 110 mi_open (uiout, tblid, ui_out_type_tuple);
cff22675
AC
111 mi_field_int (uiout, -1/*fldno*/, -1/*width*/, -1/*alin*/,
112 "nr_rows", nr_rows);
113 mi_field_int (uiout, -1/*fldno*/, -1/*width*/, -1/*alin*/,
114 "nr_cols", nr_cols);
115 mi_open (uiout, "hdr", ui_out_type_list);
fb40c209
AC
116}
117
118/* Mark beginning of a table body */
119
120void
fba45db2 121mi_table_body (struct ui_out *uiout)
fb40c209 122{
1248ede2 123 mi_out_data *data = ui_out_data (uiout);
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
131/* Mark end of a table */
132
133void
fba45db2 134mi_table_end (struct ui_out *uiout)
fb40c209 135{
1248ede2 136 mi_out_data *data = ui_out_data (uiout);
76fe6b98 137 data->suppress_output = 0;
cff22675 138 mi_close (uiout, ui_out_type_list); /* body */
666547aa 139 mi_close (uiout, ui_out_type_tuple);
fb40c209
AC
140}
141
142/* Specify table header */
143
144void
46712191 145mi_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
b25959ec 146 const char *col_name,
e2e11a41 147 const char *colhdr)
fb40c209 148{
1248ede2 149 mi_out_data *data = ui_out_data (uiout);
76fe6b98
AC
150 if (data->suppress_output)
151 return;
cff22675
AC
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);
fb40c209
AC
158}
159
160/* Mark beginning of a list */
161
162void
631ec795
AC
163mi_begin (struct ui_out *uiout,
164 enum ui_out_type type,
165 int level,
9a0f0643 166 const char *id)
fb40c209 167{
1248ede2 168 mi_out_data *data = ui_out_data (uiout);
76fe6b98
AC
169 if (data->suppress_output)
170 return;
d5e8ba62 171 mi_open (uiout, id, type);
fb40c209
AC
172}
173
174/* Mark end of a list */
175
176void
631ec795
AC
177mi_end (struct ui_out *uiout,
178 enum ui_out_type type,
179 int level)
fb40c209 180{
1248ede2 181 mi_out_data *data = ui_out_data (uiout);
76fe6b98
AC
182 if (data->suppress_output)
183 return;
9a0f0643 184 mi_close (uiout, type);
fb40c209
AC
185}
186
187/* output an int field */
188
189void
46712191
KB
190mi_field_int (struct ui_out *uiout, int fldno, int width,
191 enum ui_align alignment, const char *fldname, int value)
fb40c209
AC
192{
193 char buffer[20]; /* FIXME: how many chars long a %d can become? */
1248ede2 194 mi_out_data *data = ui_out_data (uiout);
76fe6b98
AC
195 if (data->suppress_output)
196 return;
fb40c209
AC
197
198 sprintf (buffer, "%d", value);
199 mi_field_string (uiout, fldno, width, alignment, fldname, buffer);
200}
201
202/* used to ommit a field */
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{
1248ede2 208 mi_out_data *data = ui_out_data (uiout);
76fe6b98
AC
209 if (data->suppress_output)
210 return;
fb40c209
AC
211 mi_field_string (uiout, fldno, width, alignment, fldname, "");
212}
213
214/* other specific mi_field_* end up here so alignment and field
215 separators are both handled by mi_field_string */
216
217void
218mi_field_string (struct ui_out *uiout,
219 int fldno,
220 int width,
46712191 221 enum ui_align align,
e2e11a41 222 const char *fldname,
fb40c209
AC
223 const char *string)
224{
1248ede2 225 mi_out_data *data = ui_out_data (uiout);
76fe6b98
AC
226 if (data->suppress_output)
227 return;
fb40c209
AC
228 field_separator (uiout);
229 if (fldname)
230 fprintf_unfiltered (data->buffer, "%s=", fldname);
231 fprintf_unfiltered (data->buffer, "\"");
232 if (string)
233 fputstr_unfiltered (string, '"', data->buffer);
234 fprintf_unfiltered (data->buffer, "\"");
235}
236
237/* This is the only field function that does not align */
238
239void
240mi_field_fmt (struct ui_out *uiout, int fldno,
241 int width, enum ui_align align,
e2e11a41
AC
242 const char *fldname,
243 const char *format,
244 va_list args)
fb40c209 245{
1248ede2 246 mi_out_data *data = ui_out_data (uiout);
76fe6b98
AC
247 if (data->suppress_output)
248 return;
fb40c209
AC
249 field_separator (uiout);
250 if (fldname)
251 fprintf_unfiltered (data->buffer, "%s=\"", fldname);
252 else
253 fputs_unfiltered ("\"", data->buffer);
254 vfprintf_unfiltered (data->buffer, format, args);
255 fputs_unfiltered ("\"", data->buffer);
256}
257
258void
fba45db2 259mi_spaces (struct ui_out *uiout, int numspaces)
fb40c209
AC
260{
261}
262
263void
e2e11a41 264mi_text (struct ui_out *uiout, const char *string)
fb40c209
AC
265{
266}
267
268void
e2e11a41
AC
269mi_message (struct ui_out *uiout, int verbosity,
270 const char *format,
271 va_list args)
fb40c209
AC
272{
273}
274
275void
fba45db2 276mi_wrap_hint (struct ui_out *uiout, char *identstring)
fb40c209
AC
277{
278 wrap_here (identstring);
279}
280
281void
fba45db2 282mi_flush (struct ui_out *uiout)
fb40c209 283{
1248ede2 284 mi_out_data *data = ui_out_data (uiout);
fb40c209
AC
285 gdb_flush (data->buffer);
286}
287
288/* local functions */
289
fb40c209
AC
290/* access to ui_out format private members */
291
292static void
293field_separator (struct ui_out *uiout)
294{
1248ede2 295 mi_out_data *data = ui_out_data (uiout);
59807497
AC
296 if (data->suppress_field_separator)
297 data->suppress_field_separator = 0;
fb40c209
AC
298 else
299 fputc_unfiltered (',', data->buffer);
300}
301
302static void
9a0f0643 303mi_open (struct ui_out *uiout,
d5e8ba62 304 const char *name,
9a0f0643 305 enum ui_out_type type)
fb40c209 306{
1248ede2 307 mi_out_data *data = ui_out_data (uiout);
d5e8ba62 308 field_separator (uiout);
59807497 309 data->suppress_field_separator = 1;
d5e8ba62
AC
310 if (name)
311 fprintf_unfiltered (data->buffer, "%s=", name);
5a9aa5dc
AC
312 switch (type)
313 {
314 case ui_out_type_tuple:
315 fputc_unfiltered ('{', data->buffer);
316 break;
317 case ui_out_type_list:
da0f9dcd 318 fputc_unfiltered ('[', data->buffer);
5a9aa5dc
AC
319 break;
320 default:
e2e0b3e5 321 internal_error (__FILE__, __LINE__, _("bad switch"));
5a9aa5dc 322 }
fb40c209
AC
323}
324
325static void
9a0f0643
AC
326mi_close (struct ui_out *uiout,
327 enum ui_out_type type)
fb40c209 328{
1248ede2 329 mi_out_data *data = ui_out_data (uiout);
5a9aa5dc
AC
330 switch (type)
331 {
332 case ui_out_type_tuple:
333 fputc_unfiltered ('}', data->buffer);
334 break;
335 case ui_out_type_list:
da0f9dcd 336 fputc_unfiltered (']', data->buffer);
5a9aa5dc
AC
337 break;
338 default:
e2e0b3e5 339 internal_error (__FILE__, __LINE__, _("bad switch"));
5a9aa5dc 340 }
59807497 341 data->suppress_field_separator = 0;
fb40c209
AC
342}
343
344/* add a string to the buffer */
345
346void
347mi_out_buffered (struct ui_out *uiout, char *string)
348{
1248ede2 349 mi_out_data *data = ui_out_data (uiout);
fb40c209
AC
350 fprintf_unfiltered (data->buffer, "%s", string);
351}
352
353/* clear the buffer */
354
355void
356mi_out_rewind (struct ui_out *uiout)
357{
1248ede2 358 mi_out_data *data = ui_out_data (uiout);
fb40c209
AC
359 ui_file_rewind (data->buffer);
360}
361
362/* dump the buffer onto the specified stream */
363
364static void
365do_write (void *data, const char *buffer, long length_buffer)
366{
367 ui_file_write (data, buffer, length_buffer);
368}
369
370void
371mi_out_put (struct ui_out *uiout,
372 struct ui_file *stream)
373{
1248ede2 374 mi_out_data *data = ui_out_data (uiout);
fb40c209
AC
375 ui_file_put (data->buffer, do_write, stream);
376 ui_file_rewind (data->buffer);
377}
378
c7ec4050
AC
379/* Current MI version. */
380
381int
382mi_version (struct ui_out *uiout)
383{
1248ede2 384 mi_out_data *data = ui_out_data (uiout);
c7ec4050
AC
385 return data->mi_version;
386}
387
fb40c209
AC
388/* initalize private members at startup */
389
390struct ui_out *
b30bf9ee 391mi_out_new (int mi_version)
fb40c209
AC
392{
393 int flags = 0;
1248ede2 394 mi_out_data *data = XMALLOC (mi_out_data);
59807497 395 data->suppress_field_separator = 0;
bf702e7e 396 data->suppress_output = 0;
b30bf9ee 397 data->mi_version = mi_version;
fb40c209
AC
398 /* FIXME: This code should be using a ``string_file'' and not the
399 TUI buffer hack. */
400 data->buffer = mem_fileopen ();
401 return ui_out_new (&mi_ui_out_impl, data, flags);
402}
403
404/* standard gdb initialization hook */
405void
fba45db2 406_initialize_mi_out (void)
fb40c209
AC
407{
408 /* nothing happens here */
409}
This page took 0.583747 seconds and 4 git commands to generate.