* target-reloc.h (visibility_error): New inline function.
[deliverable/binutils-gdb.git] / gdb / ui-out.c
CommitLineData
8b93c638 1/* Output generating routines for GDB.
349c5d5f 2
4c38e0a4 3 Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2008, 2009, 2010
bee0189a 4 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
45 top-level result. */
46
a3edc55b 47enum { MAX_UI_OUT_LEVELS = 6 };
80f49b30
AC
48
49struct ui_out_level
50 {
51 /* Count each field; the first element is for non-list fields */
52 int field_count;
631ec795
AC
53 /* The type of this level. */
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
96 of the default uiout, which is statically initialized */
97
98struct ui_out
99 {
100 int flags;
101 /* specific implementation of ui-out */
102 struct ui_out_impl *impl;
103 struct ui_out_data *data;
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
80f49b30
AC
113/* The current (inner most) level. */
114static struct ui_out_level *
115current_level (struct ui_out *uiout)
116{
117 return &uiout->levels[uiout->level];
118}
119
120/* Create a new level, of TYPE. Return the new level's index. */
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;
127 /* We had better not overflow the buffer. */
128 uiout->level++;
631ec795 129 gdb_assert (uiout->level >= 0 && uiout->level < MAX_UI_OUT_LEVELS);
80f49b30
AC
130 current = current_level (uiout);
131 current->field_count = 0;
631ec795 132 current->type = type;
80f49b30
AC
133 return uiout->level;
134}
135
136/* Discard the current level, return the discarded level's index.
137 TYPE is the type of the level being discarded. */
138static int
631ec795
AC
139pop_level (struct ui_out *uiout,
140 enum ui_out_type type)
80f49b30
AC
141{
142 /* We had better not underflow the buffer. */
143 gdb_assert (uiout->level > 0 && uiout->level < MAX_UI_OUT_LEVELS);
631ec795 144 gdb_assert (current_level (uiout)->type == type);
80f49b30
AC
145 uiout->level--;
146 return uiout->level + 1;
147}
148
149
8b93c638
JM
150/* These are the default implementation functions */
151
152static void default_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 153 int nr_rows, const char *tblid);
8b93c638
JM
154static void default_table_body (struct ui_out *uiout);
155static void default_table_end (struct ui_out *uiout);
156static void default_table_header (struct ui_out *uiout, int width,
b25959ec 157 enum ui_align alig, const char *col_name,
e2e11a41 158 const char *colhdr);
631ec795
AC
159static void default_begin (struct ui_out *uiout,
160 enum ui_out_type type,
161 int level, const char *id);
162static void default_end (struct ui_out *uiout,
163 enum ui_out_type type,
164 int level);
8b93c638 165static void default_field_int (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
166 enum ui_align alig,
167 const char *fldname,
168 int value);
8b93c638 169static void default_field_skip (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
170 enum ui_align alig,
171 const char *fldname);
8b93c638 172static void default_field_string (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
173 enum ui_align align,
174 const char *fldname,
8b93c638
JM
175 const char *string);
176static void default_field_fmt (struct ui_out *uiout, int fldno,
177 int width, enum ui_align align,
e2e11a41
AC
178 const char *fldname,
179 const char *format,
bee0189a 180 va_list args) ATTR_FORMAT (printf, 6, 0);
8b93c638 181static void default_spaces (struct ui_out *uiout, int numspaces);
e2e11a41
AC
182static void default_text (struct ui_out *uiout, const char *string);
183static void default_message (struct ui_out *uiout, int verbosity,
184 const char *format,
bee0189a 185 va_list args) ATTR_FORMAT (printf, 3, 0);
8b93c638
JM
186static void default_wrap_hint (struct ui_out *uiout, char *identstring);
187static void default_flush (struct ui_out *uiout);
188
189/* This is the default ui-out implementation functions vector */
190
191struct ui_out_impl default_ui_out_impl =
192{
193 default_table_begin,
194 default_table_body,
195 default_table_end,
196 default_table_header,
631ec795
AC
197 default_begin,
198 default_end,
8b93c638
JM
199 default_field_int,
200 default_field_skip,
201 default_field_string,
202 default_field_fmt,
203 default_spaces,
204 default_text,
205 default_message,
206 default_wrap_hint,
9dc5e2a9 207 default_flush,
0fac0b41 208 NULL,
9dc5e2a9 209 0, /* Does not need MI hacks. */
8b93c638
JM
210};
211
212/* The default ui_out */
213
214struct ui_out def_uiout =
215{
216 0, /* flags */
217 &default_ui_out_impl, /* impl */
218};
219
220/* Pointer to current ui_out */
221/* FIXME: This should not be a global, but something passed down from main.c
222 or top.c */
223
224struct ui_out *uiout = &def_uiout;
225
226/* These are the interfaces to implementation functions */
227
88379baf 228static void uo_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 229 int nr_rows, const char *tblid);
8b93c638
JM
230static void uo_table_body (struct ui_out *uiout);
231static void uo_table_end (struct ui_out *uiout);
232static void uo_table_header (struct ui_out *uiout, int width,
b25959ec
AC
233 enum ui_align align, const char *col_name,
234 const char *colhdr);
631ec795
AC
235static void uo_begin (struct ui_out *uiout,
236 enum ui_out_type type,
237 int level, const char *id);
238static void uo_end (struct ui_out *uiout,
239 enum ui_out_type type,
240 int level);
8b93c638 241static void uo_field_int (struct ui_out *uiout, int fldno, int width,
88379baf 242 enum ui_align align, const char *fldname, int value);
8b93c638 243static void uo_field_skip (struct ui_out *uiout, int fldno, int width,
88379baf 244 enum ui_align align, const char *fldname);
8b93c638 245static void uo_field_string (struct ui_out *uiout, int fldno, int width,
88379baf
AC
246 enum ui_align align, const char *fldname,
247 const char *string);
8b93c638 248static void uo_field_fmt (struct ui_out *uiout, int fldno, int width,
88379baf 249 enum ui_align align, const char *fldname,
bee0189a
DJ
250 const char *format, va_list args)
251 ATTR_FORMAT (printf, 6, 0);
8b93c638 252static void uo_spaces (struct ui_out *uiout, int numspaces);
88379baf 253static void uo_text (struct ui_out *uiout, const char *string);
8b93c638 254static void uo_message (struct ui_out *uiout, int verbosity,
bee0189a
DJ
255 const char *format, va_list args)
256 ATTR_FORMAT (printf, 3, 0);
8b93c638
JM
257static void uo_wrap_hint (struct ui_out *uiout, char *identstring);
258static void uo_flush (struct ui_out *uiout);
0fac0b41 259static int uo_redirect (struct ui_out *uiout, struct ui_file *outstream);
8b93c638
JM
260
261/* Prototypes for local functions */
262
263extern void _initialize_ui_out (void);
88379baf 264static void append_header_to_list (struct ui_out *uiout, int width,
b25959ec
AC
265 int alignment, const char *col_name,
266 const char *colhdr);
bafdd3b3 267static int get_next_header (struct ui_out *uiout, int *colno, int *width,
8b93c638
JM
268 int *alignment, char **colhdr);
269static void clear_header_list (struct ui_out *uiout);
a6c47c14
AC
270static void verify_field (struct ui_out *uiout, int *fldno, int *width,
271 int *align);
8b93c638 272
8b93c638
JM
273/* exported functions (ui_out API) */
274
275/* Mark beginning of a table */
276
3b31d625 277static void
88379baf 278ui_out_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 279 int nr_rows,
88379baf 280 const char *tblid)
8b93c638 281{
bafdd3b3 282 if (uiout->table.flag)
8e65ff28 283 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
284 _("tables cannot be nested; table_begin found before \
285previous table_end."));
8b93c638 286
bafdd3b3
AC
287 uiout->table.flag = 1;
288 uiout->table.body_flag = 0;
a6c47c14 289 uiout->table.entry_level = uiout->level + 1;
bafdd3b3 290 uiout->table.columns = nbrofcols;
8b93c638 291 if (tblid != NULL)
bafdd3b3 292 uiout->table.id = xstrdup (tblid);
8b93c638 293 else
bafdd3b3 294 uiout->table.id = NULL;
8b93c638
JM
295 clear_header_list (uiout);
296
bafdd3b3 297 uo_table_begin (uiout, nbrofcols, nr_rows, uiout->table.id);
8b93c638
JM
298}
299
300void
fba45db2 301ui_out_table_body (struct ui_out *uiout)
8b93c638 302{
bafdd3b3 303 if (!uiout->table.flag)
8e65ff28 304 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
305 _("table_body outside a table is not valid; it must be \
306after a table_begin and before a table_end."));
bafdd3b3 307 if (uiout->table.body_flag)
8e65ff28 308 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
309 _("extra table_body call not allowed; there must be \
310only one table_body after a table_begin and before a table_end."));
bafdd3b3 311 if (uiout->table.header_next->colno != uiout->table.columns)
8e65ff28 312 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
313 _("number of headers differ from number of table \
314columns."));
8b93c638 315
bafdd3b3
AC
316 uiout->table.body_flag = 1;
317 uiout->table.header_next = uiout->table.header_first;
8b93c638
JM
318
319 uo_table_body (uiout);
320}
321
3b31d625 322static void
fba45db2 323ui_out_table_end (struct ui_out *uiout)
8b93c638 324{
bafdd3b3 325 if (!uiout->table.flag)
8e65ff28 326 internal_error (__FILE__, __LINE__,
e2e0b3e5 327 _("misplaced table_end or missing table_begin."));
8b93c638 328
a6c47c14 329 uiout->table.entry_level = 0;
bafdd3b3
AC
330 uiout->table.body_flag = 0;
331 uiout->table.flag = 0;
8b93c638
JM
332
333 uo_table_end (uiout);
334
bafdd3b3
AC
335 if (uiout->table.id)
336 xfree (uiout->table.id);
8b93c638
JM
337 clear_header_list (uiout);
338}
339
340void
fba45db2 341ui_out_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
b25959ec 342 const char *col_name,
88379baf 343 const char *colhdr)
8b93c638 344{
bafdd3b3 345 if (!uiout->table.flag || uiout->table.body_flag)
8e65ff28 346 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
347 _("table header must be specified after table_begin \
348and before table_body."));
8b93c638 349
b25959ec 350 append_header_to_list (uiout, width, alignment, col_name, colhdr);
8b93c638 351
b25959ec 352 uo_table_header (uiout, width, alignment, col_name, colhdr);
8b93c638
JM
353}
354
3b31d625
EZ
355static void
356do_cleanup_table_end (void *data)
357{
358 struct ui_out *ui_out = data;
359
360 ui_out_table_end (ui_out);
361}
362
363struct cleanup *
364make_cleanup_ui_out_table_begin_end (struct ui_out *ui_out, int nr_cols,
365 int nr_rows, const char *tblid)
366{
367 ui_out_table_begin (ui_out, nr_cols, nr_rows, tblid);
368 return make_cleanup (do_cleanup_table_end, ui_out);
369}
370
8b93c638 371void
631ec795
AC
372ui_out_begin (struct ui_out *uiout,
373 enum ui_out_type type,
374 const char *id)
8b93c638 375{
80f49b30 376 int new_level;
bafdd3b3 377 if (uiout->table.flag && !uiout->table.body_flag)
8e65ff28 378 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
379 _("table header or table_body expected; lists must be \
380specified after table_body."));
a6c47c14
AC
381
382 /* Be careful to verify the ``field'' before the new tuple/list is
383 pushed onto the stack. That way the containing list/table/row is
384 verified and not the newly created tuple/list. This verification
385 is needed (at least) for the case where a table row entry
386 contains either a tuple/list. For that case bookkeeping such as
387 updating the column count or advancing to the next heading still
388 needs to be performed. */
389 {
390 int fldno;
391 int width;
392 int align;
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);
412 uo_end (uiout, type, old_level);
8b93c638
JM
413}
414
127431f9
AC
415struct ui_out_end_cleanup_data
416{
417 struct ui_out *uiout;
418 enum ui_out_type type;
419};
420
e6e0bfab 421static void
127431f9
AC
422do_cleanup_end (void *data)
423{
424 struct ui_out_end_cleanup_data *end_cleanup_data = data;
425 ui_out_end (end_cleanup_data->uiout, end_cleanup_data->type);
426 xfree (end_cleanup_data);
427}
428
429static struct cleanup *
430make_cleanup_ui_out_end (struct ui_out *uiout,
431 enum ui_out_type type)
432{
433 struct ui_out_end_cleanup_data *end_cleanup_data;
434 end_cleanup_data = XMALLOC (struct ui_out_end_cleanup_data);
435 end_cleanup_data->uiout = uiout;
436 end_cleanup_data->type = type;
437 return make_cleanup (do_cleanup_end, end_cleanup_data);
438}
439
e6e0bfab 440struct cleanup *
666547aa
AC
441make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
442 const char *id)
443{
3b31d625 444 ui_out_begin (uiout, ui_out_type_tuple, id);
666547aa
AC
445 return make_cleanup_ui_out_end (uiout, ui_out_type_tuple);
446}
447
448struct cleanup *
6b28c186
AC
449make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
450 const char *id)
e6e0bfab 451{
3b31d625 452 ui_out_begin (uiout, ui_out_type_list, id);
127431f9 453 return make_cleanup_ui_out_end (uiout, ui_out_type_list);
e6e0bfab
MK
454}
455
8b93c638 456void
88379baf
AC
457ui_out_field_int (struct ui_out *uiout,
458 const char *fldname,
459 int value)
8b93c638
JM
460{
461 int fldno;
462 int width;
463 int align;
80f49b30 464 struct ui_out_level *current = current_level (uiout);
8b93c638 465
a6c47c14 466 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
467
468 uo_field_int (uiout, fldno, width, align, fldname, value);
469}
470
52c6a6ac
JJ
471void
472ui_out_field_fmt_int (struct ui_out *uiout,
473 int input_width,
474 enum ui_align input_align,
475 const char *fldname,
476 int value)
477{
478 int fldno;
479 int width;
480 int align;
481 struct ui_out_level *current = current_level (uiout);
482
483 verify_field (uiout, &fldno, &width, &align);
484
485 uo_field_int (uiout, fldno, input_width, input_align, fldname, value);
486}
487
8b93c638 488void
88379baf
AC
489ui_out_field_core_addr (struct ui_out *uiout,
490 const char *fldname,
5af949e3 491 struct gdbarch *gdbarch,
88379baf 492 CORE_ADDR address)
8b93c638
JM
493{
494 char addstr[20];
5af949e3 495 int addr_bit = gdbarch_addr_bit (gdbarch);
a72d8a8e 496
a72d8a8e
MR
497 if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
498 address &= ((CORE_ADDR) 1 << addr_bit) - 1;
8b93c638 499
535c96ce
AC
500 /* FIXME: cagney/2002-05-03: Need local_address_string() function
501 that returns the language localized string formatted to a width
17a912b6 502 based on gdbarch_addr_bit. */
a72d8a8e 503 if (addr_bit <= 32)
bb599908 504 strcpy (addstr, hex_string_custom (address, 8));
535c96ce 505 else
bb599908 506 strcpy (addstr, hex_string_custom (address, 16));
8b93c638
JM
507
508 ui_out_field_string (uiout, fldname, addstr);
509}
510
511void
88379baf
AC
512ui_out_field_stream (struct ui_out *uiout,
513 const char *fldname,
514 struct ui_stream *buf)
8b93c638
JM
515{
516 long length;
517 char *buffer = ui_file_xstrdup (buf->stream, &length);
b8c9b27d 518 struct cleanup *old_cleanup = make_cleanup (xfree, buffer);
8b93c638
JM
519 if (length > 0)
520 ui_out_field_string (uiout, fldname, buffer);
521 else
522 ui_out_field_skip (uiout, fldname);
523 ui_file_rewind (buf->stream);
524 do_cleanups (old_cleanup);
525}
526
527/* used to ommit a field */
528
529void
88379baf
AC
530ui_out_field_skip (struct ui_out *uiout,
531 const char *fldname)
8b93c638
JM
532{
533 int fldno;
534 int width;
535 int align;
8b93c638 536
a6c47c14 537 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
538
539 uo_field_skip (uiout, fldno, width, align, fldname);
540}
541
542void
543ui_out_field_string (struct ui_out *uiout,
88379baf 544 const char *fldname,
8b93c638
JM
545 const char *string)
546{
547 int fldno;
548 int width;
549 int align;
8b93c638 550
a6c47c14 551 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
552
553 uo_field_string (uiout, fldno, width, align, fldname, string);
554}
555
556/* VARARGS */
557void
88379baf
AC
558ui_out_field_fmt (struct ui_out *uiout,
559 const char *fldname,
560 const char *format, ...)
8b93c638
JM
561{
562 va_list args;
563 int fldno;
564 int width;
565 int align;
8b93c638
JM
566
567 /* will not align, but has to call anyway */
a6c47c14 568 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
569
570 va_start (args, format);
571
572 uo_field_fmt (uiout, fldno, width, align, fldname, format, args);
573
574 va_end (args);
575}
576
577void
fba45db2 578ui_out_spaces (struct ui_out *uiout, int numspaces)
8b93c638
JM
579{
580 uo_spaces (uiout, numspaces);
581}
582
583void
88379baf
AC
584ui_out_text (struct ui_out *uiout,
585 const char *string)
8b93c638
JM
586{
587 uo_text (uiout, string);
588}
589
590void
88379baf
AC
591ui_out_message (struct ui_out *uiout, int verbosity,
592 const char *format,...)
8b93c638
JM
593{
594 va_list args;
595
596 va_start (args, format);
597
598 uo_message (uiout, verbosity, format, args);
599
600 va_end (args);
601}
602
603struct ui_stream *
fba45db2 604ui_out_stream_new (struct ui_out *uiout)
8b93c638
JM
605{
606 struct ui_stream *tempbuf;
607
608 tempbuf = XMALLOC (struct ui_stream);
609 tempbuf->uiout = uiout;
610 tempbuf->stream = mem_fileopen ();
611 return tempbuf;
612}
613
614void
fba45db2 615ui_out_stream_delete (struct ui_stream *buf)
8b93c638
JM
616{
617 ui_file_delete (buf->stream);
b8c9b27d 618 xfree (buf);
8b93c638
JM
619}
620
621static void
622do_stream_delete (void *buf)
623{
624 ui_out_stream_delete (buf);
625}
626
627struct cleanup *
628make_cleanup_ui_out_stream_delete (struct ui_stream *buf)
629{
630 return make_cleanup (do_stream_delete, buf);
631}
632
633
634void
fba45db2 635ui_out_wrap_hint (struct ui_out *uiout, char *identstring)
8b93c638
JM
636{
637 uo_wrap_hint (uiout, identstring);
638}
639
640void
fba45db2 641ui_out_flush (struct ui_out *uiout)
8b93c638
JM
642{
643 uo_flush (uiout);
644}
645
0fac0b41
DJ
646int
647ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream)
648{
649 return uo_redirect (uiout, outstream);
650}
651
8b93c638
JM
652/* set the flags specified by the mask given */
653int
fba45db2 654ui_out_set_flags (struct ui_out *uiout, int mask)
8b93c638 655{
5bfb05ca 656 int oldflags = uiout->flags;
8b93c638 657
b8d86de3 658 uiout->flags |= mask;
8b93c638
JM
659
660 return oldflags;
661}
662
663/* clear the flags specified by the mask given */
664int
fba45db2 665ui_out_clear_flags (struct ui_out *uiout, int mask)
8b93c638 666{
5bfb05ca 667 int oldflags = uiout->flags;
8b93c638
JM
668
669 uiout->flags &= ~mask;
670
671 return oldflags;
672}
673
674/* test the flags against the mask given */
675int
fba45db2 676ui_out_test_flags (struct ui_out *uiout, int mask)
8b93c638
JM
677{
678 return (uiout->flags & mask);
679}
680
681/* obtain the current verbosity level (as stablished by the
682 'set verbositylevel' command */
683
684int
fba45db2 685ui_out_get_verblvl (struct ui_out *uiout)
8b93c638
JM
686{
687 /* FIXME: not implemented yet */
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
8b93c638
JM
752/* default gdb-out hook functions */
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
852/* Interface to the implementation functions */
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
1006/* list of column headers manipulation routines */
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
8b93c638
JM
1131/* access to ui_out format private members */
1132
1133void
fba45db2 1134ui_out_get_field_separator (struct ui_out *uiout)
8b93c638
JM
1135{
1136}
1137
1138/* Access to ui-out members data */
1139
1140struct ui_out_data *
1141ui_out_data (struct ui_out *uiout)
1142{
1143 return uiout->data;
1144}
1145
1146/* initalize private members at startup */
1147
1148struct ui_out *
1149ui_out_new (struct ui_out_impl *impl,
1150 struct ui_out_data *data,
1151 int flags)
1152{
1153 struct ui_out *uiout = XMALLOC (struct ui_out);
1154 uiout->data = data;
1155 uiout->impl = impl;
1156 uiout->flags = flags;
bafdd3b3
AC
1157 uiout->table.flag = 0;
1158 uiout->table.body_flag = 0;
80f49b30
AC
1159 uiout->level = 0;
1160 memset (uiout->levels, 0, sizeof (uiout->levels));
bafdd3b3
AC
1161 uiout->table.header_first = NULL;
1162 uiout->table.header_last = NULL;
1163 uiout->table.header_next = NULL;
8b93c638
JM
1164 return uiout;
1165}
1166
1167/* standard gdb initialization hook */
1168
1169void
fba45db2 1170_initialize_ui_out (void)
8b93c638
JM
1171{
1172 /* nothing needs to be done */
1173}
This page took 1.090003 seconds and 4 git commands to generate.