Use ui_out_emit_list in more places
[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
6b28c186 69/* Compatibility wrappers. */
631ec795 70
6b28c186
AC
71extern struct cleanup *make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
72 const char *id);
666547aa 73
666547aa
AC
74extern struct cleanup *make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
75 const char *id);
e6e0bfab 76
112e8700
SM
77class ui_out
78{
79 public:
80
81 explicit ui_out (ui_out_flags flags = 0);
82 virtual ~ui_out ();
83
84 void push_level (ui_out_type type);
85 void pop_level (ui_out_type type);
86
87 /* A table can be considered a special tuple/list combination with the
88 implied structure: ``table = { hdr = { header, ... } , body = [ {
89 field, ... }, ... ] }''. If NR_ROWS is negative then there is at
90 least one row. */
91
92 void table_begin (int nr_cols, int nr_rows, const std::string &tblid);
93 void table_header (int width, ui_align align, const std::string &col_name,
94 const std::string &col_hdr);
95 void table_body ();
96 void table_end ();
97
98 void begin (ui_out_type type, const char *id);
99 void end (ui_out_type type);
100
101 void field_int (const char *fldname, int value);
102 void field_fmt_int (int width, ui_align align, const char *fldname,
103 int value);
104 void field_core_addr (const char *fldname, struct gdbarch *gdbarch,
105 CORE_ADDR address);
106 void field_string (const char *fldname, const char *string);
d7e74731 107 void field_stream (const char *fldname, string_file &stream);
112e8700
SM
108 void field_skip (const char *fldname);
109 void field_fmt (const char *fldname, const char *format, ...)
110 ATTRIBUTE_PRINTF (3, 4);
111
112 void spaces (int numspaces);
113 void text (const char *string);
114 void message (const char *format, ...) ATTRIBUTE_PRINTF (2, 3);
115 void wrap_hint (const char *identstring);
116
117 void flush ();
118
119 /* Redirect the output of a ui_out object temporarily. */
7becfd03 120 void redirect (ui_file *outstream);
112e8700
SM
121
122 ui_out_flags test_flags (ui_out_flags mask);
123
124 /* HACK: Code in GDB is currently checking to see the type of ui_out
125 builder when determining which output to produce. This function is
126 a hack to encapsulate that test. Once GDB manages to separate the
127 CLI/MI from the core of GDB the problem should just go away .... */
128
129 bool is_mi_like_p ();
130
131 bool query_table_field (int colno, int *width, int *alignment,
132 const char **col_name);
133
134 protected:
135
136 virtual void do_table_begin (int nbrofcols, int nr_rows, const char *tblid)
137 = 0;
138 virtual void do_table_body () = 0;
139 virtual void do_table_end () = 0;
140 virtual void do_table_header (int width, ui_align align,
141 const std::string &col_name,
142 const std::string &col_hdr) = 0;
143
144 virtual void do_begin (ui_out_type type, const char *id) = 0;
145 virtual void do_end (ui_out_type type) = 0;
146 virtual void do_field_int (int fldno, int width, ui_align align,
147 const char *fldname, int value) = 0;
148 virtual void do_field_skip (int fldno, int width, ui_align align,
149 const char *fldname) = 0;
150 virtual void do_field_string (int fldno, int width, ui_align align,
151 const char *fldname, const char *string) = 0;
152 virtual void do_field_fmt (int fldno, int width, ui_align align,
153 const char *fldname, const char *format,
154 va_list args)
155 ATTRIBUTE_PRINTF (6,0) = 0;
156 virtual void do_spaces (int numspaces) = 0;
157 virtual void do_text (const char *string) = 0;
158 virtual void do_message (const char *format, va_list args)
159 ATTRIBUTE_PRINTF (2,0) = 0;
160 virtual void do_wrap_hint (const char *identstring) = 0;
161 virtual void do_flush () = 0;
7becfd03 162 virtual void do_redirect (struct ui_file *outstream) = 0;
112e8700
SM
163
164 /* Set as not MI-like by default. It is overridden in subclasses if
165 necessary. */
166
167 virtual bool do_is_mi_like_p ()
168 { return false; }
169
170 private:
171
172 ui_out_flags m_flags;
173
174 /* Vector to store and track the ui-out levels. */
175 std::vector<std::unique_ptr<ui_out_level>> m_levels;
176
177 /* A table, if any. At present only a single table is supported. */
178 std::unique_ptr<ui_out_table> m_table_up;
179
180 void verify_field (int *fldno, int *width, ui_align *align);
181
182 int level () const;
183 ui_out_level *current_level () const;
184};
0fac0b41 185
d4b0bb18
TT
186/* This is similar to make_cleanup_ui_out_tuple_begin_end and
187 make_cleanup_ui_out_list_begin_end, but written as an RAII template
188 class. It takes the ui_out_type as a template parameter. Normally
189 this is used via the typedefs ui_out_emit_tuple and
190 ui_out_emit_list. */
191template<ui_out_type Type>
192class ui_out_emit_type
193{
194public:
195
196 ui_out_emit_type (struct ui_out *uiout, const char *id)
197 : m_uiout (uiout)
198 {
199 uiout->begin (Type, id);
200 }
201
202 ~ui_out_emit_type ()
203 {
204 m_uiout->end (Type);
205 }
206
207 ui_out_emit_type (const ui_out_emit_type<Type> &) = delete;
208 ui_out_emit_type<Type> &operator= (const ui_out_emit_type<Type> &)
209 = delete;
210
211private:
212
213 struct ui_out *m_uiout;
214};
215
216typedef ui_out_emit_type<ui_out_type_tuple> ui_out_emit_tuple;
217typedef ui_out_emit_type<ui_out_type_list> ui_out_emit_list;
218
dc9fe180
TT
219/* Start a new table on construction, and end the table on
220 destruction. */
4a2b031d
TT
221class ui_out_emit_table
222{
223public:
224
225 ui_out_emit_table (struct ui_out *uiout, int nr_cols, int nr_rows,
226 const char *tblid)
227 : m_uiout (uiout)
228 {
229 m_uiout->table_begin (nr_cols, nr_rows, tblid);
230 }
231
232 ~ui_out_emit_table ()
233 {
234 m_uiout->table_end ();
235 }
236
237 ui_out_emit_table (const ui_out_emit_table &) = delete;
238 ui_out_emit_table &operator= (const ui_out_emit_table &) = delete;
239
240private:
241
242 struct ui_out *m_uiout;
243};
244
8b93c638 245#endif /* UI_OUT_H */
This page took 2.660349 seconds and 4 git commands to generate.