Change boolean options to bool instead of int
[deliverable/binutils-gdb.git] / gdb / mi / mi-out.c
CommitLineData
fb40c209 1/* MI Command Set - output generating routines.
349c5d5f 2
42a4f53d 3 Copyright (C) 2000-2019 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"
fb40c209 23#include "mi-out.h"
8e5e5494 24
4a9d4ea5 25#include <vector>
fb40c209 26
8e5e5494
SM
27#include "interps.h"
28#include "ui-out.h"
29#include "utils.h"
30
2b03b41d 31/* Mark beginning of a table. */
fb40c209
AC
32
33void
112e8700
SM
34mi_ui_out::do_table_begin (int nr_cols, int nr_rows,
35 const char *tblid)
fb40c209 36{
112e8700 37 open (tblid, ui_out_type_tuple);
381befee
TT
38 do_field_signed (-1, -1, ui_left, "nr_rows", nr_rows);
39 do_field_signed (-1, -1, ui_left, "nr_cols", nr_cols);
112e8700 40 open ("hdr", ui_out_type_list);
fb40c209
AC
41}
42
2b03b41d 43/* Mark beginning of a table body. */
fb40c209
AC
44
45void
112e8700 46mi_ui_out::do_table_body ()
fb40c209 47{
cff22675 48 /* close the table header line if there were any headers */
112e8700
SM
49 close (ui_out_type_list);
50 open ("body", ui_out_type_list);
fb40c209
AC
51}
52
2b03b41d 53/* Mark end of a table. */
fb40c209
AC
54
55void
112e8700 56mi_ui_out::do_table_end ()
fb40c209 57{
112e8700
SM
58 close (ui_out_type_list); /* body */
59 close (ui_out_type_tuple);
fb40c209
AC
60}
61
2b03b41d 62/* Specify table header. */
fb40c209
AC
63
64void
112e8700
SM
65mi_ui_out::do_table_header (int width, ui_align alignment,
66 const std::string &col_name,
67 const std::string &col_hdr)
fb40c209 68{
112e8700 69 open (NULL, ui_out_type_tuple);
381befee
TT
70 do_field_signed (0, 0, ui_center, "width", width);
71 do_field_signed (0, 0, ui_center, "alignment", alignment);
cbe56571
TT
72 do_field_string (0, 0, ui_center, "col_name", col_name.c_str (),
73 ui_out_style_kind::DEFAULT);
74 do_field_string (0, width, alignment, "colhdr", col_hdr.c_str (),
75 ui_out_style_kind::DEFAULT);
112e8700 76 close (ui_out_type_tuple);
fb40c209
AC
77}
78
2b03b41d 79/* Mark beginning of a list. */
fb40c209
AC
80
81void
112e8700 82mi_ui_out::do_begin (ui_out_type type, const char *id)
fb40c209 83{
112e8700 84 open (id, type);
fb40c209
AC
85}
86
2b03b41d 87/* Mark end of a list. */
fb40c209
AC
88
89void
112e8700 90mi_ui_out::do_end (ui_out_type type)
fb40c209 91{
112e8700 92 close (type);
fb40c209
AC
93}
94
2b03b41d 95/* Output an int field. */
fb40c209 96
112e8700 97void
381befee
TT
98mi_ui_out::do_field_signed (int fldno, int width, ui_align alignment,
99 const char *fldname, LONGEST value)
fb40c209 100{
07128006 101 do_field_string (fldno, width, alignment, fldname, plongest (value),
cbe56571 102 ui_out_style_kind::DEFAULT);
fb40c209
AC
103}
104
1f77b012
TT
105/* Output an unsigned field. */
106
107void
108mi_ui_out::do_field_unsigned (int fldno, int width, ui_align alignment,
109 const char *fldname, ULONGEST value)
110{
111 do_field_string (fldno, width, alignment, fldname, pulongest (value),
112 ui_out_style_kind::DEFAULT);
113}
114
2b03b41d 115/* Used to omit a field. */
fb40c209
AC
116
117void
112e8700
SM
118mi_ui_out::do_field_skip (int fldno, int width, ui_align alignment,
119 const char *fldname)
fb40c209 120{
fb40c209
AC
121}
122
2b03b41d
SS
123/* Other specific mi_field_* end up here so alignment and field
124 separators are both handled by mi_field_string. */
fb40c209
AC
125
126void
112e8700 127mi_ui_out::do_field_string (int fldno, int width, ui_align align,
cbe56571
TT
128 const char *fldname, const char *string,
129 ui_out_style_kind style)
fb40c209 130{
112e8700
SM
131 ui_file *stream = m_streams.back ();
132 field_separator ();
102040f0 133
fb40c209 134 if (fldname)
4d6cceb4
DE
135 fprintf_unfiltered (stream, "%s=", fldname);
136 fprintf_unfiltered (stream, "\"");
fb40c209 137 if (string)
4d6cceb4
DE
138 fputstr_unfiltered (string, '"', stream);
139 fprintf_unfiltered (stream, "\"");
fb40c209
AC
140}
141
fb40c209 142void
112e8700
SM
143mi_ui_out::do_field_fmt (int fldno, int width, ui_align align,
144 const char *fldname, const char *format,
145 va_list args)
fb40c209 146{
112e8700
SM
147 ui_file *stream = m_streams.back ();
148 field_separator ();
102040f0 149
fb40c209 150 if (fldname)
4d6cceb4 151 fprintf_unfiltered (stream, "%s=\"", fldname);
fb40c209 152 else
4d6cceb4
DE
153 fputs_unfiltered ("\"", stream);
154 vfprintf_unfiltered (stream, format, args);
155 fputs_unfiltered ("\"", stream);
fb40c209
AC
156}
157
158void
112e8700 159mi_ui_out::do_spaces (int numspaces)
fb40c209
AC
160{
161}
162
163void
112e8700 164mi_ui_out::do_text (const char *string)
fb40c209
AC
165{
166}
167
168void
112e8700 169mi_ui_out::do_message (const char *format, va_list args)
fb40c209
AC
170{
171}
172
173void
112e8700 174mi_ui_out::do_wrap_hint (const char *identstring)
fb40c209
AC
175{
176 wrap_here (identstring);
177}
178
179void
112e8700 180mi_ui_out::do_flush ()
fb40c209 181{
102040f0 182
112e8700 183 gdb_flush (m_streams.back ());
fb40c209
AC
184}
185
7becfd03 186void
112e8700 187mi_ui_out::do_redirect (ui_file *outstream)
8d3788bd 188{
8d3788bd 189 if (outstream != NULL)
112e8700 190 m_streams.push_back (outstream);
4d6cceb4 191 else
112e8700 192 m_streams.pop_back ();
8d3788bd
VP
193}
194
112e8700
SM
195void
196mi_ui_out::field_separator ()
fb40c209 197{
112e8700
SM
198 if (m_suppress_field_separator)
199 m_suppress_field_separator = false;
fb40c209 200 else
112e8700 201 fputc_unfiltered (',', m_streams.back ());
fb40c209
AC
202}
203
112e8700
SM
204void
205mi_ui_out::open (const char *name, ui_out_type type)
fb40c209 206{
112e8700
SM
207 ui_file *stream = m_streams.back ();
208
209 field_separator ();
210 m_suppress_field_separator = true;
102040f0 211
d5e8ba62 212 if (name)
4d6cceb4 213 fprintf_unfiltered (stream, "%s=", name);
112e8700 214
5a9aa5dc
AC
215 switch (type)
216 {
217 case ui_out_type_tuple:
4d6cceb4 218 fputc_unfiltered ('{', stream);
5a9aa5dc 219 break;
112e8700 220
5a9aa5dc 221 case ui_out_type_list:
4d6cceb4 222 fputc_unfiltered ('[', stream);
5a9aa5dc 223 break;
112e8700 224
5a9aa5dc 225 default:
e2e0b3e5 226 internal_error (__FILE__, __LINE__, _("bad switch"));
5a9aa5dc 227 }
fb40c209
AC
228}
229
112e8700
SM
230void
231mi_ui_out::close (ui_out_type type)
fb40c209 232{
112e8700 233 ui_file *stream = m_streams.back ();
102040f0 234
5a9aa5dc
AC
235 switch (type)
236 {
237 case ui_out_type_tuple:
4d6cceb4 238 fputc_unfiltered ('}', stream);
5a9aa5dc 239 break;
112e8700 240
5a9aa5dc 241 case ui_out_type_list:
4d6cceb4 242 fputc_unfiltered (']', stream);
5a9aa5dc 243 break;
112e8700 244
5a9aa5dc 245 default:
e2e0b3e5 246 internal_error (__FILE__, __LINE__, _("bad switch"));
5a9aa5dc 247 }
112e8700
SM
248
249 m_suppress_field_separator = false;
fb40c209
AC
250}
251
d7e74731
PA
252string_file *
253mi_ui_out::main_stream ()
254{
255 gdb_assert (m_streams.size () == 1);
256
257 return (string_file *) m_streams.back ();
258}
259
2b03b41d 260/* Clear the buffer. */
fb40c209
AC
261
262void
112e8700 263mi_ui_out::rewind ()
fb40c209 264{
d7e74731 265 main_stream ()->clear ();
fb40c209
AC
266}
267
2b03b41d 268/* Dump the buffer onto the specified stream. */
fb40c209 269
fb40c209 270void
d7e74731 271mi_ui_out::put (ui_file *where)
fb40c209 272{
d7e74731 273 string_file *mi_stream = main_stream ();
102040f0 274
d7e74731
PA
275 where->write (mi_stream->data (), mi_stream->size ());
276 mi_stream->clear ();
fb40c209
AC
277}
278
2b03b41d 279/* Return the current MI version. */
c7ec4050
AC
280
281int
112e8700 282mi_ui_out::version ()
c7ec4050 283{
112e8700 284 return m_mi_version;
c7ec4050
AC
285}
286
4d6cceb4
DE
287/* Constructor for an `mi_out_data' object. */
288
d7e74731 289mi_ui_out::mi_ui_out (int mi_version)
13674803
SM
290: ui_out (mi_version >= 3
291 ? fix_multi_location_breakpoint_output : (ui_out_flag) 0),
292 m_suppress_field_separator (false),
112e8700
SM
293 m_suppress_output (false),
294 m_mi_version (mi_version)
4d6cceb4 295{
d7e74731 296 string_file *stream = new string_file ();
112e8700
SM
297 m_streams.push_back (stream);
298}
4d6cceb4 299
112e8700
SM
300mi_ui_out::~mi_ui_out ()
301{
4d6cceb4
DE
302}
303
8e5e5494 304/* See mi/mi-out.h. */
4d6cceb4 305
112e8700 306mi_ui_out *
8e5e5494 307mi_out_new (const char *mi_version)
4d6cceb4 308{
b4be1b06 309 if (streq (mi_version, INTERP_MI3) || streq (mi_version, INTERP_MI))
8e5e5494
SM
310 return new mi_ui_out (3);
311
b4be1b06 312 if (streq (mi_version, INTERP_MI2))
8e5e5494
SM
313 return new mi_ui_out (2);
314
315 if (streq (mi_version, INTERP_MI1))
316 return new mi_ui_out (1);
317
318 return nullptr;
4d6cceb4
DE
319}
320
112e8700
SM
321/* Helper function to return the given UIOUT as an mi_ui_out. It is an error
322 to call this function with an ui_out that is not an MI. */
fb40c209 323
112e8700
SM
324static mi_ui_out *
325as_mi_ui_out (ui_out *uiout)
fb40c209 326{
112e8700
SM
327 mi_ui_out *mi_uiout = dynamic_cast<mi_ui_out *> (uiout);
328
329 gdb_assert (mi_uiout != NULL);
330
331 return mi_uiout;
332}
4d6cceb4 333
112e8700
SM
334int
335mi_version (ui_out *uiout)
336{
337 return as_mi_ui_out (uiout)->version ();
338}
339
340void
341mi_out_put (ui_out *uiout, struct ui_file *stream)
342{
343 return as_mi_ui_out (uiout)->put (stream);
344}
345
346void
347mi_out_rewind (ui_out *uiout)
348{
349 return as_mi_ui_out (uiout)->rewind ();
fb40c209 350}
This page took 1.683752 seconds and 4 git commands to generate.