include/elf/
[deliverable/binutils-gdb.git] / gdb / ui-out.c
CommitLineData
8b93c638 1/* Output generating routines for GDB.
349c5d5f 2
7b6bb8da
JB
3 Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2008, 2009, 2010,
4 2011 Free Software Foundation, Inc.
349c5d5f 5
8b93c638
JM
6 Contributed by Cygnus Solutions.
7 Written by Fernando Nasser for Cygnus.
8
9 This file is part of GDB.
10
11 This program is free software; you can redistribute it and/or modify
12 it under the terms of the GNU General Public License as published by
a9762ec7 13 the Free Software Foundation; either version 3 of the License, or
8b93c638
JM
14 (at your option) any later version.
15
16 This program is distributed in the hope that it will be useful,
17 but WITHOUT ANY WARRANTY; without even the implied warranty of
18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
19 GNU General Public License for more details.
20
21 You should have received a copy of the GNU General Public License
a9762ec7 22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
8b93c638
JM
23
24#include "defs.h"
25#include "gdb_string.h"
26#include "expression.h" /* For language.h */
27#include "language.h"
28#include "ui-out.h"
80f49b30 29#include "gdb_assert.h"
8b93c638 30
8b93c638
JM
31/* table header structures */
32
33struct ui_out_hdr
34 {
35 int colno;
36 int width;
37 int alignment;
b25959ec 38 char *col_name;
8b93c638
JM
39 char *colhdr;
40 struct ui_out_hdr *next;
41 };
42
80f49b30
AC
43/* Maintain a stack so that the info applicable to the inner most list
44 is always available. Stack/nested level 0 is reserved for the
581e13c1 45 top-level result. */
80f49b30 46
dc146f7c 47enum { MAX_UI_OUT_LEVELS = 8 };
80f49b30
AC
48
49struct ui_out_level
50 {
581e13c1 51 /* Count each field; the first element is for non-list fields. */
80f49b30 52 int field_count;
581e13c1 53 /* The type of this level. */
631ec795 54 enum ui_out_type type;
80f49b30
AC
55 };
56
bafdd3b3
AC
57/* Tables are special. Maintain a separate structure that tracks
58 their state. At present an output can only contain a single table
59 but that restriction might eventually be lifted. */
60
61struct ui_out_table
62{
63 /* If on, a table is being generated. */
64 int flag;
65
66 /* If on, the body of a table is being generated. If off, the table
67 header is being generated. */
68 int body_flag;
69
a6c47c14
AC
70 /* The level at which each entry of the table is to be found. A row
71 (a tuple) is made up of entries. Consequently ENTRY_LEVEL is one
72 above that of the table. */
73 int entry_level;
74
bafdd3b3
AC
75 /* Number of table columns (as specified in the table_begin call). */
76 int columns;
77
78 /* String identifying the table (as specified in the table_begin
79 call). */
80 char *id;
81
82 /* Points to the first table header (if any). */
83 struct ui_out_hdr *header_first;
84
85 /* Points to the last table header (if any). */
86 struct ui_out_hdr *header_last;
87
88 /* Points to header of NEXT column to format. */
89 struct ui_out_hdr *header_next;
90
91};
92
93
8b93c638
JM
94/* The ui_out structure */
95/* Any change here requires a corresponding one in the initialization
581e13c1 96 of the default uiout, which is statically initialized. */
8b93c638
JM
97
98struct ui_out
99 {
100 int flags;
581e13c1 101 /* Specific implementation of ui-out. */
8b93c638 102 struct ui_out_impl *impl;
0a8fce9a 103 void *data;
8b93c638 104
bafdd3b3 105 /* Sub structure tracking the ui-out depth. */
80f49b30
AC
106 int level;
107 struct ui_out_level levels[MAX_UI_OUT_LEVELS];
8b93c638 108
bafdd3b3
AC
109 /* A table, if any. At present only a single table is supported. */
110 struct ui_out_table table;
8b93c638
JM
111 };
112
581e13c1 113/* The current (inner most) level. */
80f49b30
AC
114static struct ui_out_level *
115current_level (struct ui_out *uiout)
116{
117 return &uiout->levels[uiout->level];
118}
119
581e13c1 120/* Create a new level, of TYPE. Return the new level's index. */
80f49b30
AC
121static int
122push_level (struct ui_out *uiout,
631ec795 123 enum ui_out_type type,
80f49b30
AC
124 const char *id)
125{
126 struct ui_out_level *current;
5d502164 127
581e13c1 128 /* We had better not overflow the buffer. */
80f49b30 129 uiout->level++;
631ec795 130 gdb_assert (uiout->level >= 0 && uiout->level < MAX_UI_OUT_LEVELS);
80f49b30
AC
131 current = current_level (uiout);
132 current->field_count = 0;
631ec795 133 current->type = type;
80f49b30
AC
134 return uiout->level;
135}
136
137/* Discard the current level, return the discarded level's index.
581e13c1 138 TYPE is the type of the level being discarded. */
80f49b30 139static int
631ec795
AC
140pop_level (struct ui_out *uiout,
141 enum ui_out_type type)
80f49b30 142{
581e13c1 143 /* We had better not underflow the buffer. */
80f49b30 144 gdb_assert (uiout->level > 0 && uiout->level < MAX_UI_OUT_LEVELS);
631ec795 145 gdb_assert (current_level (uiout)->type == type);
80f49b30
AC
146 uiout->level--;
147 return uiout->level + 1;
148}
149
150
581e13c1 151/* These are the default implementation functions. */
8b93c638
JM
152
153static void default_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 154 int nr_rows, const char *tblid);
8b93c638
JM
155static void default_table_body (struct ui_out *uiout);
156static void default_table_end (struct ui_out *uiout);
157static void default_table_header (struct ui_out *uiout, int width,
b25959ec 158 enum ui_align alig, const char *col_name,
e2e11a41 159 const char *colhdr);
631ec795
AC
160static void default_begin (struct ui_out *uiout,
161 enum ui_out_type type,
162 int level, const char *id);
163static void default_end (struct ui_out *uiout,
164 enum ui_out_type type,
165 int level);
8b93c638 166static void default_field_int (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
167 enum ui_align alig,
168 const char *fldname,
169 int value);
8b93c638 170static void default_field_skip (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
171 enum ui_align alig,
172 const char *fldname);
8b93c638 173static void default_field_string (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
174 enum ui_align align,
175 const char *fldname,
8b93c638
JM
176 const char *string);
177static void default_field_fmt (struct ui_out *uiout, int fldno,
178 int width, enum ui_align align,
e2e11a41
AC
179 const char *fldname,
180 const char *format,
a0b31db1 181 va_list args) ATTRIBUTE_PRINTF (6, 0);
8b93c638 182static void default_spaces (struct ui_out *uiout, int numspaces);
e2e11a41
AC
183static void default_text (struct ui_out *uiout, const char *string);
184static void default_message (struct ui_out *uiout, int verbosity,
185 const char *format,
a0b31db1 186 va_list args) ATTRIBUTE_PRINTF (3, 0);
8b93c638
JM
187static void default_wrap_hint (struct ui_out *uiout, char *identstring);
188static void default_flush (struct ui_out *uiout);
189
581e13c1 190/* This is the default ui-out implementation functions vector. */
8b93c638
JM
191
192struct ui_out_impl default_ui_out_impl =
193{
194 default_table_begin,
195 default_table_body,
196 default_table_end,
197 default_table_header,
631ec795
AC
198 default_begin,
199 default_end,
8b93c638
JM
200 default_field_int,
201 default_field_skip,
202 default_field_string,
203 default_field_fmt,
204 default_spaces,
205 default_text,
206 default_message,
207 default_wrap_hint,
9dc5e2a9 208 default_flush,
0fac0b41 209 NULL,
9dc5e2a9 210 0, /* Does not need MI hacks. */
8b93c638
JM
211};
212
213/* The default ui_out */
214
215struct ui_out def_uiout =
216{
217 0, /* flags */
218 &default_ui_out_impl, /* impl */
219};
220
221/* Pointer to current ui_out */
222/* FIXME: This should not be a global, but something passed down from main.c
581e13c1 223 or top.c. */
8b93c638
JM
224
225struct ui_out *uiout = &def_uiout;
226
581e13c1 227/* These are the interfaces to implementation functions. */
8b93c638 228
88379baf 229static void uo_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 230 int nr_rows, const char *tblid);
8b93c638
JM
231static void uo_table_body (struct ui_out *uiout);
232static void uo_table_end (struct ui_out *uiout);
233static void uo_table_header (struct ui_out *uiout, int width,
b25959ec
AC
234 enum ui_align align, const char *col_name,
235 const char *colhdr);
631ec795
AC
236static void uo_begin (struct ui_out *uiout,
237 enum ui_out_type type,
238 int level, const char *id);
239static void uo_end (struct ui_out *uiout,
240 enum ui_out_type type,
241 int level);
8b93c638 242static void uo_field_int (struct ui_out *uiout, int fldno, int width,
88379baf 243 enum ui_align align, const char *fldname, int value);
8b93c638 244static void uo_field_skip (struct ui_out *uiout, int fldno, int width,
88379baf 245 enum ui_align align, const char *fldname);
8b93c638 246static void uo_field_fmt (struct ui_out *uiout, int fldno, int width,
88379baf 247 enum ui_align align, const char *fldname,
bee0189a 248 const char *format, va_list args)
a0b31db1 249 ATTRIBUTE_PRINTF (6, 0);
8b93c638 250static void uo_spaces (struct ui_out *uiout, int numspaces);
88379baf 251static void uo_text (struct ui_out *uiout, const char *string);
8b93c638 252static void uo_message (struct ui_out *uiout, int verbosity,
bee0189a 253 const char *format, va_list args)
a0b31db1 254 ATTRIBUTE_PRINTF (3, 0);
8b93c638
JM
255static void uo_wrap_hint (struct ui_out *uiout, char *identstring);
256static void uo_flush (struct ui_out *uiout);
0fac0b41 257static int uo_redirect (struct ui_out *uiout, struct ui_file *outstream);
8b93c638
JM
258
259/* Prototypes for local functions */
260
261extern void _initialize_ui_out (void);
88379baf 262static void append_header_to_list (struct ui_out *uiout, int width,
b25959ec
AC
263 int alignment, const char *col_name,
264 const char *colhdr);
bafdd3b3 265static int get_next_header (struct ui_out *uiout, int *colno, int *width,
8b93c638
JM
266 int *alignment, char **colhdr);
267static void clear_header_list (struct ui_out *uiout);
a6c47c14
AC
268static void verify_field (struct ui_out *uiout, int *fldno, int *width,
269 int *align);
8b93c638 270
8b93c638
JM
271/* exported functions (ui_out API) */
272
581e13c1 273/* Mark beginning of a table. */
8b93c638 274
3b31d625 275static void
88379baf 276ui_out_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 277 int nr_rows,
88379baf 278 const char *tblid)
8b93c638 279{
bafdd3b3 280 if (uiout->table.flag)
8e65ff28 281 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
282 _("tables cannot be nested; table_begin found before \
283previous table_end."));
8b93c638 284
bafdd3b3
AC
285 uiout->table.flag = 1;
286 uiout->table.body_flag = 0;
a6c47c14 287 uiout->table.entry_level = uiout->level + 1;
bafdd3b3 288 uiout->table.columns = nbrofcols;
8b93c638 289 if (tblid != NULL)
bafdd3b3 290 uiout->table.id = xstrdup (tblid);
8b93c638 291 else
bafdd3b3 292 uiout->table.id = NULL;
8b93c638
JM
293 clear_header_list (uiout);
294
bafdd3b3 295 uo_table_begin (uiout, nbrofcols, nr_rows, uiout->table.id);
8b93c638
JM
296}
297
298void
fba45db2 299ui_out_table_body (struct ui_out *uiout)
8b93c638 300{
bafdd3b3 301 if (!uiout->table.flag)
8e65ff28 302 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
303 _("table_body outside a table is not valid; it must be \
304after a table_begin and before a table_end."));
bafdd3b3 305 if (uiout->table.body_flag)
8e65ff28 306 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
307 _("extra table_body call not allowed; there must be \
308only one table_body after a table_begin and before a table_end."));
bafdd3b3 309 if (uiout->table.header_next->colno != uiout->table.columns)
8e65ff28 310 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
311 _("number of headers differ from number of table \
312columns."));
8b93c638 313
bafdd3b3
AC
314 uiout->table.body_flag = 1;
315 uiout->table.header_next = uiout->table.header_first;
8b93c638
JM
316
317 uo_table_body (uiout);
318}
319
3b31d625 320static void
fba45db2 321ui_out_table_end (struct ui_out *uiout)
8b93c638 322{
bafdd3b3 323 if (!uiout->table.flag)
8e65ff28 324 internal_error (__FILE__, __LINE__,
e2e0b3e5 325 _("misplaced table_end or missing table_begin."));
8b93c638 326
a6c47c14 327 uiout->table.entry_level = 0;
bafdd3b3
AC
328 uiout->table.body_flag = 0;
329 uiout->table.flag = 0;
8b93c638
JM
330
331 uo_table_end (uiout);
332
bafdd3b3
AC
333 if (uiout->table.id)
334 xfree (uiout->table.id);
8b93c638
JM
335 clear_header_list (uiout);
336}
337
338void
fba45db2 339ui_out_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
b25959ec 340 const char *col_name,
88379baf 341 const char *colhdr)
8b93c638 342{
bafdd3b3 343 if (!uiout->table.flag || uiout->table.body_flag)
8e65ff28 344 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
345 _("table header must be specified after table_begin \
346and before table_body."));
8b93c638 347
b25959ec 348 append_header_to_list (uiout, width, alignment, col_name, colhdr);
8b93c638 349
b25959ec 350 uo_table_header (uiout, width, alignment, col_name, colhdr);
8b93c638
JM
351}
352
3b31d625
EZ
353static void
354do_cleanup_table_end (void *data)
355{
356 struct ui_out *ui_out = data;
357
358 ui_out_table_end (ui_out);
359}
360
361struct cleanup *
362make_cleanup_ui_out_table_begin_end (struct ui_out *ui_out, int nr_cols,
363 int nr_rows, const char *tblid)
364{
365 ui_out_table_begin (ui_out, nr_cols, nr_rows, tblid);
366 return make_cleanup (do_cleanup_table_end, ui_out);
367}
368
8b93c638 369void
631ec795
AC
370ui_out_begin (struct ui_out *uiout,
371 enum ui_out_type type,
372 const char *id)
8b93c638 373{
80f49b30 374 int new_level;
5d502164 375
bafdd3b3 376 if (uiout->table.flag && !uiout->table.body_flag)
8e65ff28 377 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
378 _("table header or table_body expected; lists must be \
379specified after table_body."));
a6c47c14
AC
380
381 /* Be careful to verify the ``field'' before the new tuple/list is
382 pushed onto the stack. That way the containing list/table/row is
383 verified and not the newly created tuple/list. This verification
384 is needed (at least) for the case where a table row entry
385 contains either a tuple/list. For that case bookkeeping such as
386 updating the column count or advancing to the next heading still
387 needs to be performed. */
388 {
389 int fldno;
390 int width;
391 int align;
5d502164 392
a6c47c14
AC
393 verify_field (uiout, &fldno, &width, &align);
394 }
395
631ec795 396 new_level = push_level (uiout, type, id);
a6c47c14
AC
397
398 /* If the push puts us at the same level as a table row entry, we've
399 got a new table row. Put the header pointer back to the start. */
400 if (uiout->table.body_flag
401 && uiout->table.entry_level == new_level)
bafdd3b3 402 uiout->table.header_next = uiout->table.header_first;
a6c47c14 403
631ec795
AC
404 uo_begin (uiout, type, new_level, id);
405}
406
631ec795
AC
407void
408ui_out_end (struct ui_out *uiout,
409 enum ui_out_type type)
410{
411 int old_level = pop_level (uiout, type);
5d502164 412
631ec795 413 uo_end (uiout, type, old_level);
8b93c638
JM
414}
415
127431f9
AC
416struct ui_out_end_cleanup_data
417{
418 struct ui_out *uiout;
419 enum ui_out_type type;
420};
421
e6e0bfab 422static void
127431f9
AC
423do_cleanup_end (void *data)
424{
425 struct ui_out_end_cleanup_data *end_cleanup_data = data;
5d502164 426
127431f9
AC
427 ui_out_end (end_cleanup_data->uiout, end_cleanup_data->type);
428 xfree (end_cleanup_data);
429}
430
431static struct cleanup *
432make_cleanup_ui_out_end (struct ui_out *uiout,
433 enum ui_out_type type)
434{
435 struct ui_out_end_cleanup_data *end_cleanup_data;
5d502164 436
127431f9
AC
437 end_cleanup_data = XMALLOC (struct ui_out_end_cleanup_data);
438 end_cleanup_data->uiout = uiout;
439 end_cleanup_data->type = type;
440 return make_cleanup (do_cleanup_end, end_cleanup_data);
441}
442
e6e0bfab 443struct cleanup *
666547aa
AC
444make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
445 const char *id)
446{
3b31d625 447 ui_out_begin (uiout, ui_out_type_tuple, id);
666547aa
AC
448 return make_cleanup_ui_out_end (uiout, ui_out_type_tuple);
449}
450
451struct cleanup *
6b28c186
AC
452make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
453 const char *id)
e6e0bfab 454{
3b31d625 455 ui_out_begin (uiout, ui_out_type_list, id);
127431f9 456 return make_cleanup_ui_out_end (uiout, ui_out_type_list);
e6e0bfab
MK
457}
458
8b93c638 459void
88379baf
AC
460ui_out_field_int (struct ui_out *uiout,
461 const char *fldname,
462 int value)
8b93c638
JM
463{
464 int fldno;
465 int width;
466 int align;
467
a6c47c14 468 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
469
470 uo_field_int (uiout, fldno, width, align, fldname, value);
471}
472
52c6a6ac
JJ
473void
474ui_out_field_fmt_int (struct ui_out *uiout,
475 int input_width,
476 enum ui_align input_align,
477 const char *fldname,
478 int value)
479{
480 int fldno;
481 int width;
482 int align;
52c6a6ac
JJ
483
484 verify_field (uiout, &fldno, &width, &align);
485
486 uo_field_int (uiout, fldno, input_width, input_align, fldname, value);
487}
488
8b93c638 489void
88379baf
AC
490ui_out_field_core_addr (struct ui_out *uiout,
491 const char *fldname,
5af949e3 492 struct gdbarch *gdbarch,
88379baf 493 CORE_ADDR address)
8b93c638 494{
ac50ab3b
MS
495 /* Maximum size string returned by hex_string_custom is 50 chars.
496 This buffer must be bigger than that, for safety. */
497 char addstr[64];
5af949e3 498 int addr_bit = gdbarch_addr_bit (gdbarch);
a72d8a8e 499
a72d8a8e
MR
500 if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
501 address &= ((CORE_ADDR) 1 << addr_bit) - 1;
8b93c638 502
535c96ce
AC
503 /* FIXME: cagney/2002-05-03: Need local_address_string() function
504 that returns the language localized string formatted to a width
17a912b6 505 based on gdbarch_addr_bit. */
a72d8a8e 506 if (addr_bit <= 32)
bb599908 507 strcpy (addstr, hex_string_custom (address, 8));
535c96ce 508 else
bb599908 509 strcpy (addstr, hex_string_custom (address, 16));
8b93c638
JM
510
511 ui_out_field_string (uiout, fldname, addstr);
512}
513
514void
88379baf
AC
515ui_out_field_stream (struct ui_out *uiout,
516 const char *fldname,
517 struct ui_stream *buf)
8b93c638
JM
518{
519 long length;
520 char *buffer = ui_file_xstrdup (buf->stream, &length);
b8c9b27d 521 struct cleanup *old_cleanup = make_cleanup (xfree, buffer);
5d502164 522
8b93c638
JM
523 if (length > 0)
524 ui_out_field_string (uiout, fldname, buffer);
525 else
526 ui_out_field_skip (uiout, fldname);
527 ui_file_rewind (buf->stream);
528 do_cleanups (old_cleanup);
529}
530
581e13c1 531/* Used to omit a field. */
8b93c638
JM
532
533void
88379baf
AC
534ui_out_field_skip (struct ui_out *uiout,
535 const char *fldname)
8b93c638
JM
536{
537 int fldno;
538 int width;
539 int align;
8b93c638 540
a6c47c14 541 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
542
543 uo_field_skip (uiout, fldno, width, align, fldname);
544}
545
546void
547ui_out_field_string (struct ui_out *uiout,
88379baf 548 const char *fldname,
8b93c638
JM
549 const char *string)
550{
551 int fldno;
552 int width;
553 int align;
8b93c638 554
a6c47c14 555 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
556
557 uo_field_string (uiout, fldno, width, align, fldname, string);
558}
559
560/* VARARGS */
561void
88379baf
AC
562ui_out_field_fmt (struct ui_out *uiout,
563 const char *fldname,
564 const char *format, ...)
8b93c638
JM
565{
566 va_list args;
567 int fldno;
568 int width;
569 int align;
8b93c638 570
581e13c1 571 /* Will not align, but has to call anyway. */
a6c47c14 572 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
573
574 va_start (args, format);
575
576 uo_field_fmt (uiout, fldno, width, align, fldname, format, args);
577
578 va_end (args);
579}
580
581void
fba45db2 582ui_out_spaces (struct ui_out *uiout, int numspaces)
8b93c638
JM
583{
584 uo_spaces (uiout, numspaces);
585}
586
587void
88379baf
AC
588ui_out_text (struct ui_out *uiout,
589 const char *string)
8b93c638
JM
590{
591 uo_text (uiout, string);
592}
593
594void
88379baf
AC
595ui_out_message (struct ui_out *uiout, int verbosity,
596 const char *format,...)
8b93c638
JM
597{
598 va_list args;
599
600 va_start (args, format);
8b93c638 601 uo_message (uiout, verbosity, format, args);
8b93c638
JM
602 va_end (args);
603}
604
605struct ui_stream *
fba45db2 606ui_out_stream_new (struct ui_out *uiout)
8b93c638
JM
607{
608 struct ui_stream *tempbuf;
609
610 tempbuf = XMALLOC (struct ui_stream);
611 tempbuf->uiout = uiout;
612 tempbuf->stream = mem_fileopen ();
613 return tempbuf;
614}
615
616void
fba45db2 617ui_out_stream_delete (struct ui_stream *buf)
8b93c638
JM
618{
619 ui_file_delete (buf->stream);
b8c9b27d 620 xfree (buf);
8b93c638
JM
621}
622
623static void
624do_stream_delete (void *buf)
625{
626 ui_out_stream_delete (buf);
627}
628
629struct cleanup *
630make_cleanup_ui_out_stream_delete (struct ui_stream *buf)
631{
632 return make_cleanup (do_stream_delete, buf);
633}
634
635
636void
fba45db2 637ui_out_wrap_hint (struct ui_out *uiout, char *identstring)
8b93c638
JM
638{
639 uo_wrap_hint (uiout, identstring);
640}
641
642void
fba45db2 643ui_out_flush (struct ui_out *uiout)
8b93c638
JM
644{
645 uo_flush (uiout);
646}
647
0fac0b41
DJ
648int
649ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream)
650{
651 return uo_redirect (uiout, outstream);
652}
653
581e13c1 654/* Set the flags specified by the mask given. */
8b93c638 655int
fba45db2 656ui_out_set_flags (struct ui_out *uiout, int mask)
8b93c638 657{
5bfb05ca 658 int oldflags = uiout->flags;
8b93c638 659
b8d86de3 660 uiout->flags |= mask;
8b93c638
JM
661 return oldflags;
662}
663
581e13c1 664/* Clear the flags specified by the mask given. */
8b93c638 665int
fba45db2 666ui_out_clear_flags (struct ui_out *uiout, int mask)
8b93c638 667{
5bfb05ca 668 int oldflags = uiout->flags;
8b93c638
JM
669
670 uiout->flags &= ~mask;
8b93c638
JM
671 return oldflags;
672}
673
581e13c1 674/* Test the flags against the mask given. */
8b93c638 675int
fba45db2 676ui_out_test_flags (struct ui_out *uiout, int mask)
8b93c638
JM
677{
678 return (uiout->flags & mask);
679}
680
581e13c1
MS
681/* Obtain the current verbosity level (as stablished by the
682 'set verbositylevel' command. */
8b93c638
JM
683
684int
fba45db2 685ui_out_get_verblvl (struct ui_out *uiout)
8b93c638 686{
581e13c1 687 /* FIXME: not implemented yet. */
8b93c638
JM
688 return 0;
689}
690
691#if 0
692void
fba45db2 693ui_out_result_begin (struct ui_out *uiout, char *class)
8b93c638
JM
694{
695}
696
697void
fba45db2 698ui_out_result_end (struct ui_out *uiout)
8b93c638
JM
699{
700}
701
702void
fba45db2 703ui_out_info_begin (struct ui_out *uiout, char *class)
8b93c638
JM
704{
705}
706
707void
fba45db2 708ui_out_info_end (struct ui_out *uiout)
8b93c638
JM
709{
710}
711
712void
fba45db2 713ui_out_notify_begin (struct ui_out *uiout, char *class)
8b93c638
JM
714{
715}
716
717void
fba45db2 718ui_out_notify_end (struct ui_out *uiout)
8b93c638
JM
719{
720}
721
722void
fba45db2 723ui_out_error_begin (struct ui_out *uiout, char *class)
8b93c638
JM
724{
725}
726
727void
fba45db2 728ui_out_error_end (struct ui_out *uiout)
8b93c638
JM
729{
730}
731#endif
732
733#if 0
734void
735gdb_error (ui_out * uiout, int severity, char *format,...)
736{
737 va_list args;
738}
739
740void
10689f25 741gdb_query (struct ui_out *uiout, int qflags, char *qprompt)
8b93c638
JM
742{
743}
744#endif
745
9dc5e2a9
AC
746int
747ui_out_is_mi_like_p (struct ui_out *uiout)
748{
749 return uiout->impl->is_mi_like_p;
750}
751
581e13c1 752/* Default gdb-out hook functions. */
8b93c638
JM
753
754static void
d63f1d40
AC
755default_table_begin (struct ui_out *uiout, int nbrofcols,
756 int nr_rows,
757 const char *tblid)
8b93c638
JM
758{
759}
760
761static void
fba45db2 762default_table_body (struct ui_out *uiout)
8b93c638
JM
763{
764}
765
766static void
fba45db2 767default_table_end (struct ui_out *uiout)
8b93c638
JM
768{
769}
770
771static void
fba45db2 772default_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
b25959ec 773 const char *col_name,
e2e11a41 774 const char *colhdr)
8b93c638
JM
775{
776}
777
778static void
631ec795
AC
779default_begin (struct ui_out *uiout,
780 enum ui_out_type type,
781 int level,
782 const char *id)
8b93c638
JM
783{
784}
785
786static void
631ec795
AC
787default_end (struct ui_out *uiout,
788 enum ui_out_type type,
789 int level)
8b93c638
JM
790{
791}
792
793static void
fba45db2 794default_field_int (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
795 enum ui_align align,
796 const char *fldname, int value)
8b93c638
JM
797{
798}
799
800static void
fba45db2 801default_field_skip (struct ui_out *uiout, int fldno, int width,
e2e11a41 802 enum ui_align align, const char *fldname)
8b93c638
JM
803{
804}
805
806static void
807default_field_string (struct ui_out *uiout,
808 int fldno,
809 int width,
810 enum ui_align align,
e2e11a41 811 const char *fldname,
8b93c638
JM
812 const char *string)
813{
814}
815
816static void
fba45db2 817default_field_fmt (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
818 enum ui_align align,
819 const char *fldname,
820 const char *format,
fba45db2 821 va_list args)
8b93c638
JM
822{
823}
824
825static void
fba45db2 826default_spaces (struct ui_out *uiout, int numspaces)
8b93c638
JM
827{
828}
829
830static void
e2e11a41 831default_text (struct ui_out *uiout, const char *string)
8b93c638
JM
832{
833}
834
835static void
e2e11a41
AC
836default_message (struct ui_out *uiout, int verbosity,
837 const char *format,
fba45db2 838 va_list args)
8b93c638
JM
839{
840}
841
842static void
fba45db2 843default_wrap_hint (struct ui_out *uiout, char *identstring)
8b93c638
JM
844{
845}
846
847static void
fba45db2 848default_flush (struct ui_out *uiout)
8b93c638
JM
849{
850}
851
581e13c1 852/* Interface to the implementation functions. */
8b93c638
JM
853
854void
88379baf 855uo_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 856 int nr_rows,
88379baf 857 const char *tblid)
8b93c638
JM
858{
859 if (!uiout->impl->table_begin)
860 return;
d63f1d40 861 uiout->impl->table_begin (uiout, nbrofcols, nr_rows, tblid);
8b93c638
JM
862}
863
864void
865uo_table_body (struct ui_out *uiout)
866{
867 if (!uiout->impl->table_body)
868 return;
869 uiout->impl->table_body (uiout);
870}
871
872void
873uo_table_end (struct ui_out *uiout)
874{
875 if (!uiout->impl->table_end)
876 return;
877 uiout->impl->table_end (uiout);
878}
879
880void
88379baf 881uo_table_header (struct ui_out *uiout, int width, enum ui_align align,
b25959ec 882 const char *col_name,
88379baf 883 const char *colhdr)
8b93c638
JM
884{
885 if (!uiout->impl->table_header)
886 return;
b25959ec 887 uiout->impl->table_header (uiout, width, align, col_name, colhdr);
8b93c638
JM
888}
889
890void
631ec795
AC
891uo_begin (struct ui_out *uiout,
892 enum ui_out_type type,
893 int level,
894 const char *id)
8b93c638 895{
631ec795 896 if (uiout->impl->begin == NULL)
8b93c638 897 return;
631ec795 898 uiout->impl->begin (uiout, type, level, id);
8b93c638
JM
899}
900
901void
631ec795
AC
902uo_end (struct ui_out *uiout,
903 enum ui_out_type type,
904 int level)
8b93c638 905{
631ec795 906 if (uiout->impl->end == NULL)
8b93c638 907 return;
631ec795 908 uiout->impl->end (uiout, type, level);
8b93c638
JM
909}
910
911void
88379baf
AC
912uo_field_int (struct ui_out *uiout, int fldno, int width, enum ui_align align,
913 const char *fldname,
914 int value)
8b93c638
JM
915{
916 if (!uiout->impl->field_int)
917 return;
918 uiout->impl->field_int (uiout, fldno, width, align, fldname, value);
919}
920
921void
88379baf
AC
922uo_field_skip (struct ui_out *uiout, int fldno, int width, enum ui_align align,
923 const char *fldname)
8b93c638
JM
924{
925 if (!uiout->impl->field_skip)
926 return;
927 uiout->impl->field_skip (uiout, fldno, width, align, fldname);
928}
929
930void
931uo_field_string (struct ui_out *uiout, int fldno, int width,
88379baf
AC
932 enum ui_align align,
933 const char *fldname,
934 const char *string)
8b93c638
JM
935{
936 if (!uiout->impl->field_string)
937 return;
938 uiout->impl->field_string (uiout, fldno, width, align, fldname, string);
939}
940
941void
88379baf
AC
942uo_field_fmt (struct ui_out *uiout, int fldno, int width, enum ui_align align,
943 const char *fldname,
944 const char *format,
945 va_list args)
8b93c638
JM
946{
947 if (!uiout->impl->field_fmt)
948 return;
949 uiout->impl->field_fmt (uiout, fldno, width, align, fldname, format, args);
950}
951
952void
953uo_spaces (struct ui_out *uiout, int numspaces)
954{
955 if (!uiout->impl->spaces)
956 return;
957 uiout->impl->spaces (uiout, numspaces);
958}
959
960void
88379baf
AC
961uo_text (struct ui_out *uiout,
962 const char *string)
8b93c638
JM
963{
964 if (!uiout->impl->text)
965 return;
966 uiout->impl->text (uiout, string);
967}
968
969void
88379baf
AC
970uo_message (struct ui_out *uiout, int verbosity,
971 const char *format,
972 va_list args)
8b93c638
JM
973{
974 if (!uiout->impl->message)
975 return;
976 uiout->impl->message (uiout, verbosity, format, args);
977}
978
979void
980uo_wrap_hint (struct ui_out *uiout, char *identstring)
981{
982 if (!uiout->impl->wrap_hint)
983 return;
984 uiout->impl->wrap_hint (uiout, identstring);
985}
986
987void
988uo_flush (struct ui_out *uiout)
989{
990 if (!uiout->impl->flush)
991 return;
992 uiout->impl->flush (uiout);
993}
994
0fac0b41
DJ
995int
996uo_redirect (struct ui_out *uiout, struct ui_file *outstream)
997{
998 if (!uiout->impl->redirect)
999 return -1;
1000 uiout->impl->redirect (uiout, outstream);
1001 return 0;
1002}
1003
8b93c638
JM
1004/* local functions */
1005
581e13c1 1006/* List of column headers manipulation routines. */
8b93c638
JM
1007
1008static void
fba45db2 1009clear_header_list (struct ui_out *uiout)
8b93c638 1010{
bafdd3b3 1011 while (uiout->table.header_first != NULL)
8b93c638 1012 {
bafdd3b3
AC
1013 uiout->table.header_next = uiout->table.header_first;
1014 uiout->table.header_first = uiout->table.header_first->next;
1015 if (uiout->table.header_next->colhdr != NULL)
1016 xfree (uiout->table.header_next->colhdr);
1017 xfree (uiout->table.header_next);
8b93c638 1018 }
bafdd3b3
AC
1019 gdb_assert (uiout->table.header_first == NULL);
1020 uiout->table.header_last = NULL;
1021 uiout->table.header_next = NULL;
8b93c638
JM
1022}
1023
1024static void
1025append_header_to_list (struct ui_out *uiout,
1026 int width,
1027 int alignment,
b25959ec 1028 const char *col_name,
88379baf 1029 const char *colhdr)
8b93c638
JM
1030{
1031 struct ui_out_hdr *temphdr;
1032
1033 temphdr = XMALLOC (struct ui_out_hdr);
1034 temphdr->width = width;
1035 temphdr->alignment = alignment;
44db85f8
MS
1036 /* We have to copy the column title as the original may be an
1037 automatic. */
8b93c638 1038 if (colhdr != NULL)
b25959ec
AC
1039 temphdr->colhdr = xstrdup (colhdr);
1040 else
1041 temphdr->colhdr = NULL;
44db85f8 1042
b25959ec 1043 if (col_name != NULL)
44db85f8
MS
1044 temphdr->col_name = xstrdup (col_name);
1045 else if (colhdr != NULL)
b25959ec
AC
1046 temphdr->col_name = xstrdup (colhdr);
1047 else
44db85f8
MS
1048 temphdr->col_name = NULL;
1049
8b93c638 1050 temphdr->next = NULL;
bafdd3b3 1051 if (uiout->table.header_first == NULL)
8b93c638
JM
1052 {
1053 temphdr->colno = 1;
bafdd3b3
AC
1054 uiout->table.header_first = temphdr;
1055 uiout->table.header_last = temphdr;
8b93c638
JM
1056 }
1057 else
1058 {
bafdd3b3
AC
1059 temphdr->colno = uiout->table.header_last->colno + 1;
1060 uiout->table.header_last->next = temphdr;
1061 uiout->table.header_last = temphdr;
8b93c638 1062 }
bafdd3b3 1063 uiout->table.header_next = uiout->table.header_last;
8b93c638
JM
1064}
1065
bafdd3b3
AC
1066/* Extract the format information for the NEXT header and and advance
1067 the header pointer. Return 0 if there was no next header. */
8b93c638
JM
1068
1069static int
bafdd3b3 1070get_next_header (struct ui_out *uiout,
8b93c638
JM
1071 int *colno,
1072 int *width,
1073 int *alignment,
1074 char **colhdr)
1075{
bafdd3b3
AC
1076 /* There may be no headers at all or we may have used all columns. */
1077 if (uiout->table.header_next == NULL)
8b93c638 1078 return 0;
bafdd3b3
AC
1079 *colno = uiout->table.header_next->colno;
1080 *width = uiout->table.header_next->width;
1081 *alignment = uiout->table.header_next->alignment;
1082 *colhdr = uiout->table.header_next->colhdr;
1083 /* Advance the header pointer to the next entry. */
1084 uiout->table.header_next = uiout->table.header_next->next;
8b93c638
JM
1085 return 1;
1086}
1087
a6c47c14
AC
1088
1089/* Verify that the field/tuple/list is correctly positioned. Return
1090 the field number and corresponding alignment (if
1091 available/applicable). */
8b93c638
JM
1092
1093static void
a6c47c14 1094verify_field (struct ui_out *uiout, int *fldno, int *width, int *align)
8b93c638 1095{
a6c47c14
AC
1096 struct ui_out_level *current = current_level (uiout);
1097 char *text;
1098
bafdd3b3 1099 if (uiout->table.flag)
8b93c638 1100 {
bafdd3b3 1101 if (!uiout->table.body_flag)
8e65ff28 1102 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
1103 _("table_body missing; table fields must be \
1104specified after table_body and inside a list."));
a6c47c14
AC
1105 /* NOTE: cagney/2001-12-08: There was a check here to ensure
1106 that this code was only executed when uiout->level was
1107 greater than zero. That no longer applies - this code is run
1108 before each table row tuple is started and at that point the
1109 level is zero. */
8b93c638 1110 }
8b93c638 1111
a6c47c14 1112 current->field_count += 1;
8b93c638 1113
a6c47c14
AC
1114 if (uiout->table.body_flag
1115 && uiout->table.entry_level == uiout->level
1116 && get_next_header (uiout, fldno, width, align, &text))
8b93c638 1117 {
a6c47c14 1118 if (*fldno != current->field_count)
8e65ff28 1119 internal_error (__FILE__, __LINE__,
e2e0b3e5 1120 _("ui-out internal error in handling headers."));
8b93c638
JM
1121 }
1122 else
1123 {
1124 *width = 0;
1125 *align = ui_noalign;
a6c47c14 1126 *fldno = current->field_count;
8b93c638
JM
1127 }
1128}
1129
a6c47c14 1130
581e13c1 1131/* Access to ui_out format private members. */
8b93c638
JM
1132
1133void
fba45db2 1134ui_out_get_field_separator (struct ui_out *uiout)
8b93c638
JM
1135{
1136}
1137
581e13c1 1138/* Access to ui-out members data. */
8b93c638 1139
0a8fce9a 1140void *
8b93c638
JM
1141ui_out_data (struct ui_out *uiout)
1142{
1143 return uiout->data;
1144}
1145
170b53b2
UW
1146/* Access table field parameters. */
1147int
1148ui_out_query_field (struct ui_out *uiout, int colno,
1149 int *width, int *alignment, char **col_name)
1150{
1151 struct ui_out_hdr *hdr;
1152
1153 if (!uiout->table.flag)
1154 return 0;
1155
1156 for (hdr = uiout->table.header_first; hdr; hdr = hdr->next)
1157 if (hdr->colno == colno)
1158 {
1159 *width = hdr->width;
1160 *alignment = hdr->alignment;
1161 *col_name = hdr->col_name;
1162 return 1;
1163 }
1164
1165 return 0;
1166}
1167
581e13c1 1168/* Initalize private members at startup. */
8b93c638
JM
1169
1170struct ui_out *
0a8fce9a 1171ui_out_new (struct ui_out_impl *impl, void *data,
8b93c638
JM
1172 int flags)
1173{
1174 struct ui_out *uiout = XMALLOC (struct ui_out);
5d502164 1175
8b93c638
JM
1176 uiout->data = data;
1177 uiout->impl = impl;
1178 uiout->flags = flags;
bafdd3b3
AC
1179 uiout->table.flag = 0;
1180 uiout->table.body_flag = 0;
80f49b30
AC
1181 uiout->level = 0;
1182 memset (uiout->levels, 0, sizeof (uiout->levels));
bafdd3b3
AC
1183 uiout->table.header_first = NULL;
1184 uiout->table.header_last = NULL;
1185 uiout->table.header_next = NULL;
8b93c638
JM
1186 return uiout;
1187}
1188
581e13c1 1189/* Standard gdb initialization hook. */
8b93c638
JM
1190
1191void
fba45db2 1192_initialize_ui_out (void)
8b93c638
JM
1193{
1194 /* nothing needs to be done */
1195}
This page took 1.133639 seconds and 4 git commands to generate.