* gdb.threads/gcore-thread.exp: Use gdb_gcore_cmd.
[deliverable/binutils-gdb.git] / gdb / ui-out.c
CommitLineData
8b93c638 1/* Output generating routines for GDB.
349c5d5f 2
c5a57081
JB
3 Copyright (C) 1999-2002, 2004-2005, 2007-2012 Free Software
4 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 224
79a45e25 225struct ui_out *current_uiout = &def_uiout;
8b93c638 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
15230f37
TJB
489/* Documented in ui-out.h. */
490
8b93c638 491void
88379baf
AC
492ui_out_field_core_addr (struct ui_out *uiout,
493 const char *fldname,
5af949e3 494 struct gdbarch *gdbarch,
88379baf 495 CORE_ADDR address)
8b93c638 496{
f1310107
TJB
497 ui_out_field_string (uiout, fldname,
498 print_core_address (gdbarch, address));
8b93c638
JM
499}
500
501void
88379baf
AC
502ui_out_field_stream (struct ui_out *uiout,
503 const char *fldname,
f99d8bf4 504 struct ui_file *stream)
8b93c638
JM
505{
506 long length;
f99d8bf4 507 char *buffer = ui_file_xstrdup (stream, &length);
b8c9b27d 508 struct cleanup *old_cleanup = make_cleanup (xfree, buffer);
5d502164 509
8b93c638
JM
510 if (length > 0)
511 ui_out_field_string (uiout, fldname, buffer);
512 else
513 ui_out_field_skip (uiout, fldname);
f99d8bf4 514 ui_file_rewind (stream);
8b93c638
JM
515 do_cleanups (old_cleanup);
516}
517
581e13c1 518/* Used to omit a field. */
8b93c638
JM
519
520void
88379baf
AC
521ui_out_field_skip (struct ui_out *uiout,
522 const char *fldname)
8b93c638
JM
523{
524 int fldno;
525 int width;
526 int align;
8b93c638 527
a6c47c14 528 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
529
530 uo_field_skip (uiout, fldno, width, align, fldname);
531}
532
533void
534ui_out_field_string (struct ui_out *uiout,
88379baf 535 const char *fldname,
8b93c638
JM
536 const char *string)
537{
538 int fldno;
539 int width;
540 int align;
8b93c638 541
a6c47c14 542 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
543
544 uo_field_string (uiout, fldno, width, align, fldname, string);
545}
546
547/* VARARGS */
548void
88379baf
AC
549ui_out_field_fmt (struct ui_out *uiout,
550 const char *fldname,
551 const char *format, ...)
8b93c638
JM
552{
553 va_list args;
554 int fldno;
555 int width;
556 int align;
8b93c638 557
581e13c1 558 /* Will not align, but has to call anyway. */
a6c47c14 559 verify_field (uiout, &fldno, &width, &align);
8b93c638
JM
560
561 va_start (args, format);
562
563 uo_field_fmt (uiout, fldno, width, align, fldname, format, args);
564
565 va_end (args);
566}
567
568void
fba45db2 569ui_out_spaces (struct ui_out *uiout, int numspaces)
8b93c638
JM
570{
571 uo_spaces (uiout, numspaces);
572}
573
574void
88379baf
AC
575ui_out_text (struct ui_out *uiout,
576 const char *string)
8b93c638
JM
577{
578 uo_text (uiout, string);
579}
580
581void
88379baf
AC
582ui_out_message (struct ui_out *uiout, int verbosity,
583 const char *format,...)
8b93c638
JM
584{
585 va_list args;
586
587 va_start (args, format);
8b93c638 588 uo_message (uiout, verbosity, format, args);
8b93c638
JM
589 va_end (args);
590}
591
8b93c638 592void
fba45db2 593ui_out_wrap_hint (struct ui_out *uiout, char *identstring)
8b93c638
JM
594{
595 uo_wrap_hint (uiout, identstring);
596}
597
598void
fba45db2 599ui_out_flush (struct ui_out *uiout)
8b93c638
JM
600{
601 uo_flush (uiout);
602}
603
0fac0b41
DJ
604int
605ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream)
606{
607 return uo_redirect (uiout, outstream);
608}
609
581e13c1 610/* Set the flags specified by the mask given. */
8b93c638 611int
fba45db2 612ui_out_set_flags (struct ui_out *uiout, int mask)
8b93c638 613{
5bfb05ca 614 int oldflags = uiout->flags;
8b93c638 615
b8d86de3 616 uiout->flags |= mask;
8b93c638
JM
617 return oldflags;
618}
619
581e13c1 620/* Clear the flags specified by the mask given. */
8b93c638 621int
fba45db2 622ui_out_clear_flags (struct ui_out *uiout, int mask)
8b93c638 623{
5bfb05ca 624 int oldflags = uiout->flags;
8b93c638
JM
625
626 uiout->flags &= ~mask;
8b93c638
JM
627 return oldflags;
628}
629
581e13c1 630/* Test the flags against the mask given. */
8b93c638 631int
fba45db2 632ui_out_test_flags (struct ui_out *uiout, int mask)
8b93c638
JM
633{
634 return (uiout->flags & mask);
635}
636
581e13c1
MS
637/* Obtain the current verbosity level (as stablished by the
638 'set verbositylevel' command. */
8b93c638
JM
639
640int
fba45db2 641ui_out_get_verblvl (struct ui_out *uiout)
8b93c638 642{
581e13c1 643 /* FIXME: not implemented yet. */
8b93c638
JM
644 return 0;
645}
646
9dc5e2a9
AC
647int
648ui_out_is_mi_like_p (struct ui_out *uiout)
649{
650 return uiout->impl->is_mi_like_p;
651}
652
581e13c1 653/* Default gdb-out hook functions. */
8b93c638
JM
654
655static void
d63f1d40
AC
656default_table_begin (struct ui_out *uiout, int nbrofcols,
657 int nr_rows,
658 const char *tblid)
8b93c638
JM
659{
660}
661
662static void
fba45db2 663default_table_body (struct ui_out *uiout)
8b93c638
JM
664{
665}
666
667static void
fba45db2 668default_table_end (struct ui_out *uiout)
8b93c638
JM
669{
670}
671
672static void
fba45db2 673default_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
b25959ec 674 const char *col_name,
e2e11a41 675 const char *colhdr)
8b93c638
JM
676{
677}
678
679static void
631ec795
AC
680default_begin (struct ui_out *uiout,
681 enum ui_out_type type,
682 int level,
683 const char *id)
8b93c638
JM
684{
685}
686
687static void
631ec795
AC
688default_end (struct ui_out *uiout,
689 enum ui_out_type type,
690 int level)
8b93c638
JM
691{
692}
693
694static void
fba45db2 695default_field_int (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
696 enum ui_align align,
697 const char *fldname, int value)
8b93c638
JM
698{
699}
700
701static void
fba45db2 702default_field_skip (struct ui_out *uiout, int fldno, int width,
e2e11a41 703 enum ui_align align, const char *fldname)
8b93c638
JM
704{
705}
706
707static void
708default_field_string (struct ui_out *uiout,
709 int fldno,
710 int width,
711 enum ui_align align,
e2e11a41 712 const char *fldname,
8b93c638
JM
713 const char *string)
714{
715}
716
717static void
fba45db2 718default_field_fmt (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
719 enum ui_align align,
720 const char *fldname,
721 const char *format,
fba45db2 722 va_list args)
8b93c638
JM
723{
724}
725
726static void
fba45db2 727default_spaces (struct ui_out *uiout, int numspaces)
8b93c638
JM
728{
729}
730
731static void
e2e11a41 732default_text (struct ui_out *uiout, const char *string)
8b93c638
JM
733{
734}
735
736static void
e2e11a41
AC
737default_message (struct ui_out *uiout, int verbosity,
738 const char *format,
fba45db2 739 va_list args)
8b93c638
JM
740{
741}
742
743static void
fba45db2 744default_wrap_hint (struct ui_out *uiout, char *identstring)
8b93c638
JM
745{
746}
747
748static void
fba45db2 749default_flush (struct ui_out *uiout)
8b93c638
JM
750{
751}
752
581e13c1 753/* Interface to the implementation functions. */
8b93c638
JM
754
755void
88379baf 756uo_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 757 int nr_rows,
88379baf 758 const char *tblid)
8b93c638
JM
759{
760 if (!uiout->impl->table_begin)
761 return;
d63f1d40 762 uiout->impl->table_begin (uiout, nbrofcols, nr_rows, tblid);
8b93c638
JM
763}
764
765void
766uo_table_body (struct ui_out *uiout)
767{
768 if (!uiout->impl->table_body)
769 return;
770 uiout->impl->table_body (uiout);
771}
772
773void
774uo_table_end (struct ui_out *uiout)
775{
776 if (!uiout->impl->table_end)
777 return;
778 uiout->impl->table_end (uiout);
779}
780
781void
88379baf 782uo_table_header (struct ui_out *uiout, int width, enum ui_align align,
b25959ec 783 const char *col_name,
88379baf 784 const char *colhdr)
8b93c638
JM
785{
786 if (!uiout->impl->table_header)
787 return;
b25959ec 788 uiout->impl->table_header (uiout, width, align, col_name, colhdr);
8b93c638
JM
789}
790
791void
631ec795
AC
792uo_begin (struct ui_out *uiout,
793 enum ui_out_type type,
794 int level,
795 const char *id)
8b93c638 796{
631ec795 797 if (uiout->impl->begin == NULL)
8b93c638 798 return;
631ec795 799 uiout->impl->begin (uiout, type, level, id);
8b93c638
JM
800}
801
802void
631ec795
AC
803uo_end (struct ui_out *uiout,
804 enum ui_out_type type,
805 int level)
8b93c638 806{
631ec795 807 if (uiout->impl->end == NULL)
8b93c638 808 return;
631ec795 809 uiout->impl->end (uiout, type, level);
8b93c638
JM
810}
811
812void
88379baf
AC
813uo_field_int (struct ui_out *uiout, int fldno, int width, enum ui_align align,
814 const char *fldname,
815 int value)
8b93c638
JM
816{
817 if (!uiout->impl->field_int)
818 return;
819 uiout->impl->field_int (uiout, fldno, width, align, fldname, value);
820}
821
822void
88379baf
AC
823uo_field_skip (struct ui_out *uiout, int fldno, int width, enum ui_align align,
824 const char *fldname)
8b93c638
JM
825{
826 if (!uiout->impl->field_skip)
827 return;
828 uiout->impl->field_skip (uiout, fldno, width, align, fldname);
829}
830
831void
832uo_field_string (struct ui_out *uiout, int fldno, int width,
88379baf
AC
833 enum ui_align align,
834 const char *fldname,
835 const char *string)
8b93c638
JM
836{
837 if (!uiout->impl->field_string)
838 return;
839 uiout->impl->field_string (uiout, fldno, width, align, fldname, string);
840}
841
842void
88379baf
AC
843uo_field_fmt (struct ui_out *uiout, int fldno, int width, enum ui_align align,
844 const char *fldname,
845 const char *format,
846 va_list args)
8b93c638
JM
847{
848 if (!uiout->impl->field_fmt)
849 return;
850 uiout->impl->field_fmt (uiout, fldno, width, align, fldname, format, args);
851}
852
853void
854uo_spaces (struct ui_out *uiout, int numspaces)
855{
856 if (!uiout->impl->spaces)
857 return;
858 uiout->impl->spaces (uiout, numspaces);
859}
860
861void
88379baf
AC
862uo_text (struct ui_out *uiout,
863 const char *string)
8b93c638
JM
864{
865 if (!uiout->impl->text)
866 return;
867 uiout->impl->text (uiout, string);
868}
869
870void
88379baf
AC
871uo_message (struct ui_out *uiout, int verbosity,
872 const char *format,
873 va_list args)
8b93c638
JM
874{
875 if (!uiout->impl->message)
876 return;
877 uiout->impl->message (uiout, verbosity, format, args);
878}
879
880void
881uo_wrap_hint (struct ui_out *uiout, char *identstring)
882{
883 if (!uiout->impl->wrap_hint)
884 return;
885 uiout->impl->wrap_hint (uiout, identstring);
886}
887
888void
889uo_flush (struct ui_out *uiout)
890{
891 if (!uiout->impl->flush)
892 return;
893 uiout->impl->flush (uiout);
894}
895
0fac0b41
DJ
896int
897uo_redirect (struct ui_out *uiout, struct ui_file *outstream)
898{
899 if (!uiout->impl->redirect)
900 return -1;
901 uiout->impl->redirect (uiout, outstream);
902 return 0;
903}
904
8b93c638
JM
905/* local functions */
906
581e13c1 907/* List of column headers manipulation routines. */
8b93c638
JM
908
909static void
fba45db2 910clear_header_list (struct ui_out *uiout)
8b93c638 911{
bafdd3b3 912 while (uiout->table.header_first != NULL)
8b93c638 913 {
bafdd3b3
AC
914 uiout->table.header_next = uiout->table.header_first;
915 uiout->table.header_first = uiout->table.header_first->next;
71bdabee
KS
916 xfree (uiout->table.header_next->colhdr);
917 xfree (uiout->table.header_next->col_name);
bafdd3b3 918 xfree (uiout->table.header_next);
8b93c638 919 }
bafdd3b3
AC
920 gdb_assert (uiout->table.header_first == NULL);
921 uiout->table.header_last = NULL;
922 uiout->table.header_next = NULL;
8b93c638
JM
923}
924
925static void
926append_header_to_list (struct ui_out *uiout,
927 int width,
928 int alignment,
b25959ec 929 const char *col_name,
88379baf 930 const char *colhdr)
8b93c638
JM
931{
932 struct ui_out_hdr *temphdr;
933
934 temphdr = XMALLOC (struct ui_out_hdr);
935 temphdr->width = width;
936 temphdr->alignment = alignment;
44db85f8
MS
937 /* We have to copy the column title as the original may be an
938 automatic. */
8b93c638 939 if (colhdr != NULL)
b25959ec
AC
940 temphdr->colhdr = xstrdup (colhdr);
941 else
942 temphdr->colhdr = NULL;
44db85f8 943
b25959ec 944 if (col_name != NULL)
44db85f8
MS
945 temphdr->col_name = xstrdup (col_name);
946 else if (colhdr != NULL)
b25959ec
AC
947 temphdr->col_name = xstrdup (colhdr);
948 else
44db85f8
MS
949 temphdr->col_name = NULL;
950
8b93c638 951 temphdr->next = NULL;
bafdd3b3 952 if (uiout->table.header_first == NULL)
8b93c638
JM
953 {
954 temphdr->colno = 1;
bafdd3b3
AC
955 uiout->table.header_first = temphdr;
956 uiout->table.header_last = temphdr;
8b93c638
JM
957 }
958 else
959 {
bafdd3b3
AC
960 temphdr->colno = uiout->table.header_last->colno + 1;
961 uiout->table.header_last->next = temphdr;
962 uiout->table.header_last = temphdr;
8b93c638 963 }
bafdd3b3 964 uiout->table.header_next = uiout->table.header_last;
8b93c638
JM
965}
966
7a9dd1b2 967/* Extract the format information for the NEXT header and advance
bafdd3b3 968 the header pointer. Return 0 if there was no next header. */
8b93c638
JM
969
970static int
bafdd3b3 971get_next_header (struct ui_out *uiout,
8b93c638
JM
972 int *colno,
973 int *width,
974 int *alignment,
975 char **colhdr)
976{
bafdd3b3
AC
977 /* There may be no headers at all or we may have used all columns. */
978 if (uiout->table.header_next == NULL)
8b93c638 979 return 0;
bafdd3b3
AC
980 *colno = uiout->table.header_next->colno;
981 *width = uiout->table.header_next->width;
982 *alignment = uiout->table.header_next->alignment;
983 *colhdr = uiout->table.header_next->colhdr;
984 /* Advance the header pointer to the next entry. */
985 uiout->table.header_next = uiout->table.header_next->next;
8b93c638
JM
986 return 1;
987}
988
a6c47c14
AC
989
990/* Verify that the field/tuple/list is correctly positioned. Return
991 the field number and corresponding alignment (if
992 available/applicable). */
8b93c638
JM
993
994static void
a6c47c14 995verify_field (struct ui_out *uiout, int *fldno, int *width, int *align)
8b93c638 996{
a6c47c14
AC
997 struct ui_out_level *current = current_level (uiout);
998 char *text;
999
bafdd3b3 1000 if (uiout->table.flag)
8b93c638 1001 {
bafdd3b3 1002 if (!uiout->table.body_flag)
8e65ff28 1003 internal_error (__FILE__, __LINE__,
e2e0b3e5
AC
1004 _("table_body missing; table fields must be \
1005specified after table_body and inside a list."));
a6c47c14
AC
1006 /* NOTE: cagney/2001-12-08: There was a check here to ensure
1007 that this code was only executed when uiout->level was
1008 greater than zero. That no longer applies - this code is run
1009 before each table row tuple is started and at that point the
1010 level is zero. */
8b93c638 1011 }
8b93c638 1012
a6c47c14 1013 current->field_count += 1;
8b93c638 1014
a6c47c14
AC
1015 if (uiout->table.body_flag
1016 && uiout->table.entry_level == uiout->level
1017 && get_next_header (uiout, fldno, width, align, &text))
8b93c638 1018 {
a6c47c14 1019 if (*fldno != current->field_count)
8e65ff28 1020 internal_error (__FILE__, __LINE__,
e2e0b3e5 1021 _("ui-out internal error in handling headers."));
8b93c638
JM
1022 }
1023 else
1024 {
1025 *width = 0;
1026 *align = ui_noalign;
a6c47c14 1027 *fldno = current->field_count;
8b93c638
JM
1028 }
1029}
1030
a6c47c14 1031
581e13c1 1032/* Access to ui-out members data. */
8b93c638 1033
0a8fce9a 1034void *
8b93c638
JM
1035ui_out_data (struct ui_out *uiout)
1036{
1037 return uiout->data;
1038}
1039
170b53b2
UW
1040/* Access table field parameters. */
1041int
1042ui_out_query_field (struct ui_out *uiout, int colno,
1043 int *width, int *alignment, char **col_name)
1044{
1045 struct ui_out_hdr *hdr;
1046
1047 if (!uiout->table.flag)
1048 return 0;
1049
1050 for (hdr = uiout->table.header_first; hdr; hdr = hdr->next)
1051 if (hdr->colno == colno)
1052 {
1053 *width = hdr->width;
1054 *alignment = hdr->alignment;
1055 *col_name = hdr->col_name;
1056 return 1;
1057 }
1058
1059 return 0;
1060}
1061
581e13c1 1062/* Initalize private members at startup. */
8b93c638
JM
1063
1064struct ui_out *
0a8fce9a 1065ui_out_new (struct ui_out_impl *impl, void *data,
8b93c638
JM
1066 int flags)
1067{
1068 struct ui_out *uiout = XMALLOC (struct ui_out);
5d502164 1069
8b93c638
JM
1070 uiout->data = data;
1071 uiout->impl = impl;
1072 uiout->flags = flags;
bafdd3b3
AC
1073 uiout->table.flag = 0;
1074 uiout->table.body_flag = 0;
80f49b30
AC
1075 uiout->level = 0;
1076 memset (uiout->levels, 0, sizeof (uiout->levels));
bafdd3b3
AC
1077 uiout->table.header_first = NULL;
1078 uiout->table.header_last = NULL;
1079 uiout->table.header_next = NULL;
8b93c638
JM
1080 return uiout;
1081}
1082
581e13c1 1083/* Standard gdb initialization hook. */
8b93c638
JM
1084
1085void
fba45db2 1086_initialize_ui_out (void)
8b93c638
JM
1087{
1088 /* nothing needs to be done */
1089}
This page took 2.311699 seconds and 4 git commands to generate.