Use ui_out_emit_table and ui_out_emit_list in print_thread_info_1
[deliverable/binutils-gdb.git] / gdb / ui-out.h
CommitLineData
8b93c638 1/* Output generating routines for GDB.
bee0189a 2
61baf725 3 Copyright (C) 1999-2017 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
112e8700 28#include "common/enum-flags.h"
8b93c638 29
112e8700
SM
30class ui_out_level;
31class ui_out_table;
e6e5e94c 32struct ui_file;
8b93c638
JM
33
34/* the current ui_out */
35
36/* FIXME: This should not be a global but something passed down from main.c
581e13c1 37 or top.c. */
b6dcde57
PA
38extern struct ui_out **current_ui_current_uiout_ptr (void);
39#define current_uiout (*current_ui_current_uiout_ptr ())
8b93c638
JM
40
41/* alignment enum */
42enum ui_align
43 {
44 ui_left = -1,
45 ui_center,
46 ui_right,
47 ui_noalign
48 };
49
50/* flags enum */
bef721e2 51enum ui_out_flag
8b93c638 52 {
bef721e2 53 ui_source_list = (1 << 0),
8b93c638
JM
54 };
55
bef721e2 56DEF_ENUM_FLAGS_TYPE (ui_out_flag, ui_out_flags);
8b93c638 57
581e13c1 58/* Prototypes for ui-out API. */
8b93c638 59
631ec795 60/* A result is a recursive data structure consisting of lists and
581e13c1 61 tuples. */
631ec795
AC
62
63enum ui_out_type
64 {
666547aa 65 ui_out_type_tuple,
631ec795
AC
66 ui_out_type_list
67 };
68
3b31d625
EZ
69extern struct cleanup *make_cleanup_ui_out_table_begin_end (struct ui_out *ui_out,
70 int nr_cols,
3e43a32a
MS
71 int nr_rows,
72 const char *tblid);
6b28c186 73/* Compatibility wrappers. */
631ec795 74
6b28c186
AC
75extern struct cleanup *make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
76 const char *id);
666547aa 77
666547aa
AC
78extern struct cleanup *make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
79 const char *id);
e6e0bfab 80
112e8700
SM
81class ui_out
82{
83 public:
84
85 explicit ui_out (ui_out_flags flags = 0);
86 virtual ~ui_out ();
87
88 void push_level (ui_out_type type);
89 void pop_level (ui_out_type type);
90
91 /* A table can be considered a special tuple/list combination with the
92 implied structure: ``table = { hdr = { header, ... } , body = [ {
93 field, ... }, ... ] }''. If NR_ROWS is negative then there is at
94 least one row. */
95
96 void table_begin (int nr_cols, int nr_rows, const std::string &tblid);
97 void table_header (int width, ui_align align, const std::string &col_name,
98 const std::string &col_hdr);
99 void table_body ();
100 void table_end ();
101
102 void begin (ui_out_type type, const char *id);
103 void end (ui_out_type type);
104
105 void field_int (const char *fldname, int value);
106 void field_fmt_int (int width, ui_align align, const char *fldname,
107 int value);
108 void field_core_addr (const char *fldname, struct gdbarch *gdbarch,
109 CORE_ADDR address);
110 void field_string (const char *fldname, const char *string);
d7e74731 111 void field_stream (const char *fldname, string_file &stream);
112e8700
SM
112 void field_skip (const char *fldname);
113 void field_fmt (const char *fldname, const char *format, ...)
114 ATTRIBUTE_PRINTF (3, 4);
115
116 void spaces (int numspaces);
117 void text (const char *string);
118 void message (const char *format, ...) ATTRIBUTE_PRINTF (2, 3);
119 void wrap_hint (const char *identstring);
120
121 void flush ();
122
123 /* Redirect the output of a ui_out object temporarily. */
7becfd03 124 void redirect (ui_file *outstream);
112e8700
SM
125
126 ui_out_flags test_flags (ui_out_flags mask);
127
128 /* HACK: Code in GDB is currently checking to see the type of ui_out
129 builder when determining which output to produce. This function is
130 a hack to encapsulate that test. Once GDB manages to separate the
131 CLI/MI from the core of GDB the problem should just go away .... */
132
133 bool is_mi_like_p ();
134
135 bool query_table_field (int colno, int *width, int *alignment,
136 const char **col_name);
137
138 protected:
139
140 virtual void do_table_begin (int nbrofcols, int nr_rows, const char *tblid)
141 = 0;
142 virtual void do_table_body () = 0;
143 virtual void do_table_end () = 0;
144 virtual void do_table_header (int width, ui_align align,
145 const std::string &col_name,
146 const std::string &col_hdr) = 0;
147
148 virtual void do_begin (ui_out_type type, const char *id) = 0;
149 virtual void do_end (ui_out_type type) = 0;
150 virtual void do_field_int (int fldno, int width, ui_align align,
151 const char *fldname, int value) = 0;
152 virtual void do_field_skip (int fldno, int width, ui_align align,
153 const char *fldname) = 0;
154 virtual void do_field_string (int fldno, int width, ui_align align,
155 const char *fldname, const char *string) = 0;
156 virtual void do_field_fmt (int fldno, int width, ui_align align,
157 const char *fldname, const char *format,
158 va_list args)
159 ATTRIBUTE_PRINTF (6,0) = 0;
160 virtual void do_spaces (int numspaces) = 0;
161 virtual void do_text (const char *string) = 0;
162 virtual void do_message (const char *format, va_list args)
163 ATTRIBUTE_PRINTF (2,0) = 0;
164 virtual void do_wrap_hint (const char *identstring) = 0;
165 virtual void do_flush () = 0;
7becfd03 166 virtual void do_redirect (struct ui_file *outstream) = 0;
112e8700
SM
167
168 /* Set as not MI-like by default. It is overridden in subclasses if
169 necessary. */
170
171 virtual bool do_is_mi_like_p ()
172 { return false; }
173
174 private:
175
176 ui_out_flags m_flags;
177
178 /* Vector to store and track the ui-out levels. */
179 std::vector<std::unique_ptr<ui_out_level>> m_levels;
180
181 /* A table, if any. At present only a single table is supported. */
182 std::unique_ptr<ui_out_table> m_table_up;
183
184 void verify_field (int *fldno, int *width, ui_align *align);
185
186 int level () const;
187 ui_out_level *current_level () const;
188};
0fac0b41 189
d4b0bb18
TT
190/* This is similar to make_cleanup_ui_out_tuple_begin_end and
191 make_cleanup_ui_out_list_begin_end, but written as an RAII template
192 class. It takes the ui_out_type as a template parameter. Normally
193 this is used via the typedefs ui_out_emit_tuple and
194 ui_out_emit_list. */
195template<ui_out_type Type>
196class ui_out_emit_type
197{
198public:
199
200 ui_out_emit_type (struct ui_out *uiout, const char *id)
201 : m_uiout (uiout)
202 {
203 uiout->begin (Type, id);
204 }
205
206 ~ui_out_emit_type ()
207 {
208 m_uiout->end (Type);
209 }
210
211 ui_out_emit_type (const ui_out_emit_type<Type> &) = delete;
212 ui_out_emit_type<Type> &operator= (const ui_out_emit_type<Type> &)
213 = delete;
214
215private:
216
217 struct ui_out *m_uiout;
218};
219
220typedef ui_out_emit_type<ui_out_type_tuple> ui_out_emit_tuple;
221typedef ui_out_emit_type<ui_out_type_list> ui_out_emit_list;
222
4a2b031d
TT
223/* This is similar to make_cleanup_ui_out_table_begin_end, but written
224 as an RAII class. */
225class ui_out_emit_table
226{
227public:
228
229 ui_out_emit_table (struct ui_out *uiout, int nr_cols, int nr_rows,
230 const char *tblid)
231 : m_uiout (uiout)
232 {
233 m_uiout->table_begin (nr_cols, nr_rows, tblid);
234 }
235
236 ~ui_out_emit_table ()
237 {
238 m_uiout->table_end ();
239 }
240
241 ui_out_emit_table (const ui_out_emit_table &) = delete;
242 ui_out_emit_table &operator= (const ui_out_emit_table &) = delete;
243
244private:
245
246 struct ui_out *m_uiout;
247};
248
8b93c638 249#endif /* UI_OUT_H */
This page took 2.098304 seconds and 4 git commands to generate.