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