* s390-tdep.c (s390_gdbarch_init): Set default long double
[deliverable/binutils-gdb.git] / gdb / ui-out.c
... / ...
CommitLineData
1/* Output generating routines for GDB.
2
3 Copyright (C) 1999, 2000, 2001, 2002, 2004, 2005, 2007, 2008
4 Free Software Foundation, Inc.
5
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
13 the Free Software Foundation; either version 3 of the License, or
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
22 along with this program. If not, see <http://www.gnu.org/licenses/>. */
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"
29#include "gdb_assert.h"
30
31/* table header structures */
32
33struct ui_out_hdr
34 {
35 int colno;
36 int width;
37 int alignment;
38 char *col_name;
39 char *colhdr;
40 struct ui_out_hdr *next;
41 };
42
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
47enum { MAX_UI_OUT_LEVELS = 6 };
48
49struct ui_out_level
50 {
51 /* Count each field; the first element is for non-list fields */
52 int field_count;
53 /* The type of this level. */
54 enum ui_out_type type;
55 };
56
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
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
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
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
105 /* Sub structure tracking the ui-out depth. */
106 int level;
107 struct ui_out_level levels[MAX_UI_OUT_LEVELS];
108
109 /* A table, if any. At present only a single table is supported. */
110 struct ui_out_table table;
111 };
112
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,
123 enum ui_out_type type,
124 const char *id)
125{
126 struct ui_out_level *current;
127 /* We had better not overflow the buffer. */
128 uiout->level++;
129 gdb_assert (uiout->level >= 0 && uiout->level < MAX_UI_OUT_LEVELS);
130 current = current_level (uiout);
131 current->field_count = 0;
132 current->type = type;
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
139pop_level (struct ui_out *uiout,
140 enum ui_out_type type)
141{
142 /* We had better not underflow the buffer. */
143 gdb_assert (uiout->level > 0 && uiout->level < MAX_UI_OUT_LEVELS);
144 gdb_assert (current_level (uiout)->type == type);
145 uiout->level--;
146 return uiout->level + 1;
147}
148
149
150/* These are the default implementation functions */
151
152static void default_table_begin (struct ui_out *uiout, int nbrofcols,
153 int nr_rows, const char *tblid);
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,
157 enum ui_align alig, const char *col_name,
158 const char *colhdr);
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);
165static void default_field_int (struct ui_out *uiout, int fldno, int width,
166 enum ui_align alig,
167 const char *fldname,
168 int value);
169static void default_field_skip (struct ui_out *uiout, int fldno, int width,
170 enum ui_align alig,
171 const char *fldname);
172static void default_field_string (struct ui_out *uiout, int fldno, int width,
173 enum ui_align align,
174 const char *fldname,
175 const char *string);
176static void default_field_fmt (struct ui_out *uiout, int fldno,
177 int width, enum ui_align align,
178 const char *fldname,
179 const char *format,
180 va_list args) ATTR_FORMAT (printf, 6, 0);
181static void default_spaces (struct ui_out *uiout, int numspaces);
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,
185 va_list args) ATTR_FORMAT (printf, 3, 0);
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,
197 default_begin,
198 default_end,
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,
207 default_flush,
208 NULL,
209 0, /* Does not need MI hacks. */
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
228static void uo_table_begin (struct ui_out *uiout, int nbrofcols,
229 int nr_rows, const char *tblid);
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,
233 enum ui_align align, const char *col_name,
234 const char *colhdr);
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);
241static void uo_field_int (struct ui_out *uiout, int fldno, int width,
242 enum ui_align align, const char *fldname, int value);
243static void uo_field_skip (struct ui_out *uiout, int fldno, int width,
244 enum ui_align align, const char *fldname);
245static void uo_field_string (struct ui_out *uiout, int fldno, int width,
246 enum ui_align align, const char *fldname,
247 const char *string);
248static void uo_field_fmt (struct ui_out *uiout, int fldno, int width,
249 enum ui_align align, const char *fldname,
250 const char *format, va_list args)
251 ATTR_FORMAT (printf, 6, 0);
252static void uo_spaces (struct ui_out *uiout, int numspaces);
253static void uo_text (struct ui_out *uiout, const char *string);
254static void uo_message (struct ui_out *uiout, int verbosity,
255 const char *format, va_list args)
256 ATTR_FORMAT (printf, 3, 0);
257static void uo_wrap_hint (struct ui_out *uiout, char *identstring);
258static void uo_flush (struct ui_out *uiout);
259static int uo_redirect (struct ui_out *uiout, struct ui_file *outstream);
260
261/* Prototypes for local functions */
262
263extern void _initialize_ui_out (void);
264static void append_header_to_list (struct ui_out *uiout, int width,
265 int alignment, const char *col_name,
266 const char *colhdr);
267static int get_next_header (struct ui_out *uiout, int *colno, int *width,
268 int *alignment, char **colhdr);
269static void clear_header_list (struct ui_out *uiout);
270static void verify_field (struct ui_out *uiout, int *fldno, int *width,
271 int *align);
272
273/* exported functions (ui_out API) */
274
275/* Mark beginning of a table */
276
277static void
278ui_out_table_begin (struct ui_out *uiout, int nbrofcols,
279 int nr_rows,
280 const char *tblid)
281{
282 if (uiout->table.flag)
283 internal_error (__FILE__, __LINE__,
284 _("tables cannot be nested; table_begin found before \
285previous table_end."));
286
287 uiout->table.flag = 1;
288 uiout->table.body_flag = 0;
289 uiout->table.entry_level = uiout->level + 1;
290 uiout->table.columns = nbrofcols;
291 if (tblid != NULL)
292 uiout->table.id = xstrdup (tblid);
293 else
294 uiout->table.id = NULL;
295 clear_header_list (uiout);
296
297 uo_table_begin (uiout, nbrofcols, nr_rows, uiout->table.id);
298}
299
300void
301ui_out_table_body (struct ui_out *uiout)
302{
303 if (!uiout->table.flag)
304 internal_error (__FILE__, __LINE__,
305 _("table_body outside a table is not valid; it must be \
306after a table_begin and before a table_end."));
307 if (uiout->table.body_flag)
308 internal_error (__FILE__, __LINE__,
309 _("extra table_body call not allowed; there must be \
310only one table_body after a table_begin and before a table_end."));
311 if (uiout->table.header_next->colno != uiout->table.columns)
312 internal_error (__FILE__, __LINE__,
313 _("number of headers differ from number of table \
314columns."));
315
316 uiout->table.body_flag = 1;
317 uiout->table.header_next = uiout->table.header_first;
318
319 uo_table_body (uiout);
320}
321
322static void
323ui_out_table_end (struct ui_out *uiout)
324{
325 if (!uiout->table.flag)
326 internal_error (__FILE__, __LINE__,
327 _("misplaced table_end or missing table_begin."));
328
329 uiout->table.entry_level = 0;
330 uiout->table.body_flag = 0;
331 uiout->table.flag = 0;
332
333 uo_table_end (uiout);
334
335 if (uiout->table.id)
336 xfree (uiout->table.id);
337 clear_header_list (uiout);
338}
339
340void
341ui_out_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
342 const char *col_name,
343 const char *colhdr)
344{
345 if (!uiout->table.flag || uiout->table.body_flag)
346 internal_error (__FILE__, __LINE__,
347 _("table header must be specified after table_begin \
348and before table_body."));
349
350 append_header_to_list (uiout, width, alignment, col_name, colhdr);
351
352 uo_table_header (uiout, width, alignment, col_name, colhdr);
353}
354
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
371void
372ui_out_begin (struct ui_out *uiout,
373 enum ui_out_type type,
374 const char *id)
375{
376 int new_level;
377 if (uiout->table.flag && !uiout->table.body_flag)
378 internal_error (__FILE__, __LINE__,
379 _("table header or table_body expected; lists must be \
380specified after table_body."));
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
396 new_level = push_level (uiout, type, id);
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)
402 uiout->table.header_next = uiout->table.header_first;
403
404 uo_begin (uiout, type, new_level, id);
405}
406
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);
413}
414
415struct ui_out_end_cleanup_data
416{
417 struct ui_out *uiout;
418 enum ui_out_type type;
419};
420
421static void
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
440struct cleanup *
441make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
442 const char *id)
443{
444 ui_out_begin (uiout, ui_out_type_tuple, id);
445 return make_cleanup_ui_out_end (uiout, ui_out_type_tuple);
446}
447
448struct cleanup *
449make_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
450 const char *id)
451{
452 ui_out_begin (uiout, ui_out_type_list, id);
453 return make_cleanup_ui_out_end (uiout, ui_out_type_list);
454}
455
456void
457ui_out_field_int (struct ui_out *uiout,
458 const char *fldname,
459 int value)
460{
461 int fldno;
462 int width;
463 int align;
464 struct ui_out_level *current = current_level (uiout);
465
466 verify_field (uiout, &fldno, &width, &align);
467
468 uo_field_int (uiout, fldno, width, align, fldname, value);
469}
470
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
488void
489ui_out_field_core_addr (struct ui_out *uiout,
490 const char *fldname,
491 CORE_ADDR address)
492{
493 char addstr[20];
494 int addr_bit = gdbarch_addr_bit (current_gdbarch);
495
496 if (addr_bit < (sizeof (CORE_ADDR) * HOST_CHAR_BIT))
497 address &= ((CORE_ADDR) 1 << addr_bit) - 1;
498
499 /* FIXME: cagney/2002-05-03: Need local_address_string() function
500 that returns the language localized string formatted to a width
501 based on gdbarch_addr_bit. */
502 if (addr_bit <= 32)
503 strcpy (addstr, hex_string_custom (address, 8));
504 else
505 strcpy (addstr, hex_string_custom (address, 16));
506
507 ui_out_field_string (uiout, fldname, addstr);
508}
509
510void
511ui_out_field_stream (struct ui_out *uiout,
512 const char *fldname,
513 struct ui_stream *buf)
514{
515 long length;
516 char *buffer = ui_file_xstrdup (buf->stream, &length);
517 struct cleanup *old_cleanup = make_cleanup (xfree, buffer);
518 if (length > 0)
519 ui_out_field_string (uiout, fldname, buffer);
520 else
521 ui_out_field_skip (uiout, fldname);
522 ui_file_rewind (buf->stream);
523 do_cleanups (old_cleanup);
524}
525
526/* used to ommit a field */
527
528void
529ui_out_field_skip (struct ui_out *uiout,
530 const char *fldname)
531{
532 int fldno;
533 int width;
534 int align;
535
536 verify_field (uiout, &fldno, &width, &align);
537
538 uo_field_skip (uiout, fldno, width, align, fldname);
539}
540
541void
542ui_out_field_string (struct ui_out *uiout,
543 const char *fldname,
544 const char *string)
545{
546 int fldno;
547 int width;
548 int align;
549
550 verify_field (uiout, &fldno, &width, &align);
551
552 uo_field_string (uiout, fldno, width, align, fldname, string);
553}
554
555/* VARARGS */
556void
557ui_out_field_fmt (struct ui_out *uiout,
558 const char *fldname,
559 const char *format, ...)
560{
561 va_list args;
562 int fldno;
563 int width;
564 int align;
565
566 /* will not align, but has to call anyway */
567 verify_field (uiout, &fldno, &width, &align);
568
569 va_start (args, format);
570
571 uo_field_fmt (uiout, fldno, width, align, fldname, format, args);
572
573 va_end (args);
574}
575
576void
577ui_out_spaces (struct ui_out *uiout, int numspaces)
578{
579 uo_spaces (uiout, numspaces);
580}
581
582void
583ui_out_text (struct ui_out *uiout,
584 const char *string)
585{
586 uo_text (uiout, string);
587}
588
589void
590ui_out_message (struct ui_out *uiout, int verbosity,
591 const char *format,...)
592{
593 va_list args;
594
595 va_start (args, format);
596
597 uo_message (uiout, verbosity, format, args);
598
599 va_end (args);
600}
601
602struct ui_stream *
603ui_out_stream_new (struct ui_out *uiout)
604{
605 struct ui_stream *tempbuf;
606
607 tempbuf = XMALLOC (struct ui_stream);
608 tempbuf->uiout = uiout;
609 tempbuf->stream = mem_fileopen ();
610 return tempbuf;
611}
612
613void
614ui_out_stream_delete (struct ui_stream *buf)
615{
616 ui_file_delete (buf->stream);
617 xfree (buf);
618}
619
620static void
621do_stream_delete (void *buf)
622{
623 ui_out_stream_delete (buf);
624}
625
626struct cleanup *
627make_cleanup_ui_out_stream_delete (struct ui_stream *buf)
628{
629 return make_cleanup (do_stream_delete, buf);
630}
631
632
633void
634ui_out_wrap_hint (struct ui_out *uiout, char *identstring)
635{
636 uo_wrap_hint (uiout, identstring);
637}
638
639void
640ui_out_flush (struct ui_out *uiout)
641{
642 uo_flush (uiout);
643}
644
645int
646ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream)
647{
648 return uo_redirect (uiout, outstream);
649}
650
651/* set the flags specified by the mask given */
652int
653ui_out_set_flags (struct ui_out *uiout, int mask)
654{
655 int oldflags = uiout->flags;
656
657 uiout->flags |= mask;
658
659 return oldflags;
660}
661
662/* clear the flags specified by the mask given */
663int
664ui_out_clear_flags (struct ui_out *uiout, int mask)
665{
666 int oldflags = uiout->flags;
667
668 uiout->flags &= ~mask;
669
670 return oldflags;
671}
672
673/* test the flags against the mask given */
674int
675ui_out_test_flags (struct ui_out *uiout, int mask)
676{
677 return (uiout->flags & mask);
678}
679
680/* obtain the current verbosity level (as stablished by the
681 'set verbositylevel' command */
682
683int
684ui_out_get_verblvl (struct ui_out *uiout)
685{
686 /* FIXME: not implemented yet */
687 return 0;
688}
689
690#if 0
691void
692ui_out_result_begin (struct ui_out *uiout, char *class)
693{
694}
695
696void
697ui_out_result_end (struct ui_out *uiout)
698{
699}
700
701void
702ui_out_info_begin (struct ui_out *uiout, char *class)
703{
704}
705
706void
707ui_out_info_end (struct ui_out *uiout)
708{
709}
710
711void
712ui_out_notify_begin (struct ui_out *uiout, char *class)
713{
714}
715
716void
717ui_out_notify_end (struct ui_out *uiout)
718{
719}
720
721void
722ui_out_error_begin (struct ui_out *uiout, char *class)
723{
724}
725
726void
727ui_out_error_end (struct ui_out *uiout)
728{
729}
730#endif
731
732#if 0
733void
734gdb_error (ui_out * uiout, int severity, char *format,...)
735{
736 va_list args;
737}
738
739void
740gdb_query (struct ui_out *uiout, int qflags, char *qprompt)
741{
742}
743#endif
744
745int
746ui_out_is_mi_like_p (struct ui_out *uiout)
747{
748 return uiout->impl->is_mi_like_p;
749}
750
751/* default gdb-out hook functions */
752
753static void
754default_table_begin (struct ui_out *uiout, int nbrofcols,
755 int nr_rows,
756 const char *tblid)
757{
758}
759
760static void
761default_table_body (struct ui_out *uiout)
762{
763}
764
765static void
766default_table_end (struct ui_out *uiout)
767{
768}
769
770static void
771default_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
772 const char *col_name,
773 const char *colhdr)
774{
775}
776
777static void
778default_begin (struct ui_out *uiout,
779 enum ui_out_type type,
780 int level,
781 const char *id)
782{
783}
784
785static void
786default_end (struct ui_out *uiout,
787 enum ui_out_type type,
788 int level)
789{
790}
791
792static void
793default_field_int (struct ui_out *uiout, int fldno, int width,
794 enum ui_align align,
795 const char *fldname, int value)
796{
797}
798
799static void
800default_field_skip (struct ui_out *uiout, int fldno, int width,
801 enum ui_align align, const char *fldname)
802{
803}
804
805static void
806default_field_string (struct ui_out *uiout,
807 int fldno,
808 int width,
809 enum ui_align align,
810 const char *fldname,
811 const char *string)
812{
813}
814
815static void
816default_field_fmt (struct ui_out *uiout, int fldno, int width,
817 enum ui_align align,
818 const char *fldname,
819 const char *format,
820 va_list args)
821{
822}
823
824static void
825default_spaces (struct ui_out *uiout, int numspaces)
826{
827}
828
829static void
830default_text (struct ui_out *uiout, const char *string)
831{
832}
833
834static void
835default_message (struct ui_out *uiout, int verbosity,
836 const char *format,
837 va_list args)
838{
839}
840
841static void
842default_wrap_hint (struct ui_out *uiout, char *identstring)
843{
844}
845
846static void
847default_flush (struct ui_out *uiout)
848{
849}
850
851/* Interface to the implementation functions */
852
853void
854uo_table_begin (struct ui_out *uiout, int nbrofcols,
855 int nr_rows,
856 const char *tblid)
857{
858 if (!uiout->impl->table_begin)
859 return;
860 uiout->impl->table_begin (uiout, nbrofcols, nr_rows, tblid);
861}
862
863void
864uo_table_body (struct ui_out *uiout)
865{
866 if (!uiout->impl->table_body)
867 return;
868 uiout->impl->table_body (uiout);
869}
870
871void
872uo_table_end (struct ui_out *uiout)
873{
874 if (!uiout->impl->table_end)
875 return;
876 uiout->impl->table_end (uiout);
877}
878
879void
880uo_table_header (struct ui_out *uiout, int width, enum ui_align align,
881 const char *col_name,
882 const char *colhdr)
883{
884 if (!uiout->impl->table_header)
885 return;
886 uiout->impl->table_header (uiout, width, align, col_name, colhdr);
887}
888
889void
890uo_begin (struct ui_out *uiout,
891 enum ui_out_type type,
892 int level,
893 const char *id)
894{
895 if (uiout->impl->begin == NULL)
896 return;
897 uiout->impl->begin (uiout, type, level, id);
898}
899
900void
901uo_end (struct ui_out *uiout,
902 enum ui_out_type type,
903 int level)
904{
905 if (uiout->impl->end == NULL)
906 return;
907 uiout->impl->end (uiout, type, level);
908}
909
910void
911uo_field_int (struct ui_out *uiout, int fldno, int width, enum ui_align align,
912 const char *fldname,
913 int value)
914{
915 if (!uiout->impl->field_int)
916 return;
917 uiout->impl->field_int (uiout, fldno, width, align, fldname, value);
918}
919
920void
921uo_field_skip (struct ui_out *uiout, int fldno, int width, enum ui_align align,
922 const char *fldname)
923{
924 if (!uiout->impl->field_skip)
925 return;
926 uiout->impl->field_skip (uiout, fldno, width, align, fldname);
927}
928
929void
930uo_field_string (struct ui_out *uiout, int fldno, int width,
931 enum ui_align align,
932 const char *fldname,
933 const char *string)
934{
935 if (!uiout->impl->field_string)
936 return;
937 uiout->impl->field_string (uiout, fldno, width, align, fldname, string);
938}
939
940void
941uo_field_fmt (struct ui_out *uiout, int fldno, int width, enum ui_align align,
942 const char *fldname,
943 const char *format,
944 va_list args)
945{
946 if (!uiout->impl->field_fmt)
947 return;
948 uiout->impl->field_fmt (uiout, fldno, width, align, fldname, format, args);
949}
950
951void
952uo_spaces (struct ui_out *uiout, int numspaces)
953{
954 if (!uiout->impl->spaces)
955 return;
956 uiout->impl->spaces (uiout, numspaces);
957}
958
959void
960uo_text (struct ui_out *uiout,
961 const char *string)
962{
963 if (!uiout->impl->text)
964 return;
965 uiout->impl->text (uiout, string);
966}
967
968void
969uo_message (struct ui_out *uiout, int verbosity,
970 const char *format,
971 va_list args)
972{
973 if (!uiout->impl->message)
974 return;
975 uiout->impl->message (uiout, verbosity, format, args);
976}
977
978void
979uo_wrap_hint (struct ui_out *uiout, char *identstring)
980{
981 if (!uiout->impl->wrap_hint)
982 return;
983 uiout->impl->wrap_hint (uiout, identstring);
984}
985
986void
987uo_flush (struct ui_out *uiout)
988{
989 if (!uiout->impl->flush)
990 return;
991 uiout->impl->flush (uiout);
992}
993
994int
995uo_redirect (struct ui_out *uiout, struct ui_file *outstream)
996{
997 if (!uiout->impl->redirect)
998 return -1;
999 uiout->impl->redirect (uiout, outstream);
1000 return 0;
1001}
1002
1003/* local functions */
1004
1005/* list of column headers manipulation routines */
1006
1007static void
1008clear_header_list (struct ui_out *uiout)
1009{
1010 while (uiout->table.header_first != NULL)
1011 {
1012 uiout->table.header_next = uiout->table.header_first;
1013 uiout->table.header_first = uiout->table.header_first->next;
1014 if (uiout->table.header_next->colhdr != NULL)
1015 xfree (uiout->table.header_next->colhdr);
1016 xfree (uiout->table.header_next);
1017 }
1018 gdb_assert (uiout->table.header_first == NULL);
1019 uiout->table.header_last = NULL;
1020 uiout->table.header_next = NULL;
1021}
1022
1023static void
1024append_header_to_list (struct ui_out *uiout,
1025 int width,
1026 int alignment,
1027 const char *col_name,
1028 const char *colhdr)
1029{
1030 struct ui_out_hdr *temphdr;
1031
1032 temphdr = XMALLOC (struct ui_out_hdr);
1033 temphdr->width = width;
1034 temphdr->alignment = alignment;
1035 /* We have to copy the column title as the original may be an
1036 automatic. */
1037 if (colhdr != NULL)
1038 temphdr->colhdr = xstrdup (colhdr);
1039 else
1040 temphdr->colhdr = NULL;
1041
1042 if (col_name != NULL)
1043 temphdr->col_name = xstrdup (col_name);
1044 else if (colhdr != NULL)
1045 temphdr->col_name = xstrdup (colhdr);
1046 else
1047 temphdr->col_name = NULL;
1048
1049 temphdr->next = NULL;
1050 if (uiout->table.header_first == NULL)
1051 {
1052 temphdr->colno = 1;
1053 uiout->table.header_first = temphdr;
1054 uiout->table.header_last = temphdr;
1055 }
1056 else
1057 {
1058 temphdr->colno = uiout->table.header_last->colno + 1;
1059 uiout->table.header_last->next = temphdr;
1060 uiout->table.header_last = temphdr;
1061 }
1062 uiout->table.header_next = uiout->table.header_last;
1063}
1064
1065/* Extract the format information for the NEXT header and and advance
1066 the header pointer. Return 0 if there was no next header. */
1067
1068static int
1069get_next_header (struct ui_out *uiout,
1070 int *colno,
1071 int *width,
1072 int *alignment,
1073 char **colhdr)
1074{
1075 /* There may be no headers at all or we may have used all columns. */
1076 if (uiout->table.header_next == NULL)
1077 return 0;
1078 *colno = uiout->table.header_next->colno;
1079 *width = uiout->table.header_next->width;
1080 *alignment = uiout->table.header_next->alignment;
1081 *colhdr = uiout->table.header_next->colhdr;
1082 /* Advance the header pointer to the next entry. */
1083 uiout->table.header_next = uiout->table.header_next->next;
1084 return 1;
1085}
1086
1087
1088/* Verify that the field/tuple/list is correctly positioned. Return
1089 the field number and corresponding alignment (if
1090 available/applicable). */
1091
1092static void
1093verify_field (struct ui_out *uiout, int *fldno, int *width, int *align)
1094{
1095 struct ui_out_level *current = current_level (uiout);
1096 char *text;
1097
1098 if (uiout->table.flag)
1099 {
1100 if (!uiout->table.body_flag)
1101 internal_error (__FILE__, __LINE__,
1102 _("table_body missing; table fields must be \
1103specified after table_body and inside a list."));
1104 /* NOTE: cagney/2001-12-08: There was a check here to ensure
1105 that this code was only executed when uiout->level was
1106 greater than zero. That no longer applies - this code is run
1107 before each table row tuple is started and at that point the
1108 level is zero. */
1109 }
1110
1111 current->field_count += 1;
1112
1113 if (uiout->table.body_flag
1114 && uiout->table.entry_level == uiout->level
1115 && get_next_header (uiout, fldno, width, align, &text))
1116 {
1117 if (*fldno != current->field_count)
1118 internal_error (__FILE__, __LINE__,
1119 _("ui-out internal error in handling headers."));
1120 }
1121 else
1122 {
1123 *width = 0;
1124 *align = ui_noalign;
1125 *fldno = current->field_count;
1126 }
1127}
1128
1129
1130/* access to ui_out format private members */
1131
1132void
1133ui_out_get_field_separator (struct ui_out *uiout)
1134{
1135}
1136
1137/* Access to ui-out members data */
1138
1139struct ui_out_data *
1140ui_out_data (struct ui_out *uiout)
1141{
1142 return uiout->data;
1143}
1144
1145/* initalize private members at startup */
1146
1147struct ui_out *
1148ui_out_new (struct ui_out_impl *impl,
1149 struct ui_out_data *data,
1150 int flags)
1151{
1152 struct ui_out *uiout = XMALLOC (struct ui_out);
1153 uiout->data = data;
1154 uiout->impl = impl;
1155 uiout->flags = flags;
1156 uiout->table.flag = 0;
1157 uiout->table.body_flag = 0;
1158 uiout->level = 0;
1159 memset (uiout->levels, 0, sizeof (uiout->levels));
1160 uiout->table.header_first = NULL;
1161 uiout->table.header_last = NULL;
1162 uiout->table.header_next = NULL;
1163 return uiout;
1164}
1165
1166/* standard gdb initialization hook */
1167
1168void
1169_initialize_ui_out (void)
1170{
1171 /* nothing needs to be done */
1172}
This page took 0.025748 seconds and 4 git commands to generate.