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