PR tui/9217
[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
dc146f7c 47enum { MAX_UI_OUT_LEVELS = 8 };
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;
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
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_fmt (struct ui_out *uiout, int fldno, int width,
88379baf 246 enum ui_align align, const char *fldname,
bee0189a
DJ
247 const char *format, va_list args)
248 ATTR_FORMAT (printf, 6, 0);
8b93c638 249static void uo_spaces (struct ui_out *uiout, int numspaces);
88379baf 250static void uo_text (struct ui_out *uiout, const char *string);
8b93c638 251static void uo_message (struct ui_out *uiout, int verbosity,
bee0189a
DJ
252 const char *format, va_list args)
253 ATTR_FORMAT (printf, 3, 0);
8b93c638
JM
254static void uo_wrap_hint (struct ui_out *uiout, char *identstring);
255static void uo_flush (struct ui_out *uiout);
0fac0b41 256static int uo_redirect (struct ui_out *uiout, struct ui_file *outstream);
8b93c638
JM
257
258/* Prototypes for local functions */
259
260extern void _initialize_ui_out (void);
88379baf 261static void append_header_to_list (struct ui_out *uiout, int width,
b25959ec
AC
262 int alignment, const char *col_name,
263 const char *colhdr);
bafdd3b3 264static int get_next_header (struct ui_out *uiout, int *colno, int *width,
8b93c638
JM
265 int *alignment, char **colhdr);
266static void clear_header_list (struct ui_out *uiout);
a6c47c14
AC
267static void verify_field (struct ui_out *uiout, int *fldno, int *width,
268 int *align);
8b93c638 269
8b93c638
JM
270/* exported functions (ui_out API) */
271
272/* Mark beginning of a table */
273
3b31d625 274static void
88379baf 275ui_out_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 276 int nr_rows,
88379baf 277 const char *tblid)
8b93c638 278{
bafdd3b3 279 if (uiout->table.flag)
8e65ff28 280 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
281 _("tables cannot be nested; table_begin found before \
282previous table_end."));
8b93c638 283
bafdd3b3
AC
284 uiout->table.flag = 1;
285 uiout->table.body_flag = 0;
a6c47c14 286 uiout->table.entry_level = uiout->level + 1;
bafdd3b3 287 uiout->table.columns = nbrofcols;
8b93c638 288 if (tblid != NULL)
bafdd3b3 289 uiout->table.id = xstrdup (tblid);
8b93c638 290 else
bafdd3b3 291 uiout->table.id = NULL;
8b93c638
JM
292 clear_header_list (uiout);
293
bafdd3b3 294 uo_table_begin (uiout, nbrofcols, nr_rows, uiout->table.id);
8b93c638
JM
295}
296
297void
fba45db2 298ui_out_table_body (struct ui_out *uiout)
8b93c638 299{
bafdd3b3 300 if (!uiout->table.flag)
8e65ff28 301 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
302 _("table_body outside a table is not valid; it must be \
303after a table_begin and before a table_end."));
bafdd3b3 304 if (uiout->table.body_flag)
8e65ff28 305 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
306 _("extra table_body call not allowed; there must be \
307only one table_body after a table_begin and before a table_end."));
bafdd3b3 308 if (uiout->table.header_next->colno != uiout->table.columns)
8e65ff28 309 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
310 _("number of headers differ from number of table \
311columns."));
8b93c638 312
bafdd3b3
AC
313 uiout->table.body_flag = 1;
314 uiout->table.header_next = uiout->table.header_first;
8b93c638
JM
315
316 uo_table_body (uiout);
317}
318
3b31d625 319static void
fba45db2 320ui_out_table_end (struct ui_out *uiout)
8b93c638 321{
bafdd3b3 322 if (!uiout->table.flag)
8e65ff28 323 internal_error (__FILE__, __LINE__,
e2e0b3e5 324 _("misplaced table_end or missing table_begin."));
8b93c638 325
a6c47c14 326 uiout->table.entry_level = 0;
bafdd3b3
AC
327 uiout->table.body_flag = 0;
328 uiout->table.flag = 0;
8b93c638
JM
329
330 uo_table_end (uiout);
331
bafdd3b3
AC
332 if (uiout->table.id)
333 xfree (uiout->table.id);
8b93c638
JM
334 clear_header_list (uiout);
335}
336
337void
fba45db2 338ui_out_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
b25959ec 339 const char *col_name,
88379baf 340 const char *colhdr)
8b93c638 341{
bafdd3b3 342 if (!uiout->table.flag || uiout->table.body_flag)
8e65ff28 343 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
344 _("table header must be specified after table_begin \
345and before table_body."));
8b93c638 346
b25959ec 347 append_header_to_list (uiout, width, alignment, col_name, colhdr);
8b93c638 348
b25959ec 349 uo_table_header (uiout, width, alignment, col_name, colhdr);
8b93c638
JM
350}
351
3b31d625
EZ
352static void
353do_cleanup_table_end (void *data)
354{
355 struct ui_out *ui_out = data;
356
357 ui_out_table_end (ui_out);
358}
359
360struct cleanup *
361make_cleanup_ui_out_table_begin_end (struct ui_out *ui_out, int nr_cols,
362 int nr_rows, const char *tblid)
363{
364 ui_out_table_begin (ui_out, nr_cols, nr_rows, tblid);
365 return make_cleanup (do_cleanup_table_end, ui_out);
366}
367
8b93c638 368void
631ec795
AC
369ui_out_begin (struct ui_out *uiout,
370 enum ui_out_type type,
371 const char *id)
8b93c638 372{
80f49b30 373 int new_level;
bafdd3b3 374 if (uiout->table.flag && !uiout->table.body_flag)
8e65ff28 375 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
376 _("table header or table_body expected; lists must be \
377specified after table_body."));
a6c47c14
AC
378
379 /* Be careful to verify the ``field'' before the new tuple/list is
380 pushed onto the stack. That way the containing list/table/row is
381 verified and not the newly created tuple/list. This verification
382 is needed (at least) for the case where a table row entry
383 contains either a tuple/list. For that case bookkeeping such as
384 updating the column count or advancing to the next heading still
385 needs to be performed. */
386 {
387 int fldno;
388 int width;
389 int align;
390 verify_field (uiout, &fldno, &width, &align);
391 }
392
631ec795 393 new_level = push_level (uiout, type, id);
a6c47c14
AC
394
395 /* If the push puts us at the same level as a table row entry, we've
396 got a new table row. Put the header pointer back to the start. */
397 if (uiout->table.body_flag
398 && uiout->table.entry_level == new_level)
bafdd3b3 399 uiout->table.header_next = uiout->table.header_first;
a6c47c14 400
631ec795
AC
401 uo_begin (uiout, type, new_level, id);
402}
403
631ec795
AC
404void
405ui_out_end (struct ui_out *uiout,
406 enum ui_out_type type)
407{
408 int old_level = pop_level (uiout, type);
409 uo_end (uiout, type, old_level);
8b93c638
JM
410}
411
127431f9
AC
412struct ui_out_end_cleanup_data
413{
414 struct ui_out *uiout;
415 enum ui_out_type type;
416};
417
e6e0bfab 418static void
127431f9
AC
419do_cleanup_end (void *data)
420{
421 struct ui_out_end_cleanup_data *end_cleanup_data = data;
422 ui_out_end (end_cleanup_data->uiout, end_cleanup_data->type);
423 xfree (end_cleanup_data);
424}
425
426static struct cleanup *
427make_cleanup_ui_out_end (struct ui_out *uiout,
428 enum ui_out_type type)
429{
430 struct ui_out_end_cleanup_data *end_cleanup_data;
431 end_cleanup_data = XMALLOC (struct ui_out_end_cleanup_data);
432 end_cleanup_data->uiout = uiout;
433 end_cleanup_data->type = type;
434 return make_cleanup (do_cleanup_end, end_cleanup_data);
435}
436
e6e0bfab 437struct cleanup *
666547aa
AC
438make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
439 const char *id)
440{
3b31d625 441 ui_out_begin (uiout, ui_out_type_tuple, id);
666547aa
AC
442 return make_cleanup_ui_out_end (uiout, ui_out_type_tuple);
443}
444
445struct cleanup *
6b28c186
AC
446make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
447 const char *id)
e6e0bfab 448{
3b31d625 449 ui_out_begin (uiout, ui_out_type_list, id);
127431f9 450 return make_cleanup_ui_out_end (uiout, ui_out_type_list);
e6e0bfab
MK
451}
452
8b93c638 453void
88379baf
AC
454ui_out_field_int (struct ui_out *uiout,
455 const char *fldname,
456 int value)
8b93c638
JM
457{
458 int fldno;
459 int width;
460 int align;
80f49b30 461 struct ui_out_level *current = current_level (uiout);
8b93c638 462
a6c47c14 463 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
464
465 uo_field_int (uiout, fldno, width, align, fldname, value);
466}
467
52c6a6ac
JJ
468void
469ui_out_field_fmt_int (struct ui_out *uiout,
470 int input_width,
471 enum ui_align input_align,
472 const char *fldname,
473 int value)
474{
475 int fldno;
476 int width;
477 int align;
478 struct ui_out_level *current = current_level (uiout);
479
480 verify_field (uiout, &fldno, &width, &align);
481
482 uo_field_int (uiout, fldno, input_width, input_align, fldname, value);
483}
484
8b93c638 485void
88379baf
AC
486ui_out_field_core_addr (struct ui_out *uiout,
487 const char *fldname,
5af949e3 488 struct gdbarch *gdbarch,
88379baf 489 CORE_ADDR address)
8b93c638
JM
490{
491 char addstr[20];
5af949e3 492 int addr_bit = gdbarch_addr_bit (gdbarch);
a72d8a8e 493
a72d8a8e
MR
494 if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
495 address &= ((CORE_ADDR) 1 << addr_bit) - 1;
8b93c638 496
535c96ce
AC
497 /* FIXME: cagney/2002-05-03: Need local_address_string() function
498 that returns the language localized string formatted to a width
17a912b6 499 based on gdbarch_addr_bit. */
a72d8a8e 500 if (addr_bit <= 32)
bb599908 501 strcpy (addstr, hex_string_custom (address, 8));
535c96ce 502 else
bb599908 503 strcpy (addstr, hex_string_custom (address, 16));
8b93c638
JM
504
505 ui_out_field_string (uiout, fldname, addstr);
506}
507
508void
88379baf
AC
509ui_out_field_stream (struct ui_out *uiout,
510 const char *fldname,
511 struct ui_stream *buf)
8b93c638
JM
512{
513 long length;
514 char *buffer = ui_file_xstrdup (buf->stream, &length);
b8c9b27d 515 struct cleanup *old_cleanup = make_cleanup (xfree, buffer);
8b93c638
JM
516 if (length > 0)
517 ui_out_field_string (uiout, fldname, buffer);
518 else
519 ui_out_field_skip (uiout, fldname);
520 ui_file_rewind (buf->stream);
521 do_cleanups (old_cleanup);
522}
523
524/* used to ommit a field */
525
526void
88379baf
AC
527ui_out_field_skip (struct ui_out *uiout,
528 const char *fldname)
8b93c638
JM
529{
530 int fldno;
531 int width;
532 int align;
8b93c638 533
a6c47c14 534 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
535
536 uo_field_skip (uiout, fldno, width, align, fldname);
537}
538
539void
540ui_out_field_string (struct ui_out *uiout,
88379baf 541 const char *fldname,
8b93c638
JM
542 const char *string)
543{
544 int fldno;
545 int width;
546 int align;
8b93c638 547
a6c47c14 548 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
549
550 uo_field_string (uiout, fldno, width, align, fldname, string);
551}
552
553/* VARARGS */
554void
88379baf
AC
555ui_out_field_fmt (struct ui_out *uiout,
556 const char *fldname,
557 const char *format, ...)
8b93c638
JM
558{
559 va_list args;
560 int fldno;
561 int width;
562 int align;
8b93c638
JM
563
564 /* will not align, but has to call anyway */
a6c47c14 565 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
566
567 va_start (args, format);
568
569 uo_field_fmt (uiout, fldno, width, align, fldname, format, args);
570
571 va_end (args);
572}
573
574void
fba45db2 575ui_out_spaces (struct ui_out *uiout, int numspaces)
8b93c638
JM
576{
577 uo_spaces (uiout, numspaces);
578}
579
580void
88379baf
AC
581ui_out_text (struct ui_out *uiout,
582 const char *string)
8b93c638
JM
583{
584 uo_text (uiout, string);
585}
586
587void
88379baf
AC
588ui_out_message (struct ui_out *uiout, int verbosity,
589 const char *format,...)
8b93c638
JM
590{
591 va_list args;
592
593 va_start (args, format);
594
595 uo_message (uiout, verbosity, format, args);
596
597 va_end (args);
598}
599
600struct ui_stream *
fba45db2 601ui_out_stream_new (struct ui_out *uiout)
8b93c638
JM
602{
603 struct ui_stream *tempbuf;
604
605 tempbuf = XMALLOC (struct ui_stream);
606 tempbuf->uiout = uiout;
607 tempbuf->stream = mem_fileopen ();
608 return tempbuf;
609}
610
611void
fba45db2 612ui_out_stream_delete (struct ui_stream *buf)
8b93c638
JM
613{
614 ui_file_delete (buf->stream);
b8c9b27d 615 xfree (buf);
8b93c638
JM
616}
617
618static void
619do_stream_delete (void *buf)
620{
621 ui_out_stream_delete (buf);
622}
623
624struct cleanup *
625make_cleanup_ui_out_stream_delete (struct ui_stream *buf)
626{
627 return make_cleanup (do_stream_delete, buf);
628}
629
630
631void
fba45db2 632ui_out_wrap_hint (struct ui_out *uiout, char *identstring)
8b93c638
JM
633{
634 uo_wrap_hint (uiout, identstring);
635}
636
637void
fba45db2 638ui_out_flush (struct ui_out *uiout)
8b93c638
JM
639{
640 uo_flush (uiout);
641}
642
0fac0b41
DJ
643int
644ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream)
645{
646 return uo_redirect (uiout, outstream);
647}
648
8b93c638
JM
649/* set the flags specified by the mask given */
650int
fba45db2 651ui_out_set_flags (struct ui_out *uiout, int mask)
8b93c638 652{
5bfb05ca 653 int oldflags = uiout->flags;
8b93c638 654
b8d86de3 655 uiout->flags |= mask;
8b93c638
JM
656
657 return oldflags;
658}
659
660/* clear the flags specified by the mask given */
661int
fba45db2 662ui_out_clear_flags (struct ui_out *uiout, int mask)
8b93c638 663{
5bfb05ca 664 int oldflags = uiout->flags;
8b93c638
JM
665
666 uiout->flags &= ~mask;
667
668 return oldflags;
669}
670
671/* test the flags against the mask given */
672int
fba45db2 673ui_out_test_flags (struct ui_out *uiout, int mask)
8b93c638
JM
674{
675 return (uiout->flags & mask);
676}
677
678/* obtain the current verbosity level (as stablished by the
679 'set verbositylevel' command */
680
681int
fba45db2 682ui_out_get_verblvl (struct ui_out *uiout)
8b93c638
JM
683{
684 /* FIXME: not implemented yet */
685 return 0;
686}
687
688#if 0
689void
fba45db2 690ui_out_result_begin (struct ui_out *uiout, char *class)
8b93c638
JM
691{
692}
693
694void
fba45db2 695ui_out_result_end (struct ui_out *uiout)
8b93c638
JM
696{
697}
698
699void
fba45db2 700ui_out_info_begin (struct ui_out *uiout, char *class)
8b93c638
JM
701{
702}
703
704void
fba45db2 705ui_out_info_end (struct ui_out *uiout)
8b93c638
JM
706{
707}
708
709void
fba45db2 710ui_out_notify_begin (struct ui_out *uiout, char *class)
8b93c638
JM
711{
712}
713
714void
fba45db2 715ui_out_notify_end (struct ui_out *uiout)
8b93c638
JM
716{
717}
718
719void
fba45db2 720ui_out_error_begin (struct ui_out *uiout, char *class)
8b93c638
JM
721{
722}
723
724void
fba45db2 725ui_out_error_end (struct ui_out *uiout)
8b93c638
JM
726{
727}
728#endif
729
730#if 0
731void
732gdb_error (ui_out * uiout, int severity, char *format,...)
733{
734 va_list args;
735}
736
737void
10689f25 738gdb_query (struct ui_out *uiout, int qflags, char *qprompt)
8b93c638
JM
739{
740}
741#endif
742
9dc5e2a9
AC
743int
744ui_out_is_mi_like_p (struct ui_out *uiout)
745{
746 return uiout->impl->is_mi_like_p;
747}
748
8b93c638
JM
749/* default gdb-out hook functions */
750
751static void
d63f1d40
AC
752default_table_begin (struct ui_out *uiout, int nbrofcols,
753 int nr_rows,
754 const char *tblid)
8b93c638
JM
755{
756}
757
758static void
fba45db2 759default_table_body (struct ui_out *uiout)
8b93c638
JM
760{
761}
762
763static void
fba45db2 764default_table_end (struct ui_out *uiout)
8b93c638
JM
765{
766}
767
768static void
fba45db2 769default_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
b25959ec 770 const char *col_name,
e2e11a41 771 const char *colhdr)
8b93c638
JM
772{
773}
774
775static void
631ec795
AC
776default_begin (struct ui_out *uiout,
777 enum ui_out_type type,
778 int level,
779 const char *id)
8b93c638
JM
780{
781}
782
783static void
631ec795
AC
784default_end (struct ui_out *uiout,
785 enum ui_out_type type,
786 int level)
8b93c638
JM
787{
788}
789
790static void
fba45db2 791default_field_int (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
792 enum ui_align align,
793 const char *fldname, int value)
8b93c638
JM
794{
795}
796
797static void
fba45db2 798default_field_skip (struct ui_out *uiout, int fldno, int width,
e2e11a41 799 enum ui_align align, const char *fldname)
8b93c638
JM
800{
801}
802
803static void
804default_field_string (struct ui_out *uiout,
805 int fldno,
806 int width,
807 enum ui_align align,
e2e11a41 808 const char *fldname,
8b93c638
JM
809 const char *string)
810{
811}
812
813static void
fba45db2 814default_field_fmt (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
815 enum ui_align align,
816 const char *fldname,
817 const char *format,
fba45db2 818 va_list args)
8b93c638
JM
819{
820}
821
822static void
fba45db2 823default_spaces (struct ui_out *uiout, int numspaces)
8b93c638
JM
824{
825}
826
827static void
e2e11a41 828default_text (struct ui_out *uiout, const char *string)
8b93c638
JM
829{
830}
831
832static void
e2e11a41
AC
833default_message (struct ui_out *uiout, int verbosity,
834 const char *format,
fba45db2 835 va_list args)
8b93c638
JM
836{
837}
838
839static void
fba45db2 840default_wrap_hint (struct ui_out *uiout, char *identstring)
8b93c638
JM
841{
842}
843
844static void
fba45db2 845default_flush (struct ui_out *uiout)
8b93c638
JM
846{
847}
848
849/* Interface to the implementation functions */
850
851void
88379baf 852uo_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 853 int nr_rows,
88379baf 854 const char *tblid)
8b93c638
JM
855{
856 if (!uiout->impl->table_begin)
857 return;
d63f1d40 858 uiout->impl->table_begin (uiout, nbrofcols, nr_rows, tblid);
8b93c638
JM
859}
860
861void
862uo_table_body (struct ui_out *uiout)
863{
864 if (!uiout->impl->table_body)
865 return;
866 uiout->impl->table_body (uiout);
867}
868
869void
870uo_table_end (struct ui_out *uiout)
871{
872 if (!uiout->impl->table_end)
873 return;
874 uiout->impl->table_end (uiout);
875}
876
877void
88379baf 878uo_table_header (struct ui_out *uiout, int width, enum ui_align align,
b25959ec 879 const char *col_name,
88379baf 880 const char *colhdr)
8b93c638
JM
881{
882 if (!uiout->impl->table_header)
883 return;
b25959ec 884 uiout->impl->table_header (uiout, width, align, col_name, colhdr);
8b93c638
JM
885}
886
887void
631ec795
AC
888uo_begin (struct ui_out *uiout,
889 enum ui_out_type type,
890 int level,
891 const char *id)
8b93c638 892{
631ec795 893 if (uiout->impl->begin == NULL)
8b93c638 894 return;
631ec795 895 uiout->impl->begin (uiout, type, level, id);
8b93c638
JM
896}
897
898void
631ec795
AC
899uo_end (struct ui_out *uiout,
900 enum ui_out_type type,
901 int level)
8b93c638 902{
631ec795 903 if (uiout->impl->end == NULL)
8b93c638 904 return;
631ec795 905 uiout->impl->end (uiout, type, level);
8b93c638
JM
906}
907
908void
88379baf
AC
909uo_field_int (struct ui_out *uiout, int fldno, int width, enum ui_align align,
910 const char *fldname,
911 int value)
8b93c638
JM
912{
913 if (!uiout->impl->field_int)
914 return;
915 uiout->impl->field_int (uiout, fldno, width, align, fldname, value);
916}
917
918void
88379baf
AC
919uo_field_skip (struct ui_out *uiout, int fldno, int width, enum ui_align align,
920 const char *fldname)
8b93c638
JM
921{
922 if (!uiout->impl->field_skip)
923 return;
924 uiout->impl->field_skip (uiout, fldno, width, align, fldname);
925}
926
927void
928uo_field_string (struct ui_out *uiout, int fldno, int width,
88379baf
AC
929 enum ui_align align,
930 const char *fldname,
931 const char *string)
8b93c638
JM
932{
933 if (!uiout->impl->field_string)
934 return;
935 uiout->impl->field_string (uiout, fldno, width, align, fldname, string);
936}
937
938void
88379baf
AC
939uo_field_fmt (struct ui_out *uiout, int fldno, int width, enum ui_align align,
940 const char *fldname,
941 const char *format,
942 va_list args)
8b93c638
JM
943{
944 if (!uiout->impl->field_fmt)
945 return;
946 uiout->impl->field_fmt (uiout, fldno, width, align, fldname, format, args);
947}
948
949void
950uo_spaces (struct ui_out *uiout, int numspaces)
951{
952 if (!uiout->impl->spaces)
953 return;
954 uiout->impl->spaces (uiout, numspaces);
955}
956
957void
88379baf
AC
958uo_text (struct ui_out *uiout,
959 const char *string)
8b93c638
JM
960{
961 if (!uiout->impl->text)
962 return;
963 uiout->impl->text (uiout, string);
964}
965
966void
88379baf
AC
967uo_message (struct ui_out *uiout, int verbosity,
968 const char *format,
969 va_list args)
8b93c638
JM
970{
971 if (!uiout->impl->message)
972 return;
973 uiout->impl->message (uiout, verbosity, format, args);
974}
975
976void
977uo_wrap_hint (struct ui_out *uiout, char *identstring)
978{
979 if (!uiout->impl->wrap_hint)
980 return;
981 uiout->impl->wrap_hint (uiout, identstring);
982}
983
984void
985uo_flush (struct ui_out *uiout)
986{
987 if (!uiout->impl->flush)
988 return;
989 uiout->impl->flush (uiout);
990}
991
0fac0b41
DJ
992int
993uo_redirect (struct ui_out *uiout, struct ui_file *outstream)
994{
995 if (!uiout->impl->redirect)
996 return -1;
997 uiout->impl->redirect (uiout, outstream);
998 return 0;
999}
1000
8b93c638
JM
1001/* local functions */
1002
1003/* list of column headers manipulation routines */
1004
1005static void
fba45db2 1006clear_header_list (struct ui_out *uiout)
8b93c638 1007{
bafdd3b3 1008 while (uiout->table.header_first != NULL)
8b93c638 1009 {
bafdd3b3
AC
1010 uiout->table.header_next = uiout->table.header_first;
1011 uiout->table.header_first = uiout->table.header_first->next;
1012 if (uiout->table.header_next->colhdr != NULL)
1013 xfree (uiout->table.header_next->colhdr);
1014 xfree (uiout->table.header_next);
8b93c638 1015 }
bafdd3b3
AC
1016 gdb_assert (uiout->table.header_first == NULL);
1017 uiout->table.header_last = NULL;
1018 uiout->table.header_next = NULL;
8b93c638
JM
1019}
1020
1021static void
1022append_header_to_list (struct ui_out *uiout,
1023 int width,
1024 int alignment,
b25959ec 1025 const char *col_name,
88379baf 1026 const char *colhdr)
8b93c638
JM
1027{
1028 struct ui_out_hdr *temphdr;
1029
1030 temphdr = XMALLOC (struct ui_out_hdr);
1031 temphdr->width = width;
1032 temphdr->alignment = alignment;
44db85f8
MS
1033 /* We have to copy the column title as the original may be an
1034 automatic. */
8b93c638 1035 if (colhdr != NULL)
b25959ec
AC
1036 temphdr->colhdr = xstrdup (colhdr);
1037 else
1038 temphdr->colhdr = NULL;
44db85f8 1039
b25959ec 1040 if (col_name != NULL)
44db85f8
MS
1041 temphdr->col_name = xstrdup (col_name);
1042 else if (colhdr != NULL)
b25959ec
AC
1043 temphdr->col_name = xstrdup (colhdr);
1044 else
44db85f8
MS
1045 temphdr->col_name = NULL;
1046
8b93c638 1047 temphdr->next = NULL;
bafdd3b3 1048 if (uiout->table.header_first == NULL)
8b93c638
JM
1049 {
1050 temphdr->colno = 1;
bafdd3b3
AC
1051 uiout->table.header_first = temphdr;
1052 uiout->table.header_last = temphdr;
8b93c638
JM
1053 }
1054 else
1055 {
bafdd3b3
AC
1056 temphdr->colno = uiout->table.header_last->colno + 1;
1057 uiout->table.header_last->next = temphdr;
1058 uiout->table.header_last = temphdr;
8b93c638 1059 }
bafdd3b3 1060 uiout->table.header_next = uiout->table.header_last;
8b93c638
JM
1061}
1062
bafdd3b3
AC
1063/* Extract the format information for the NEXT header and and advance
1064 the header pointer. Return 0 if there was no next header. */
8b93c638
JM
1065
1066static int
bafdd3b3 1067get_next_header (struct ui_out *uiout,
8b93c638
JM
1068 int *colno,
1069 int *width,
1070 int *alignment,
1071 char **colhdr)
1072{
bafdd3b3
AC
1073 /* There may be no headers at all or we may have used all columns. */
1074 if (uiout->table.header_next == NULL)
8b93c638 1075 return 0;
bafdd3b3
AC
1076 *colno = uiout->table.header_next->colno;
1077 *width = uiout->table.header_next->width;
1078 *alignment = uiout->table.header_next->alignment;
1079 *colhdr = uiout->table.header_next->colhdr;
1080 /* Advance the header pointer to the next entry. */
1081 uiout->table.header_next = uiout->table.header_next->next;
8b93c638
JM
1082 return 1;
1083}
1084
a6c47c14
AC
1085
1086/* Verify that the field/tuple/list is correctly positioned. Return
1087 the field number and corresponding alignment (if
1088 available/applicable). */
8b93c638
JM
1089
1090static void
a6c47c14 1091verify_field (struct ui_out *uiout, int *fldno, int *width, int *align)
8b93c638 1092{
a6c47c14
AC
1093 struct ui_out_level *current = current_level (uiout);
1094 char *text;
1095
bafdd3b3 1096 if (uiout->table.flag)
8b93c638 1097 {
bafdd3b3 1098 if (!uiout->table.body_flag)
8e65ff28 1099 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
1100 _("table_body missing; table fields must be \
1101specified after table_body and inside a list."));
a6c47c14
AC
1102 /* NOTE: cagney/2001-12-08: There was a check here to ensure
1103 that this code was only executed when uiout->level was
1104 greater than zero. That no longer applies - this code is run
1105 before each table row tuple is started and at that point the
1106 level is zero. */
8b93c638 1107 }
8b93c638 1108
a6c47c14 1109 current->field_count += 1;
8b93c638 1110
a6c47c14
AC
1111 if (uiout->table.body_flag
1112 && uiout->table.entry_level == uiout->level
1113 && get_next_header (uiout, fldno, width, align, &text))
8b93c638 1114 {
a6c47c14 1115 if (*fldno != current->field_count)
8e65ff28 1116 internal_error (__FILE__, __LINE__,
e2e0b3e5 1117 _("ui-out internal error in handling headers."));
8b93c638
JM
1118 }
1119 else
1120 {
1121 *width = 0;
1122 *align = ui_noalign;
a6c47c14 1123 *fldno = current->field_count;
8b93c638
JM
1124 }
1125}
1126
a6c47c14 1127
8b93c638
JM
1128/* access to ui_out format private members */
1129
1130void
fba45db2 1131ui_out_get_field_separator (struct ui_out *uiout)
8b93c638
JM
1132{
1133}
1134
1135/* Access to ui-out members data */
1136
0a8fce9a 1137void *
8b93c638
JM
1138ui_out_data (struct ui_out *uiout)
1139{
1140 return uiout->data;
1141}
1142
1143/* initalize private members at startup */
1144
1145struct ui_out *
0a8fce9a 1146ui_out_new (struct ui_out_impl *impl, void *data,
8b93c638
JM
1147 int flags)
1148{
1149 struct ui_out *uiout = XMALLOC (struct ui_out);
1150 uiout->data = data;
1151 uiout->impl = impl;
1152 uiout->flags = flags;
bafdd3b3
AC
1153 uiout->table.flag = 0;
1154 uiout->table.body_flag = 0;
80f49b30
AC
1155 uiout->level = 0;
1156 memset (uiout->levels, 0, sizeof (uiout->levels));
bafdd3b3
AC
1157 uiout->table.header_first = NULL;
1158 uiout->table.header_last = NULL;
1159 uiout->table.header_next = NULL;
8b93c638
JM
1160 return uiout;
1161}
1162
1163/* standard gdb initialization hook */
1164
1165void
fba45db2 1166_initialize_ui_out (void)
8b93c638
JM
1167{
1168 /* nothing needs to be done */
1169}
This page took 0.987105 seconds and 4 git commands to generate.