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