]> git.ipfire.org Git - thirdparty/binutils-gdb.git/blame - gdb/ui-out.h
Move scoped_ignore_sigttou to gdbsupport/
[thirdparty/binutils-gdb.git] / gdb / ui-out.h
CommitLineData
8b93c638 1/* Output generating routines for GDB.
bee0189a 2
3666a048 3 Copyright (C) 1999-2021 Free Software Foundation, Inc.
bee0189a 4
8b93c638
JM
5 Contributed by Cygnus Solutions.
6 Written by Fernando Nasser for Cygnus.
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
8b93c638
JM
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/>. */
8b93c638
JM
22
23#ifndef UI_OUT_H
24#define UI_OUT_H 1
25
112e8700 26#include <vector>
bef721e2 27
268a13a5 28#include "gdbsupport/enum-flags.h"
e43b10e1 29#include "ui-style.h"
8b93c638 30
112e8700
SM
31class ui_out_level;
32class ui_out_table;
e6e5e94c 33struct ui_file;
8b93c638
JM
34
35/* the current ui_out */
36
37/* FIXME: This should not be a global but something passed down from main.c
581e13c1 38 or top.c. */
b6dcde57
PA
39extern struct ui_out **current_ui_current_uiout_ptr (void);
40#define current_uiout (*current_ui_current_uiout_ptr ())
8b93c638
JM
41
42/* alignment enum */
43enum ui_align
44 {
45 ui_left = -1,
46 ui_center,
47 ui_right,
48 ui_noalign
49 };
50
51/* flags enum */
bef721e2 52enum ui_out_flag
13674803
SM
53{
54 ui_source_list = (1 << 0),
55 fix_multi_location_breakpoint_output = (1 << 1),
2a3c1174
PA
56 /* For CLI output, this flag is set if unfiltered output is desired.
57 This should only be used by low-level formatting functions. */
58 unfiltered_output = (1 << 2),
59 /* This indicates that %pF should be disallowed in a printf format
60 string. */
61 disallow_ui_out_field = (1 << 3)
13674803 62};
8b93c638 63
bef721e2 64DEF_ENUM_FLAGS_TYPE (ui_out_flag, ui_out_flags);
8b93c638 65
581e13c1 66/* Prototypes for ui-out API. */
8b93c638 67
631ec795 68/* A result is a recursive data structure consisting of lists and
581e13c1 69 tuples. */
631ec795
AC
70
71enum ui_out_type
72 {
666547aa 73 ui_out_type_tuple,
631ec795
AC
74 ui_out_type_list
75 };
76
2a3c1174
PA
77/* The possible kinds of fields. */
78enum class field_kind
79 {
2032eb7e
TT
80 /* "FIELD_STRING" needs a funny name to avoid clashes with tokens
81 named "STRING". See PR build/25250. FIELD_SIGNED is given a
82 similar name for consistency. */
28ce7b07
TT
83 FIELD_SIGNED,
84 FIELD_STRING,
2a3c1174
PA
85 };
86
87/* The base type of all fields that can be emitted using %pF. */
88
89struct base_field_s
90{
91 const char *name;
92 field_kind kind;
93};
94
95/* A signed integer field, to be passed to %pF in format strings. */
96
97struct signed_field_s : base_field_s
98{
99 LONGEST val;
100};
101
102/* Construct a temporary signed_field_s on the caller's stack and
103 return a pointer to the constructed object. We use this because
104 it's not possible to pass a reference via va_args. */
105
106static inline signed_field_s *
107signed_field (const char *name, LONGEST val,
108 signed_field_s &&tmp = {})
109{
110 tmp.name = name;
28ce7b07 111 tmp.kind = field_kind::FIELD_SIGNED;
2a3c1174
PA
112 tmp.val = val;
113 return &tmp;
114}
115
116/* A string field, to be passed to %pF in format strings. */
117
118struct string_field_s : base_field_s
119{
120 const char *str;
121};
122
123/* Construct a temporary string_field_s on the caller's stack and
124 return a pointer to the constructed object. We use this because
125 it's not possible to pass a reference via va_args. */
126
127static inline string_field_s *
128string_field (const char *name, const char *str,
129 string_field_s &&tmp = {})
130{
131 tmp.name = name;
28ce7b07 132 tmp.kind = field_kind::FIELD_STRING;
2a3c1174
PA
133 tmp.str = str;
134 return &tmp;
135}
136
137/* A styled string. */
138
139struct styled_string_s
140{
141 /* The style. */
142 ui_file_style style;
143
144 /* The string. */
145 const char *str;
146};
147
148/* Construct a temporary styled_string_s on the caller's stack and
149 return a pointer to the constructed object. We use this because
150 it's not possible to pass a reference via va_args. */
151
152static inline styled_string_s *
153styled_string (const ui_file_style &style, const char *str,
154 styled_string_s &&tmp = {})
155{
156 tmp.style = style;
157 tmp.str = str;
158 return &tmp;
159}
160
112e8700
SM
161class ui_out
162{
163 public:
164
165 explicit ui_out (ui_out_flags flags = 0);
166 virtual ~ui_out ();
167
168 void push_level (ui_out_type type);
169 void pop_level (ui_out_type type);
170
171 /* A table can be considered a special tuple/list combination with the
172 implied structure: ``table = { hdr = { header, ... } , body = [ {
173 field, ... }, ... ] }''. If NR_ROWS is negative then there is at
174 least one row. */
175
176 void table_begin (int nr_cols, int nr_rows, const std::string &tblid);
177 void table_header (int width, ui_align align, const std::string &col_name,
178 const std::string &col_hdr);
179 void table_body ();
180 void table_end ();
181
182 void begin (ui_out_type type, const char *id);
183 void end (ui_out_type type);
184
381befee
TT
185 void field_signed (const char *fldname, LONGEST value);
186 void field_fmt_signed (int width, ui_align align, const char *fldname,
187 LONGEST value);
188 /* Like field_signed, but print an unsigned value. */
1f77b012 189 void field_unsigned (const char *fldname, ULONGEST value);
112e8700
SM
190 void field_core_addr (const char *fldname, struct gdbarch *gdbarch,
191 CORE_ADDR address);
cbe56571 192 void field_string (const char *fldname, const char *string,
e43b10e1 193 const ui_file_style &style = ui_file_style ());
8dd8c8d4 194 void field_string (const char *fldname, const std::string &string,
0d7e3cd1
MB
195 const ui_file_style &style = ui_file_style ())
196 {
197 field_string (fldname, string.c_str (), style);
198 }
cbe56571 199 void field_stream (const char *fldname, string_file &stream,
e43b10e1 200 const ui_file_style &style = ui_file_style ());
112e8700
SM
201 void field_skip (const char *fldname);
202 void field_fmt (const char *fldname, const char *format, ...)
203 ATTRIBUTE_PRINTF (3, 4);
7f6aba03
TT
204 void field_fmt (const char *fldname, const ui_file_style &style,
205 const char *format, ...)
206 ATTRIBUTE_PRINTF (4, 5);
112e8700
SM
207
208 void spaces (int numspaces);
209 void text (const char *string);
0d7e3cd1 210 void text (const std::string &string) { text (string.c_str ()); }
2a3c1174
PA
211
212 /* Output a printf-style formatted string. In addition to the usual
213 printf format specs, this supports a few GDB-specific
214 formatters:
215
216 - '%pF' - output a field.
217
218 The argument is a field, wrapped in any of the base_field_s
219 subclasses. signed_field for integer fields, string_field for
220 string fields. This is preferred over separate
221 uiout->field_signed(), uiout_>field_string() etc. calls when
222 the formatted message is translatable. E.g.:
223
dda83cd7
SM
224 uiout->message (_("\nWatchpoint %pF deleted because the program has "
225 "left the block in\n"
226 "which its expression is valid.\n"),
227 signed_field ("wpnum", b->number));
2a3c1174
PA
228
229 - '%p[' - output the following text in a specified style.
230 '%p]' - output the following text in the default style.
231
232 The argument to '%p[' is a ui_file_style pointer. The argument
233 to '%p]' must be nullptr.
234
235 This is useful when you want to output some portion of a string
236 literal in some style. E.g.:
237
238 uiout->message (_(" %p[<repeats %u times>%p]"),
239 metadata_style.style ().ptr (),
240 reps, repeats, nullptr);
241
242 - '%ps' - output a styled string.
243
244 The argument is the result of a call to styled_string. This is
245 useful when you want to output some runtime-generated string in
246 some style. E.g.:
247
248 uiout->message (_("this is a target address %ps.\n"),
249 styled_string (address_style.style (),
250 paddress (gdbarch, pc)));
251
252 Note that these all "abuse" the %p printf format spec, in order
253 to be compatible with GCC's printf format checking. This is OK
254 because code in GDB that wants to print a host address should use
255 host_address_to_string instead of %p. */
112e8700 256 void message (const char *format, ...) ATTRIBUTE_PRINTF (2, 3);
2a3c1174
PA
257 void vmessage (const ui_file_style &in_style,
258 const char *format, va_list args) ATTRIBUTE_PRINTF (3, 0);
259
112e8700
SM
260 void wrap_hint (const char *identstring);
261
262 void flush ();
263
264 /* Redirect the output of a ui_out object temporarily. */
7becfd03 265 void redirect (ui_file *outstream);
112e8700
SM
266
267 ui_out_flags test_flags (ui_out_flags mask);
268
269 /* HACK: Code in GDB is currently checking to see the type of ui_out
270 builder when determining which output to produce. This function is
271 a hack to encapsulate that test. Once GDB manages to separate the
272 CLI/MI from the core of GDB the problem should just go away .... */
273
4904c3c6 274 bool is_mi_like_p () const;
112e8700
SM
275
276 bool query_table_field (int colno, int *width, int *alignment,
277 const char **col_name);
278
046bebe1
TT
279 /* Return true if this stream is prepared to handle style
280 escapes. */
281 virtual bool can_emit_style_escape () const = 0;
282
2f228731
TT
283 /* An object that starts and finishes a progress meter. */
284 class progress_meter
285 {
286 public:
287 /* SHOULD_PRINT indicates whether something should be printed for a tty. */
288 progress_meter (struct ui_out *uiout, const std::string &name,
289 bool should_print)
290 : m_uiout (uiout)
291 {
292 m_uiout->do_progress_start (name, should_print);
293 }
294
295 ~progress_meter ()
296 {
297 m_uiout->do_progress_notify (1.0);
298 m_uiout->do_progress_end ();
299 }
300
301 progress_meter (const progress_meter &) = delete;
302 progress_meter &operator= (const progress_meter &) = delete;
303
304 private:
305
306 struct ui_out *m_uiout;
307 };
308
309 /* Emit some progress corresponding to the most recently created
310 progress meter. HOWMUCH may range from 0.0 to 1.0. */
311 void progress (double howmuch)
312 {
313 do_progress_notify (howmuch);
314 }
315
112e8700
SM
316 protected:
317
318 virtual void do_table_begin (int nbrofcols, int nr_rows, const char *tblid)
319 = 0;
320 virtual void do_table_body () = 0;
321 virtual void do_table_end () = 0;
322 virtual void do_table_header (int width, ui_align align,
323 const std::string &col_name,
324 const std::string &col_hdr) = 0;
325
326 virtual void do_begin (ui_out_type type, const char *id) = 0;
327 virtual void do_end (ui_out_type type) = 0;
381befee
TT
328 virtual void do_field_signed (int fldno, int width, ui_align align,
329 const char *fldname, LONGEST value) = 0;
1f77b012
TT
330 virtual void do_field_unsigned (int fldno, int width, ui_align align,
331 const char *fldname, ULONGEST value) = 0;
112e8700
SM
332 virtual void do_field_skip (int fldno, int width, ui_align align,
333 const char *fldname) = 0;
334 virtual void do_field_string (int fldno, int width, ui_align align,
cbe56571 335 const char *fldname, const char *string,
e43b10e1 336 const ui_file_style &style) = 0;
112e8700 337 virtual void do_field_fmt (int fldno, int width, ui_align align,
7f6aba03
TT
338 const char *fldname, const ui_file_style &style,
339 const char *format, va_list args)
340 ATTRIBUTE_PRINTF (7, 0) = 0;
112e8700
SM
341 virtual void do_spaces (int numspaces) = 0;
342 virtual void do_text (const char *string) = 0;
2a3c1174
PA
343 virtual void do_message (const ui_file_style &style,
344 const char *format, va_list args)
345 ATTRIBUTE_PRINTF (3,0) = 0;
112e8700
SM
346 virtual void do_wrap_hint (const char *identstring) = 0;
347 virtual void do_flush () = 0;
7becfd03 348 virtual void do_redirect (struct ui_file *outstream) = 0;
112e8700 349
2f228731
TT
350 virtual void do_progress_start (const std::string &, bool) = 0;
351 virtual void do_progress_notify (double) = 0;
352 virtual void do_progress_end () = 0;
353
112e8700
SM
354 /* Set as not MI-like by default. It is overridden in subclasses if
355 necessary. */
356
4904c3c6 357 virtual bool do_is_mi_like_p () const
112e8700
SM
358 { return false; }
359
360 private:
2a3c1174
PA
361 void call_do_message (const ui_file_style &style, const char *format,
362 ...);
112e8700
SM
363
364 ui_out_flags m_flags;
365
366 /* Vector to store and track the ui-out levels. */
367 std::vector<std::unique_ptr<ui_out_level>> m_levels;
368
369 /* A table, if any. At present only a single table is supported. */
370 std::unique_ptr<ui_out_table> m_table_up;
371
372 void verify_field (int *fldno, int *width, ui_align *align);
373
374 int level () const;
375 ui_out_level *current_level () const;
376};
0fac0b41 377
296bd123
TT
378/* Start a new tuple or list on construction, and end it on
379 destruction. Normally this is used via the typedefs
380 ui_out_emit_tuple and ui_out_emit_list. */
d4b0bb18
TT
381template<ui_out_type Type>
382class ui_out_emit_type
383{
384public:
385
386 ui_out_emit_type (struct ui_out *uiout, const char *id)
387 : m_uiout (uiout)
388 {
389 uiout->begin (Type, id);
390 }
391
392 ~ui_out_emit_type ()
393 {
394 m_uiout->end (Type);
395 }
396
d6541620 397 DISABLE_COPY_AND_ASSIGN (ui_out_emit_type<Type>);
d4b0bb18
TT
398
399private:
400
401 struct ui_out *m_uiout;
402};
403
404typedef ui_out_emit_type<ui_out_type_tuple> ui_out_emit_tuple;
405typedef ui_out_emit_type<ui_out_type_list> ui_out_emit_list;
406
dc9fe180
TT
407/* Start a new table on construction, and end the table on
408 destruction. */
4a2b031d
TT
409class ui_out_emit_table
410{
411public:
412
413 ui_out_emit_table (struct ui_out *uiout, int nr_cols, int nr_rows,
414 const char *tblid)
415 : m_uiout (uiout)
416 {
417 m_uiout->table_begin (nr_cols, nr_rows, tblid);
418 }
419
420 ~ui_out_emit_table ()
421 {
422 m_uiout->table_end ();
423 }
424
425 ui_out_emit_table (const ui_out_emit_table &) = delete;
426 ui_out_emit_table &operator= (const ui_out_emit_table &) = delete;
427
428private:
429
430 struct ui_out *m_uiout;
431};
432
ca5909c7
TT
433/* On destruction, pop the last redirection by calling the uiout's
434 redirect method with a NULL parameter. */
435class ui_out_redirect_pop
436{
437public:
438
439 ui_out_redirect_pop (ui_out *uiout)
440 : m_uiout (uiout)
441 {
442 }
443
444 ~ui_out_redirect_pop ()
445 {
446 m_uiout->redirect (NULL);
447 }
448
449 ui_out_redirect_pop (const ui_out_redirect_pop &) = delete;
450 ui_out_redirect_pop &operator= (const ui_out_redirect_pop &) = delete;
451
452private:
453 struct ui_out *m_uiout;
454};
455
8b93c638 456#endif /* UI_OUT_H */