GDB (xrefs)
/tmp/gdb-8.1/gdb/ui-out.h
Go to the documentation of this file.
1 /* Output generating routines for GDB.
2 
3  Copyright (C) 1999-2018 Free Software Foundation, Inc.
4 
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
12  the Free Software Foundation; either version 3 of the License, or
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
21  along with this program. If not, see <http://www.gnu.org/licenses/>. */
22 
23 #ifndef UI_OUT_H
24 #define UI_OUT_H 1
25 
26 #include <vector>
27 
28 #include "common/enum-flags.h"
29 
30 class ui_out_level;
31 class ui_out_table;
32 struct ui_file;
33 
34 /* the current ui_out */
35 
36 /* FIXME: This should not be a global but something passed down from main.c
37  or top.c. */
38 extern struct ui_out **current_ui_current_uiout_ptr (void);
39 #define current_uiout (*current_ui_current_uiout_ptr ())
40 
41 /* alignment enum */
43  {
44  ui_left = -1,
48  };
49 
50 /* flags enum */
52  {
53  ui_source_list = (1 << 0),
54  };
55 
56 DEF_ENUM_FLAGS_TYPE (ui_out_flag, ui_out_flags);
57 
58 /* Prototypes for ui-out API. */
59 
60 /* A result is a recursive data structure consisting of lists and
61  tuples. */
62 
64  {
67  };
68 
69 /* Compatibility wrappers. */
70 
71 extern struct cleanup *make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
72  const char *id);
73 
74 extern struct cleanup *make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
75  const char *id);
76 
77 class ui_out
78 {
79  public:
80 
81  explicit ui_out (ui_out_flags flags = 0);
82  virtual ~ui_out ();
83 
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);
107  void field_stream (const char *fldname, string_file &stream);
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. */
120  void redirect (ui_file *outstream);
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;
162  virtual void do_redirect (struct ui_file *outstream) = 0;
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 };
185 
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. */
191 template<ui_out_type Type>
193 {
194 public:
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 
203  {
204  m_uiout->end (Type);
205  }
206 
208 
209 private:
210 
211  struct ui_out *m_uiout;
212 };
213 
216 
217 /* Start a new table on construction, and end the table on
218  destruction. */
220 {
221 public:
222 
223  ui_out_emit_table (struct ui_out *uiout, int nr_cols, int nr_rows,
224  const char *tblid)
225  : m_uiout (uiout)
226  {
227  m_uiout->table_begin (nr_cols, nr_rows, tblid);
228  }
229 
231  {
232  m_uiout->table_end ();
233  }
234 
235  ui_out_emit_table (const ui_out_emit_table &) = delete;
237 
238 private:
239 
240  struct ui_out *m_uiout;
241 };
242 
243 /* On destruction, pop the last redirection by calling the uiout's
244  redirect method with a NULL parameter. */
246 {
247 public:
248 
250  : m_uiout (uiout)
251  {
252  }
253 
255  {
256  m_uiout->redirect (NULL);
257  }
258 
259  ui_out_redirect_pop (const ui_out_redirect_pop &) = delete;
261 
262 private:
263  struct ui_out *m_uiout;
264 };
265 
266 #endif /* UI_OUT_H */
struct cleanup * make_cleanup_ui_out_tuple_begin_end(struct ui_out *uiout, const char *id)
Definition: ui-out.c:470
const char * string
Definition: signals.c:50
DEF_ENUM_FLAGS_TYPE(ui_out_flag, ui_out_flags)
virtual void virtual void do_spaces(int numspaces)=0
virtual void do_end(ui_out_type type)=0
void field_core_addr(const char *fldname, struct gdbarch *gdbarch, CORE_ADDR address)
Definition: ui-out.c:513
ui_out_flag
Definition: ui-out.h:51
void field_string(const char *fldname, const char *string)
Definition: ui-out.c:544
bfd_vma CORE_ADDR
Definition: common-types.h:41
void pop_level(ui_out_type type)
Definition: ui-out.c:340
ui_out_flags test_flags(ui_out_flags mask)
Definition: ui-out.c:616
ui_out_level * current_level() const
Definition: ui-out.c:323
void void wrap_hint(const char *identstring)
Definition: ui-out.c:597
std::vector< std::unique_ptr< ui_out_level > > m_levels
Definition: ui-out.h:175
void verify_field(int *fldno, int *width, ui_align *align)
Definition: ui-out.c:632
int level() const
Definition: ui-out.c:315
void field_skip(const char *fldname)
Definition: ui-out.c:532
virtual void do_begin(ui_out_type type, const char *id)=0
struct ui_out * m_uiout
Definition: ui-out.h:263
void table_header(int width, ui_align align, const std::string &col_name, const std::string &col_hdr)
Definition: ui-out.c:365
virtual void do_field_fmt(int fldno, int width, ui_align align, const char *fldname, const char *format, va_list args) ATTRIBUTE_PRINTF(6
DISABLE_COPY_AND_ASSIGN(ui_out_emit_type< Type >)
virtual void do_table_header(int width, ui_align align, const std::string &col_name, const std::string &col_hdr)=0
std::unique_ptr< ui_out_table > m_table_up
Definition: ui-out.h:178
Definition: ui-out.h:44
struct cleanup * make_cleanup_ui_out_list_begin_end(struct ui_out *uiout, const char *id)
Definition: ui-out.c:478
void text(const char *string)
Definition: ui-out.c:581
struct ui_out ** current_ui_current_uiout_ptr(void)
virtual void virtual void do_wrap_hint(const char *identstring)=0
ui_out(ui_out_flags flags=0)
Definition: ui-out.c:678
mach_port_t kern_return_t mach_port_t msgports mach_port_t kern_return_t pid_t pid mach_port_t kern_return_t mach_port_t task mach_port_t kern_return_t int flags
Definition: gnu-nat.c:1891
ui_out_emit_table & operator=(const ui_out_emit_table &)=delete
ui_out_emit_type(struct ui_out *uiout, const char *id)
Definition: ui-out.h:196
void end(ui_out_type type)
Definition: ui-out.c:434
void redirect(ui_file *outstream)
Definition: ui-out.c:609
ui_out_redirect_pop & operator=(const ui_out_redirect_pop &)=delete
void table_end()
Definition: ui-out.c:392
ui_out_emit_table(struct ui_out *uiout, int nr_cols, int nr_rows, const char *tblid)
Definition: ui-out.h:223
virtual bool do_is_mi_like_p()
Definition: ui-out.h:167
#define ATTRIBUTE_PRINTF
Definition: common-defs.h:70
Definition: gdbtypes.h:749
virtual ~ui_out()
Definition: ui-out.c:685
virtual void do_field_skip(int fldno, int width, ui_align align, const char *fldname)=0
void field_stream(const char *fldname, string_file &stream)
Definition: ui-out.c:520
ui_out_redirect_pop(ui_out *uiout)
Definition: ui-out.h:249
void void spaces(int numspaces)
Definition: ui-out.c:575
ui_out_emit_type< ui_out_type_tuple > ui_out_emit_tuple
Definition: ui-out.h:214
Definition: value.c:169
Definition: ui-out.h:77
virtual void do_table_begin(int nbrofcols, int nr_rows, const char *tblid)=0
virtual void do_flush()=0
virtual void do_field_string(int fldno, int width, ui_align align, const char *fldname, const char *string)=0
ui_out_flags m_flags
Definition: ui-out.h:172
bool query_table_field(int colno, int *width, int *alignment, const char **col_name)
Definition: ui-out.c:667
struct ui_out * m_uiout
Definition: ui-out.h:240
ui_align
Definition: ui-out.h:42
void field_int(const char *fldname, int value)
Definition: ui-out.c:486
void table_body()
Definition: ui-out.c:379
virtual void do_redirect(struct ui_file *outstream)=0
ui_out_emit_type< ui_out_type_list > ui_out_emit_list
Definition: ui-out.h:215
void message(const char *format,...) ATTRIBUTE_PRINTF(2
Definition: ui-out.c:587
struct ui_out * m_uiout
Definition: ui-out.h:211
virtual void do_text(const char *string)=0
virtual void do_field_int(int fldno, int width, ui_align align, const char *fldname, int value)=0
void field_fmt_int(int width, ui_align align, const char *fldname, int value)
Definition: ui-out.c:498
ui_out_type
Definition: ui-out.h:63
void flush()
Definition: ui-out.c:603
virtual void do_table_body()=0
virtual void do_table_end()=0
void begin(ui_out_type type, const char *id)
Definition: ui-out.c:404
void push_level(ui_out_type type)
Definition: ui-out.c:330
virtual void do_message(const char *format, va_list args) ATTRIBUTE_PRINTF(2
bool is_mi_like_p()
Definition: ui-out.c:622
void field_fmt(const char *fldname, const char *format,...) ATTRIBUTE_PRINTF(3
Definition: ui-out.c:557
void table_begin(int nr_cols, int nr_rows, const std::string &tblid)
Definition: ui-out.c:352