198944Sobrien/* Output generating routines for GDB.
2130803Smarcel
3130803Smarcel   Copyright 1999, 2000, 2001, 2002, 2004 Free Software Foundation, Inc.
4130803Smarcel
598944Sobrien   Contributed by Cygnus Solutions.
698944Sobrien   Written by Fernando Nasser for Cygnus.
798944Sobrien
898944Sobrien   This file is part of GDB.
998944Sobrien
1098944Sobrien   This program is free software; you can redistribute it and/or modify
1198944Sobrien   it under the terms of the GNU General Public License as published by
1298944Sobrien   the Free Software Foundation; either version 2 of the License, or
1398944Sobrien   (at your option) any later version.
1498944Sobrien
1598944Sobrien   This program is distributed in the hope that it will be useful,
1698944Sobrien   but WITHOUT ANY WARRANTY; without even the implied warranty of
1798944Sobrien   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
1898944Sobrien   GNU General Public License for more details.
1998944Sobrien
2098944Sobrien   You should have received a copy of the GNU General Public License
2198944Sobrien   along with this program; if not, write to the Free Software
2298944Sobrien   Foundation, Inc., 59 Temple Place - Suite 330,
2398944Sobrien   Boston, MA 02111-1307, USA.  */
2498944Sobrien
2598944Sobrien#include "defs.h"
2698944Sobrien#include "gdb_string.h"
2798944Sobrien#include "expression.h"		/* For language.h */
2898944Sobrien#include "language.h"
2998944Sobrien#include "ui-out.h"
3098944Sobrien#include "gdb_assert.h"
3198944Sobrien
3298944Sobrien/* table header structures */
3398944Sobrien
3498944Sobrienstruct ui_out_hdr
3598944Sobrien  {
3698944Sobrien    int colno;
3798944Sobrien    int width;
3898944Sobrien    int alignment;
3998944Sobrien    char *col_name;
4098944Sobrien    char *colhdr;
4198944Sobrien    struct ui_out_hdr *next;
4298944Sobrien  };
4398944Sobrien
4498944Sobrien/* Maintain a stack so that the info applicable to the inner most list
4598944Sobrien   is always available.  Stack/nested level 0 is reserved for the
4698944Sobrien   top-level result. */
4798944Sobrien
48130803Smarcelenum { MAX_UI_OUT_LEVELS = 6 };
4998944Sobrien
5098944Sobrienstruct ui_out_level
5198944Sobrien  {
5298944Sobrien    /* Count each field; the first element is for non-list fields */
5398944Sobrien    int field_count;
5498944Sobrien    /* The type of this level. */
5598944Sobrien    enum ui_out_type type;
5698944Sobrien  };
5798944Sobrien
5898944Sobrien/* Tables are special.  Maintain a separate structure that tracks
5998944Sobrien   their state.  At present an output can only contain a single table
6098944Sobrien   but that restriction might eventually be lifted.  */
6198944Sobrien
6298944Sobrienstruct ui_out_table
6398944Sobrien{
6498944Sobrien  /* If on, a table is being generated.  */
6598944Sobrien  int flag;
6698944Sobrien
6798944Sobrien  /* If on, the body of a table is being generated.  If off, the table
6898944Sobrien     header is being generated.  */
6998944Sobrien  int body_flag;
7098944Sobrien
7198944Sobrien  /* The level at which each entry of the table is to be found.  A row
7298944Sobrien     (a tuple) is made up of entries.  Consequently ENTRY_LEVEL is one
7398944Sobrien     above that of the table.  */
7498944Sobrien  int entry_level;
7598944Sobrien
7698944Sobrien  /* Number of table columns (as specified in the table_begin call).  */
7798944Sobrien  int columns;
7898944Sobrien
7998944Sobrien  /* String identifying the table (as specified in the table_begin
8098944Sobrien     call).  */
8198944Sobrien  char *id;
8298944Sobrien
8398944Sobrien  /* Points to the first table header (if any).  */
8498944Sobrien  struct ui_out_hdr *header_first;
8598944Sobrien
8698944Sobrien  /* Points to the last table header (if any).  */
8798944Sobrien  struct ui_out_hdr *header_last;
8898944Sobrien
8998944Sobrien  /* Points to header of NEXT column to format.  */
9098944Sobrien  struct ui_out_hdr *header_next;
9198944Sobrien
9298944Sobrien};
9398944Sobrien
9498944Sobrien
9598944Sobrien/* The ui_out structure */
9698944Sobrien/* Any change here requires a corresponding one in the initialization
9798944Sobrien   of the default uiout, which is statically initialized */
9898944Sobrien
9998944Sobrienstruct ui_out
10098944Sobrien  {
10198944Sobrien    int flags;
10298944Sobrien    /* specific implementation of ui-out */
10398944Sobrien    struct ui_out_impl *impl;
10498944Sobrien    struct ui_out_data *data;
10598944Sobrien
10698944Sobrien    /* Sub structure tracking the ui-out depth.  */
10798944Sobrien    int level;
10898944Sobrien    struct ui_out_level levels[MAX_UI_OUT_LEVELS];
10998944Sobrien
11098944Sobrien    /* A table, if any.  At present only a single table is supported.  */
11198944Sobrien    struct ui_out_table table;
11298944Sobrien  };
11398944Sobrien
11498944Sobrien/* The current (inner most) level. */
11598944Sobrienstatic struct ui_out_level *
11698944Sobriencurrent_level (struct ui_out *uiout)
11798944Sobrien{
11898944Sobrien  return &uiout->levels[uiout->level];
11998944Sobrien}
12098944Sobrien
12198944Sobrien/* Create a new level, of TYPE.  Return the new level's index. */
12298944Sobrienstatic int
12398944Sobrienpush_level (struct ui_out *uiout,
12498944Sobrien	    enum ui_out_type type,
12598944Sobrien	    const char *id)
12698944Sobrien{
12798944Sobrien  struct ui_out_level *current;
12898944Sobrien  /* We had better not overflow the buffer. */
12998944Sobrien  uiout->level++;
13098944Sobrien  gdb_assert (uiout->level >= 0 && uiout->level < MAX_UI_OUT_LEVELS);
13198944Sobrien  current = current_level (uiout);
13298944Sobrien  current->field_count = 0;
13398944Sobrien  current->type = type;
13498944Sobrien  return uiout->level;
13598944Sobrien}
13698944Sobrien
13798944Sobrien/* Discard the current level, return the discarded level's index.
13898944Sobrien   TYPE is the type of the level being discarded. */
13998944Sobrienstatic int
14098944Sobrienpop_level (struct ui_out *uiout,
14198944Sobrien	   enum ui_out_type type)
14298944Sobrien{
14398944Sobrien  /* We had better not underflow the buffer. */
14498944Sobrien  gdb_assert (uiout->level > 0 && uiout->level < MAX_UI_OUT_LEVELS);
14598944Sobrien  gdb_assert (current_level (uiout)->type == type);
14698944Sobrien  uiout->level--;
14798944Sobrien  return uiout->level + 1;
14898944Sobrien}
14998944Sobrien
15098944Sobrien
15198944Sobrien/* These are the default implementation functions */
15298944Sobrien
15398944Sobrienstatic void default_table_begin (struct ui_out *uiout, int nbrofcols,
15498944Sobrien				 int nr_rows, const char *tblid);
15598944Sobrienstatic void default_table_body (struct ui_out *uiout);
15698944Sobrienstatic void default_table_end (struct ui_out *uiout);
15798944Sobrienstatic void default_table_header (struct ui_out *uiout, int width,
15898944Sobrien				  enum ui_align alig, const char *col_name,
15998944Sobrien				  const char *colhdr);
16098944Sobrienstatic void default_begin (struct ui_out *uiout,
16198944Sobrien			   enum ui_out_type type,
16298944Sobrien			   int level, const char *id);
16398944Sobrienstatic void default_end (struct ui_out *uiout,
16498944Sobrien			 enum ui_out_type type,
16598944Sobrien			 int level);
16698944Sobrienstatic void default_field_int (struct ui_out *uiout, int fldno, int width,
16798944Sobrien			       enum ui_align alig,
16898944Sobrien			       const char *fldname,
16998944Sobrien			       int value);
17098944Sobrienstatic void default_field_skip (struct ui_out *uiout, int fldno, int width,
17198944Sobrien				enum ui_align alig,
17298944Sobrien				const char *fldname);
17398944Sobrienstatic void default_field_string (struct ui_out *uiout, int fldno, int width,
17498944Sobrien				  enum ui_align align,
17598944Sobrien				  const char *fldname,
17698944Sobrien				  const char *string);
17798944Sobrienstatic void default_field_fmt (struct ui_out *uiout, int fldno,
17898944Sobrien			       int width, enum ui_align align,
17998944Sobrien			       const char *fldname,
18098944Sobrien			       const char *format,
18198944Sobrien			       va_list args);
18298944Sobrienstatic void default_spaces (struct ui_out *uiout, int numspaces);
18398944Sobrienstatic void default_text (struct ui_out *uiout, const char *string);
18498944Sobrienstatic void default_message (struct ui_out *uiout, int verbosity,
18598944Sobrien			     const char *format,
18698944Sobrien			     va_list args);
18798944Sobrienstatic void default_wrap_hint (struct ui_out *uiout, char *identstring);
18898944Sobrienstatic void default_flush (struct ui_out *uiout);
18998944Sobrien
19098944Sobrien/* This is the default ui-out implementation functions vector */
19198944Sobrien
19298944Sobrienstruct ui_out_impl default_ui_out_impl =
19398944Sobrien{
19498944Sobrien  default_table_begin,
19598944Sobrien  default_table_body,
19698944Sobrien  default_table_end,
19798944Sobrien  default_table_header,
19898944Sobrien  default_begin,
19998944Sobrien  default_end,
20098944Sobrien  default_field_int,
20198944Sobrien  default_field_skip,
20298944Sobrien  default_field_string,
20398944Sobrien  default_field_fmt,
20498944Sobrien  default_spaces,
20598944Sobrien  default_text,
20698944Sobrien  default_message,
20798944Sobrien  default_wrap_hint,
20898944Sobrien  default_flush,
209130803Smarcel  NULL,
21098944Sobrien  0, /* Does not need MI hacks.  */
21198944Sobrien};
21298944Sobrien
21398944Sobrien/* The default ui_out */
21498944Sobrien
21598944Sobrienstruct ui_out def_uiout =
21698944Sobrien{
21798944Sobrien  0,				/* flags */
21898944Sobrien  &default_ui_out_impl,		/* impl */
21998944Sobrien};
22098944Sobrien
22198944Sobrien/* Pointer to current ui_out */
22298944Sobrien/* FIXME: This should not be a global, but something passed down from main.c
22398944Sobrien   or top.c */
22498944Sobrien
22598944Sobrienstruct ui_out *uiout = &def_uiout;
22698944Sobrien
22798944Sobrien/* These are the interfaces to implementation functions */
22898944Sobrien
22998944Sobrienstatic void uo_table_begin (struct ui_out *uiout, int nbrofcols,
23098944Sobrien			    int nr_rows, const char *tblid);
23198944Sobrienstatic void uo_table_body (struct ui_out *uiout);
23298944Sobrienstatic void uo_table_end (struct ui_out *uiout);
23398944Sobrienstatic void uo_table_header (struct ui_out *uiout, int width,
23498944Sobrien			     enum ui_align align, const char *col_name,
23598944Sobrien			     const char *colhdr);
23698944Sobrienstatic void uo_begin (struct ui_out *uiout,
23798944Sobrien		      enum ui_out_type type,
23898944Sobrien		      int level, const char *id);
23998944Sobrienstatic void uo_end (struct ui_out *uiout,
24098944Sobrien		    enum ui_out_type type,
24198944Sobrien		    int level);
24298944Sobrienstatic void uo_field_int (struct ui_out *uiout, int fldno, int width,
24398944Sobrien			  enum ui_align align, const char *fldname, int value);
24498944Sobrienstatic void uo_field_skip (struct ui_out *uiout, int fldno, int width,
24598944Sobrien			   enum ui_align align, const char *fldname);
24698944Sobrienstatic void uo_field_string (struct ui_out *uiout, int fldno, int width,
24798944Sobrien			     enum ui_align align, const char *fldname,
24898944Sobrien			     const char *string);
24998944Sobrienstatic void uo_field_fmt (struct ui_out *uiout, int fldno, int width,
25098944Sobrien			  enum ui_align align, const char *fldname,
25198944Sobrien			  const char *format, va_list args);
25298944Sobrienstatic void uo_spaces (struct ui_out *uiout, int numspaces);
25398944Sobrienstatic void uo_text (struct ui_out *uiout, const char *string);
25498944Sobrienstatic void uo_message (struct ui_out *uiout, int verbosity,
25598944Sobrien			const char *format, va_list args);
25698944Sobrienstatic void uo_wrap_hint (struct ui_out *uiout, char *identstring);
25798944Sobrienstatic void uo_flush (struct ui_out *uiout);
258130803Smarcelstatic int uo_redirect (struct ui_out *uiout, struct ui_file *outstream);
25998944Sobrien
26098944Sobrien/* Prototypes for local functions */
26198944Sobrien
26298944Sobrienextern void _initialize_ui_out (void);
26398944Sobrienstatic void append_header_to_list (struct ui_out *uiout, int width,
26498944Sobrien				   int alignment, const char *col_name,
26598944Sobrien				   const char *colhdr);
26698944Sobrienstatic int get_next_header (struct ui_out *uiout, int *colno, int *width,
26798944Sobrien			    int *alignment, char **colhdr);
26898944Sobrienstatic void clear_header_list (struct ui_out *uiout);
26998944Sobrienstatic void verify_field (struct ui_out *uiout, int *fldno, int *width,
27098944Sobrien			  int *align);
27198944Sobrien
27298944Sobrien/* exported functions (ui_out API) */
27398944Sobrien
27498944Sobrien/* Mark beginning of a table */
27598944Sobrien
276130803Smarcelstatic void
27798944Sobrienui_out_table_begin (struct ui_out *uiout, int nbrofcols,
27898944Sobrien		    int nr_rows,
27998944Sobrien		    const char *tblid)
28098944Sobrien{
28198944Sobrien  if (uiout->table.flag)
28298944Sobrien    internal_error (__FILE__, __LINE__,
28398944Sobrien		    "tables cannot be nested; table_begin found before \
28498944Sobrienprevious table_end.");
28598944Sobrien
28698944Sobrien  uiout->table.flag = 1;
28798944Sobrien  uiout->table.body_flag = 0;
28898944Sobrien  uiout->table.entry_level = uiout->level + 1;
28998944Sobrien  uiout->table.columns = nbrofcols;
29098944Sobrien  if (tblid != NULL)
29198944Sobrien    uiout->table.id = xstrdup (tblid);
29298944Sobrien  else
29398944Sobrien    uiout->table.id = NULL;
29498944Sobrien  clear_header_list (uiout);
29598944Sobrien
29698944Sobrien  uo_table_begin (uiout, nbrofcols, nr_rows, uiout->table.id);
29798944Sobrien}
29898944Sobrien
29998944Sobrienvoid
30098944Sobrienui_out_table_body (struct ui_out *uiout)
30198944Sobrien{
30298944Sobrien  if (!uiout->table.flag)
30398944Sobrien    internal_error (__FILE__, __LINE__,
30498944Sobrien		    "table_body outside a table is not valid; it must be \
30598944Sobrienafter a table_begin and before a table_end.");
30698944Sobrien  if (uiout->table.body_flag)
30798944Sobrien    internal_error (__FILE__, __LINE__,
30898944Sobrien		    "extra table_body call not allowed; there must be \
30998944Sobrienonly one table_body after a table_begin and before a table_end.");
31098944Sobrien  if (uiout->table.header_next->colno != uiout->table.columns)
31198944Sobrien    internal_error (__FILE__, __LINE__,
31298944Sobrien		    "number of headers differ from number of table \
31398944Sobriencolumns.");
31498944Sobrien
31598944Sobrien  uiout->table.body_flag = 1;
31698944Sobrien  uiout->table.header_next = uiout->table.header_first;
31798944Sobrien
31898944Sobrien  uo_table_body (uiout);
31998944Sobrien}
32098944Sobrien
321130803Smarcelstatic void
32298944Sobrienui_out_table_end (struct ui_out *uiout)
32398944Sobrien{
32498944Sobrien  if (!uiout->table.flag)
32598944Sobrien    internal_error (__FILE__, __LINE__,
32698944Sobrien		    "misplaced table_end or missing table_begin.");
32798944Sobrien
32898944Sobrien  uiout->table.entry_level = 0;
32998944Sobrien  uiout->table.body_flag = 0;
33098944Sobrien  uiout->table.flag = 0;
33198944Sobrien
33298944Sobrien  uo_table_end (uiout);
33398944Sobrien
33498944Sobrien  if (uiout->table.id)
33598944Sobrien    xfree (uiout->table.id);
33698944Sobrien  clear_header_list (uiout);
33798944Sobrien}
33898944Sobrien
33998944Sobrienvoid
34098944Sobrienui_out_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
34198944Sobrien		     const char *col_name,
34298944Sobrien		     const char *colhdr)
34398944Sobrien{
34498944Sobrien  if (!uiout->table.flag || uiout->table.body_flag)
34598944Sobrien    internal_error (__FILE__, __LINE__,
34698944Sobrien		    "table header must be specified after table_begin \
34798944Sobrienand before table_body.");
34898944Sobrien
34998944Sobrien  append_header_to_list (uiout, width, alignment, col_name, colhdr);
35098944Sobrien
35198944Sobrien  uo_table_header (uiout, width, alignment, col_name, colhdr);
35298944Sobrien}
35398944Sobrien
354130803Smarcelstatic void
355130803Smarceldo_cleanup_table_end (void *data)
356130803Smarcel{
357130803Smarcel  struct ui_out *ui_out = data;
358130803Smarcel
359130803Smarcel  ui_out_table_end (ui_out);
360130803Smarcel}
361130803Smarcel
362130803Smarcelstruct cleanup *
363130803Smarcelmake_cleanup_ui_out_table_begin_end (struct ui_out *ui_out, int nr_cols,
364130803Smarcel                                     int nr_rows, const char *tblid)
365130803Smarcel{
366130803Smarcel  ui_out_table_begin (ui_out, nr_cols, nr_rows, tblid);
367130803Smarcel  return make_cleanup (do_cleanup_table_end, ui_out);
368130803Smarcel}
369130803Smarcel
37098944Sobrienvoid
37198944Sobrienui_out_begin (struct ui_out *uiout,
37298944Sobrien	      enum ui_out_type type,
37398944Sobrien	      const char *id)
37498944Sobrien{
37598944Sobrien  int new_level;
37698944Sobrien  if (uiout->table.flag && !uiout->table.body_flag)
37798944Sobrien    internal_error (__FILE__, __LINE__,
37898944Sobrien		    "table header or table_body expected; lists must be \
37998944Sobrienspecified after table_body.");
38098944Sobrien
38198944Sobrien  /* Be careful to verify the ``field'' before the new tuple/list is
38298944Sobrien     pushed onto the stack.  That way the containing list/table/row is
38398944Sobrien     verified and not the newly created tuple/list.  This verification
38498944Sobrien     is needed (at least) for the case where a table row entry
38598944Sobrien     contains either a tuple/list.  For that case bookkeeping such as
38698944Sobrien     updating the column count or advancing to the next heading still
38798944Sobrien     needs to be performed.  */
38898944Sobrien  {
38998944Sobrien    int fldno;
39098944Sobrien    int width;
39198944Sobrien    int align;
39298944Sobrien    verify_field (uiout, &fldno, &width, &align);
39398944Sobrien  }
39498944Sobrien
39598944Sobrien  new_level = push_level (uiout, type, id);
39698944Sobrien
39798944Sobrien  /* If the push puts us at the same level as a table row entry, we've
39898944Sobrien     got a new table row.  Put the header pointer back to the start.  */
39998944Sobrien  if (uiout->table.body_flag
40098944Sobrien      && uiout->table.entry_level == new_level)
40198944Sobrien    uiout->table.header_next = uiout->table.header_first;
40298944Sobrien
40398944Sobrien  uo_begin (uiout, type, new_level, id);
40498944Sobrien}
40598944Sobrien
40698944Sobrienvoid
40798944Sobrienui_out_end (struct ui_out *uiout,
40898944Sobrien	    enum ui_out_type type)
40998944Sobrien{
41098944Sobrien  int old_level = pop_level (uiout, type);
41198944Sobrien  uo_end (uiout, type, old_level);
41298944Sobrien}
41398944Sobrien
41498944Sobrienstruct ui_out_end_cleanup_data
41598944Sobrien{
41698944Sobrien  struct ui_out *uiout;
41798944Sobrien  enum ui_out_type type;
41898944Sobrien};
41998944Sobrien
42098944Sobrienstatic void
42198944Sobriendo_cleanup_end (void *data)
42298944Sobrien{
42398944Sobrien  struct ui_out_end_cleanup_data *end_cleanup_data = data;
42498944Sobrien  ui_out_end (end_cleanup_data->uiout, end_cleanup_data->type);
42598944Sobrien  xfree (end_cleanup_data);
42698944Sobrien}
42798944Sobrien
42898944Sobrienstatic struct cleanup *
42998944Sobrienmake_cleanup_ui_out_end (struct ui_out *uiout,
43098944Sobrien			 enum ui_out_type type)
43198944Sobrien{
43298944Sobrien  struct ui_out_end_cleanup_data *end_cleanup_data;
43398944Sobrien  end_cleanup_data = XMALLOC (struct ui_out_end_cleanup_data);
43498944Sobrien  end_cleanup_data->uiout = uiout;
43598944Sobrien  end_cleanup_data->type = type;
43698944Sobrien  return make_cleanup (do_cleanup_end, end_cleanup_data);
43798944Sobrien}
43898944Sobrien
43998944Sobrienstruct cleanup *
44098944Sobrienmake_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout,
44198944Sobrien				     const char *id)
44298944Sobrien{
443130803Smarcel  ui_out_begin (uiout, ui_out_type_tuple, id);
44498944Sobrien  return make_cleanup_ui_out_end (uiout, ui_out_type_tuple);
44598944Sobrien}
44698944Sobrien
44798944Sobrienstruct cleanup *
44898944Sobrienmake_cleanup_ui_out_list_begin_end (struct ui_out *uiout,
44998944Sobrien				    const char *id)
45098944Sobrien{
451130803Smarcel  ui_out_begin (uiout, ui_out_type_list, id);
45298944Sobrien  return make_cleanup_ui_out_end (uiout, ui_out_type_list);
45398944Sobrien}
45498944Sobrien
45598944Sobrienvoid
45698944Sobrienui_out_field_int (struct ui_out *uiout,
45798944Sobrien		  const char *fldname,
45898944Sobrien		  int value)
45998944Sobrien{
46098944Sobrien  int fldno;
46198944Sobrien  int width;
46298944Sobrien  int align;
46398944Sobrien  struct ui_out_level *current = current_level (uiout);
46498944Sobrien
46598944Sobrien  verify_field (uiout, &fldno, &width, &align);
46698944Sobrien
46798944Sobrien  uo_field_int (uiout, fldno, width, align, fldname, value);
46898944Sobrien}
46998944Sobrien
47098944Sobrienvoid
471130803Smarcelui_out_field_fmt_int (struct ui_out *uiout,
472130803Smarcel                      int input_width,
473130803Smarcel                      enum ui_align input_align,
474130803Smarcel		      const char *fldname,
475130803Smarcel		      int value)
476130803Smarcel{
477130803Smarcel  int fldno;
478130803Smarcel  int width;
479130803Smarcel  int align;
480130803Smarcel  struct ui_out_level *current = current_level (uiout);
481130803Smarcel
482130803Smarcel  verify_field (uiout, &fldno, &width, &align);
483130803Smarcel
484130803Smarcel  uo_field_int (uiout, fldno, input_width, input_align, fldname, value);
485130803Smarcel}
486130803Smarcel
487130803Smarcelvoid
48898944Sobrienui_out_field_core_addr (struct ui_out *uiout,
48998944Sobrien			const char *fldname,
49098944Sobrien			CORE_ADDR address)
49198944Sobrien{
49298944Sobrien  char addstr[20];
49398944Sobrien
494130803Smarcel  /* FIXME: cagney/2002-05-03: Need local_address_string() function
495130803Smarcel     that returns the language localized string formatted to a width
496130803Smarcel     based on TARGET_ADDR_BIT.  */
49798944Sobrien  /* print_address_numeric (address, 1, local_stream); */
498130803Smarcel  if (TARGET_ADDR_BIT <= 32)
499130803Smarcel    strcpy (addstr, local_hex_string_custom (address, "08l"));
500130803Smarcel  else
501130803Smarcel    strcpy (addstr, local_hex_string_custom (address, "016l"));
50298944Sobrien
50398944Sobrien  ui_out_field_string (uiout, fldname, addstr);
50498944Sobrien}
50598944Sobrien
50698944Sobrienvoid
50798944Sobrienui_out_field_stream (struct ui_out *uiout,
50898944Sobrien		     const char *fldname,
50998944Sobrien		     struct ui_stream *buf)
51098944Sobrien{
51198944Sobrien  long length;
51298944Sobrien  char *buffer = ui_file_xstrdup (buf->stream, &length);
51398944Sobrien  struct cleanup *old_cleanup = make_cleanup (xfree, buffer);
51498944Sobrien  if (length > 0)
51598944Sobrien    ui_out_field_string (uiout, fldname, buffer);
51698944Sobrien  else
51798944Sobrien    ui_out_field_skip (uiout, fldname);
51898944Sobrien  ui_file_rewind (buf->stream);
51998944Sobrien  do_cleanups (old_cleanup);
52098944Sobrien}
52198944Sobrien
52298944Sobrien/* used to ommit a field */
52398944Sobrien
52498944Sobrienvoid
52598944Sobrienui_out_field_skip (struct ui_out *uiout,
52698944Sobrien		   const char *fldname)
52798944Sobrien{
52898944Sobrien  int fldno;
52998944Sobrien  int width;
53098944Sobrien  int align;
53198944Sobrien
53298944Sobrien  verify_field (uiout, &fldno, &width, &align);
53398944Sobrien
53498944Sobrien  uo_field_skip (uiout, fldno, width, align, fldname);
53598944Sobrien}
53698944Sobrien
53798944Sobrienvoid
53898944Sobrienui_out_field_string (struct ui_out *uiout,
53998944Sobrien		     const char *fldname,
54098944Sobrien		     const char *string)
54198944Sobrien{
54298944Sobrien  int fldno;
54398944Sobrien  int width;
54498944Sobrien  int align;
54598944Sobrien
54698944Sobrien  verify_field (uiout, &fldno, &width, &align);
54798944Sobrien
54898944Sobrien  uo_field_string (uiout, fldno, width, align, fldname, string);
54998944Sobrien}
55098944Sobrien
55198944Sobrien/* VARARGS */
55298944Sobrienvoid
55398944Sobrienui_out_field_fmt (struct ui_out *uiout,
55498944Sobrien		  const char *fldname,
55598944Sobrien		  const char *format, ...)
55698944Sobrien{
55798944Sobrien  va_list args;
55898944Sobrien  int fldno;
55998944Sobrien  int width;
56098944Sobrien  int align;
56198944Sobrien
56298944Sobrien  /* will not align, but has to call anyway */
56398944Sobrien  verify_field (uiout, &fldno, &width, &align);
56498944Sobrien
56598944Sobrien  va_start (args, format);
56698944Sobrien
56798944Sobrien  uo_field_fmt (uiout, fldno, width, align, fldname, format, args);
56898944Sobrien
56998944Sobrien  va_end (args);
57098944Sobrien}
57198944Sobrien
57298944Sobrienvoid
57398944Sobrienui_out_spaces (struct ui_out *uiout, int numspaces)
57498944Sobrien{
57598944Sobrien  uo_spaces (uiout, numspaces);
57698944Sobrien}
57798944Sobrien
57898944Sobrienvoid
57998944Sobrienui_out_text (struct ui_out *uiout,
58098944Sobrien	     const char *string)
58198944Sobrien{
58298944Sobrien  uo_text (uiout, string);
58398944Sobrien}
58498944Sobrien
58598944Sobrienvoid
58698944Sobrienui_out_message (struct ui_out *uiout, int verbosity,
58798944Sobrien		const char *format,...)
58898944Sobrien{
58998944Sobrien  va_list args;
59098944Sobrien
59198944Sobrien  va_start (args, format);
59298944Sobrien
59398944Sobrien  uo_message (uiout, verbosity, format, args);
59498944Sobrien
59598944Sobrien  va_end (args);
59698944Sobrien}
59798944Sobrien
59898944Sobrienstruct ui_stream *
59998944Sobrienui_out_stream_new (struct ui_out *uiout)
60098944Sobrien{
60198944Sobrien  struct ui_stream *tempbuf;
60298944Sobrien
60398944Sobrien  tempbuf = XMALLOC (struct ui_stream);
60498944Sobrien  tempbuf->uiout = uiout;
60598944Sobrien  tempbuf->stream = mem_fileopen ();
60698944Sobrien  return tempbuf;
60798944Sobrien}
60898944Sobrien
60998944Sobrienvoid
61098944Sobrienui_out_stream_delete (struct ui_stream *buf)
61198944Sobrien{
61298944Sobrien  ui_file_delete (buf->stream);
61398944Sobrien  xfree (buf);
61498944Sobrien}
61598944Sobrien
61698944Sobrienstatic void
61798944Sobriendo_stream_delete (void *buf)
61898944Sobrien{
61998944Sobrien  ui_out_stream_delete (buf);
62098944Sobrien}
62198944Sobrien
62298944Sobrienstruct cleanup *
62398944Sobrienmake_cleanup_ui_out_stream_delete (struct ui_stream *buf)
62498944Sobrien{
62598944Sobrien  return make_cleanup (do_stream_delete, buf);
62698944Sobrien}
62798944Sobrien
62898944Sobrien
62998944Sobrienvoid
63098944Sobrienui_out_wrap_hint (struct ui_out *uiout, char *identstring)
63198944Sobrien{
63298944Sobrien  uo_wrap_hint (uiout, identstring);
63398944Sobrien}
63498944Sobrien
63598944Sobrienvoid
63698944Sobrienui_out_flush (struct ui_out *uiout)
63798944Sobrien{
63898944Sobrien  uo_flush (uiout);
63998944Sobrien}
64098944Sobrien
641130803Smarcelint
642130803Smarcelui_out_redirect (struct ui_out *uiout, struct ui_file *outstream)
643130803Smarcel{
644130803Smarcel  return uo_redirect (uiout, outstream);
645130803Smarcel}
646130803Smarcel
64798944Sobrien/* set the flags specified by the mask given */
64898944Sobrienint
64998944Sobrienui_out_set_flags (struct ui_out *uiout, int mask)
65098944Sobrien{
65198944Sobrien  int oldflags = uiout->flags;
65298944Sobrien
65398944Sobrien  uiout->flags |= mask;
65498944Sobrien
65598944Sobrien  return oldflags;
65698944Sobrien}
65798944Sobrien
65898944Sobrien/* clear the flags specified by the mask given */
65998944Sobrienint
66098944Sobrienui_out_clear_flags (struct ui_out *uiout, int mask)
66198944Sobrien{
66298944Sobrien  int oldflags = uiout->flags;
66398944Sobrien
66498944Sobrien  uiout->flags &= ~mask;
66598944Sobrien
66698944Sobrien  return oldflags;
66798944Sobrien}
66898944Sobrien
66998944Sobrien/* test the flags against the mask given */
67098944Sobrienint
67198944Sobrienui_out_test_flags (struct ui_out *uiout, int mask)
67298944Sobrien{
67398944Sobrien  return (uiout->flags & mask);
67498944Sobrien}
67598944Sobrien
67698944Sobrien/* obtain the current verbosity level (as stablished by the
67798944Sobrien   'set verbositylevel' command */
67898944Sobrien
67998944Sobrienint
68098944Sobrienui_out_get_verblvl (struct ui_out *uiout)
68198944Sobrien{
68298944Sobrien  /* FIXME: not implemented yet */
68398944Sobrien  return 0;
68498944Sobrien}
68598944Sobrien
68698944Sobrien#if 0
68798944Sobrienvoid
68898944Sobrienui_out_result_begin (struct ui_out *uiout, char *class)
68998944Sobrien{
69098944Sobrien}
69198944Sobrien
69298944Sobrienvoid
69398944Sobrienui_out_result_end (struct ui_out *uiout)
69498944Sobrien{
69598944Sobrien}
69698944Sobrien
69798944Sobrienvoid
69898944Sobrienui_out_info_begin (struct ui_out *uiout, char *class)
69998944Sobrien{
70098944Sobrien}
70198944Sobrien
70298944Sobrienvoid
70398944Sobrienui_out_info_end (struct ui_out *uiout)
70498944Sobrien{
70598944Sobrien}
70698944Sobrien
70798944Sobrienvoid
70898944Sobrienui_out_notify_begin (struct ui_out *uiout, char *class)
70998944Sobrien{
71098944Sobrien}
71198944Sobrien
71298944Sobrienvoid
71398944Sobrienui_out_notify_end (struct ui_out *uiout)
71498944Sobrien{
71598944Sobrien}
71698944Sobrien
71798944Sobrienvoid
71898944Sobrienui_out_error_begin (struct ui_out *uiout, char *class)
71998944Sobrien{
72098944Sobrien}
72198944Sobrien
72298944Sobrienvoid
72398944Sobrienui_out_error_end (struct ui_out *uiout)
72498944Sobrien{
72598944Sobrien}
72698944Sobrien#endif
72798944Sobrien
72898944Sobrien#if 0
72998944Sobrienvoid
73098944Sobriengdb_error (ui_out * uiout, int severity, char *format,...)
73198944Sobrien{
73298944Sobrien  va_list args;
73398944Sobrien}
73498944Sobrien
73598944Sobrienvoid
73698944Sobriengdb_query (struct ui_out *uiout, int qflags, char *qprompt)
73798944Sobrien{
73898944Sobrien}
73998944Sobrien#endif
74098944Sobrien
74198944Sobrienint
74298944Sobrienui_out_is_mi_like_p (struct ui_out *uiout)
74398944Sobrien{
74498944Sobrien  return uiout->impl->is_mi_like_p;
74598944Sobrien}
74698944Sobrien
74798944Sobrien/* default gdb-out hook functions */
74898944Sobrien
74998944Sobrienstatic void
75098944Sobriendefault_table_begin (struct ui_out *uiout, int nbrofcols,
75198944Sobrien		     int nr_rows,
75298944Sobrien		     const char *tblid)
75398944Sobrien{
75498944Sobrien}
75598944Sobrien
75698944Sobrienstatic void
75798944Sobriendefault_table_body (struct ui_out *uiout)
75898944Sobrien{
75998944Sobrien}
76098944Sobrien
76198944Sobrienstatic void
76298944Sobriendefault_table_end (struct ui_out *uiout)
76398944Sobrien{
76498944Sobrien}
76598944Sobrien
76698944Sobrienstatic void
76798944Sobriendefault_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
76898944Sobrien		      const char *col_name,
76998944Sobrien		      const char *colhdr)
77098944Sobrien{
77198944Sobrien}
77298944Sobrien
77398944Sobrienstatic void
77498944Sobriendefault_begin (struct ui_out *uiout,
77598944Sobrien	       enum ui_out_type type,
77698944Sobrien	       int level,
77798944Sobrien	       const char *id)
77898944Sobrien{
77998944Sobrien}
78098944Sobrien
78198944Sobrienstatic void
78298944Sobriendefault_end (struct ui_out *uiout,
78398944Sobrien	     enum ui_out_type type,
78498944Sobrien	     int level)
78598944Sobrien{
78698944Sobrien}
78798944Sobrien
78898944Sobrienstatic void
78998944Sobriendefault_field_int (struct ui_out *uiout, int fldno, int width,
79098944Sobrien		   enum ui_align align,
79198944Sobrien		   const char *fldname, int value)
79298944Sobrien{
79398944Sobrien}
79498944Sobrien
79598944Sobrienstatic void
79698944Sobriendefault_field_skip (struct ui_out *uiout, int fldno, int width,
79798944Sobrien		    enum ui_align align, const char *fldname)
79898944Sobrien{
79998944Sobrien}
80098944Sobrien
80198944Sobrienstatic void
80298944Sobriendefault_field_string (struct ui_out *uiout,
80398944Sobrien		      int fldno,
80498944Sobrien		      int width,
80598944Sobrien		      enum ui_align align,
80698944Sobrien		      const char *fldname,
80798944Sobrien		      const char *string)
80898944Sobrien{
80998944Sobrien}
81098944Sobrien
81198944Sobrienstatic void
81298944Sobriendefault_field_fmt (struct ui_out *uiout, int fldno, int width,
81398944Sobrien		   enum ui_align align,
81498944Sobrien		   const char *fldname,
81598944Sobrien		   const char *format,
81698944Sobrien		   va_list args)
81798944Sobrien{
81898944Sobrien}
81998944Sobrien
82098944Sobrienstatic void
82198944Sobriendefault_spaces (struct ui_out *uiout, int numspaces)
82298944Sobrien{
82398944Sobrien}
82498944Sobrien
82598944Sobrienstatic void
82698944Sobriendefault_text (struct ui_out *uiout, const char *string)
82798944Sobrien{
82898944Sobrien}
82998944Sobrien
83098944Sobrienstatic void
83198944Sobriendefault_message (struct ui_out *uiout, int verbosity,
83298944Sobrien		 const char *format,
83398944Sobrien		 va_list args)
83498944Sobrien{
83598944Sobrien}
83698944Sobrien
83798944Sobrienstatic void
83898944Sobriendefault_wrap_hint (struct ui_out *uiout, char *identstring)
83998944Sobrien{
84098944Sobrien}
84198944Sobrien
84298944Sobrienstatic void
84398944Sobriendefault_flush (struct ui_out *uiout)
84498944Sobrien{
84598944Sobrien}
84698944Sobrien
84798944Sobrien/* Interface to the implementation functions */
84898944Sobrien
84998944Sobrienvoid
85098944Sobrienuo_table_begin (struct ui_out *uiout, int nbrofcols,
85198944Sobrien		int nr_rows,
85298944Sobrien		const char *tblid)
85398944Sobrien{
85498944Sobrien  if (!uiout->impl->table_begin)
85598944Sobrien    return;
85698944Sobrien  uiout->impl->table_begin (uiout, nbrofcols, nr_rows, tblid);
85798944Sobrien}
85898944Sobrien
85998944Sobrienvoid
86098944Sobrienuo_table_body (struct ui_out *uiout)
86198944Sobrien{
86298944Sobrien  if (!uiout->impl->table_body)
86398944Sobrien    return;
86498944Sobrien  uiout->impl->table_body (uiout);
86598944Sobrien}
86698944Sobrien
86798944Sobrienvoid
86898944Sobrienuo_table_end (struct ui_out *uiout)
86998944Sobrien{
87098944Sobrien  if (!uiout->impl->table_end)
87198944Sobrien    return;
87298944Sobrien  uiout->impl->table_end (uiout);
87398944Sobrien}
87498944Sobrien
87598944Sobrienvoid
87698944Sobrienuo_table_header (struct ui_out *uiout, int width, enum ui_align align,
87798944Sobrien		 const char *col_name,
87898944Sobrien		 const char *colhdr)
87998944Sobrien{
88098944Sobrien  if (!uiout->impl->table_header)
88198944Sobrien    return;
88298944Sobrien  uiout->impl->table_header (uiout, width, align, col_name, colhdr);
88398944Sobrien}
88498944Sobrien
88598944Sobrienvoid
88698944Sobrienuo_begin (struct ui_out *uiout,
88798944Sobrien	  enum ui_out_type type,
88898944Sobrien	  int level,
88998944Sobrien	  const char *id)
89098944Sobrien{
89198944Sobrien  if (uiout->impl->begin == NULL)
89298944Sobrien    return;
89398944Sobrien  uiout->impl->begin (uiout, type, level, id);
89498944Sobrien}
89598944Sobrien
89698944Sobrienvoid
89798944Sobrienuo_end (struct ui_out *uiout,
89898944Sobrien	enum ui_out_type type,
89998944Sobrien	int level)
90098944Sobrien{
90198944Sobrien  if (uiout->impl->end == NULL)
90298944Sobrien    return;
90398944Sobrien  uiout->impl->end (uiout, type, level);
90498944Sobrien}
90598944Sobrien
90698944Sobrienvoid
90798944Sobrienuo_field_int (struct ui_out *uiout, int fldno, int width, enum ui_align align,
90898944Sobrien	      const char *fldname,
90998944Sobrien	      int value)
91098944Sobrien{
91198944Sobrien  if (!uiout->impl->field_int)
91298944Sobrien    return;
91398944Sobrien  uiout->impl->field_int (uiout, fldno, width, align, fldname, value);
91498944Sobrien}
91598944Sobrien
91698944Sobrienvoid
91798944Sobrienuo_field_skip (struct ui_out *uiout, int fldno, int width, enum ui_align align,
91898944Sobrien	       const char *fldname)
91998944Sobrien{
92098944Sobrien  if (!uiout->impl->field_skip)
92198944Sobrien    return;
92298944Sobrien  uiout->impl->field_skip (uiout, fldno, width, align, fldname);
92398944Sobrien}
92498944Sobrien
92598944Sobrienvoid
92698944Sobrienuo_field_string (struct ui_out *uiout, int fldno, int width,
92798944Sobrien		 enum ui_align align,
92898944Sobrien		 const char *fldname,
92998944Sobrien		 const char *string)
93098944Sobrien{
93198944Sobrien  if (!uiout->impl->field_string)
93298944Sobrien    return;
93398944Sobrien  uiout->impl->field_string (uiout, fldno, width, align, fldname, string);
93498944Sobrien}
93598944Sobrien
93698944Sobrienvoid
93798944Sobrienuo_field_fmt (struct ui_out *uiout, int fldno, int width, enum ui_align align,
93898944Sobrien	      const char *fldname,
93998944Sobrien	      const char *format,
94098944Sobrien	      va_list args)
94198944Sobrien{
94298944Sobrien  if (!uiout->impl->field_fmt)
94398944Sobrien    return;
94498944Sobrien  uiout->impl->field_fmt (uiout, fldno, width, align, fldname, format, args);
94598944Sobrien}
94698944Sobrien
94798944Sobrienvoid
94898944Sobrienuo_spaces (struct ui_out *uiout, int numspaces)
94998944Sobrien{
95098944Sobrien  if (!uiout->impl->spaces)
95198944Sobrien    return;
95298944Sobrien  uiout->impl->spaces (uiout, numspaces);
95398944Sobrien}
95498944Sobrien
95598944Sobrienvoid
95698944Sobrienuo_text (struct ui_out *uiout,
95798944Sobrien	 const char *string)
95898944Sobrien{
95998944Sobrien  if (!uiout->impl->text)
96098944Sobrien    return;
96198944Sobrien  uiout->impl->text (uiout, string);
96298944Sobrien}
96398944Sobrien
96498944Sobrienvoid
96598944Sobrienuo_message (struct ui_out *uiout, int verbosity,
96698944Sobrien	    const char *format,
96798944Sobrien	    va_list args)
96898944Sobrien{
96998944Sobrien  if (!uiout->impl->message)
97098944Sobrien    return;
97198944Sobrien  uiout->impl->message (uiout, verbosity, format, args);
97298944Sobrien}
97398944Sobrien
97498944Sobrienvoid
97598944Sobrienuo_wrap_hint (struct ui_out *uiout, char *identstring)
97698944Sobrien{
97798944Sobrien  if (!uiout->impl->wrap_hint)
97898944Sobrien    return;
97998944Sobrien  uiout->impl->wrap_hint (uiout, identstring);
98098944Sobrien}
98198944Sobrien
98298944Sobrienvoid
98398944Sobrienuo_flush (struct ui_out *uiout)
98498944Sobrien{
98598944Sobrien  if (!uiout->impl->flush)
98698944Sobrien    return;
98798944Sobrien  uiout->impl->flush (uiout);
98898944Sobrien}
98998944Sobrien
990130803Smarcelint
991130803Smarceluo_redirect (struct ui_out *uiout, struct ui_file *outstream)
992130803Smarcel{
993130803Smarcel  if (!uiout->impl->redirect)
994130803Smarcel    return -1;
995130803Smarcel  uiout->impl->redirect (uiout, outstream);
996130803Smarcel  return 0;
997130803Smarcel}
998130803Smarcel
99998944Sobrien/* local functions */
100098944Sobrien
100198944Sobrien/* list of column headers manipulation routines */
100298944Sobrien
100398944Sobrienstatic void
100498944Sobrienclear_header_list (struct ui_out *uiout)
100598944Sobrien{
100698944Sobrien  while (uiout->table.header_first != NULL)
100798944Sobrien    {
100898944Sobrien      uiout->table.header_next = uiout->table.header_first;
100998944Sobrien      uiout->table.header_first = uiout->table.header_first->next;
101098944Sobrien      if (uiout->table.header_next->colhdr != NULL)
101198944Sobrien	xfree (uiout->table.header_next->colhdr);
101298944Sobrien      xfree (uiout->table.header_next);
101398944Sobrien    }
101498944Sobrien  gdb_assert (uiout->table.header_first == NULL);
101598944Sobrien  uiout->table.header_last = NULL;
101698944Sobrien  uiout->table.header_next = NULL;
101798944Sobrien}
101898944Sobrien
101998944Sobrienstatic void
102098944Sobrienappend_header_to_list (struct ui_out *uiout,
102198944Sobrien		       int width,
102298944Sobrien		       int alignment,
102398944Sobrien		       const char *col_name,
102498944Sobrien		       const char *colhdr)
102598944Sobrien{
102698944Sobrien  struct ui_out_hdr *temphdr;
102798944Sobrien
102898944Sobrien  temphdr = XMALLOC (struct ui_out_hdr);
102998944Sobrien  temphdr->width = width;
103098944Sobrien  temphdr->alignment = alignment;
103198944Sobrien  /* we have to copy the column title as the original may be an automatic */
103298944Sobrien  if (colhdr != NULL)
103398944Sobrien    temphdr->colhdr = xstrdup (colhdr);
103498944Sobrien  else
103598944Sobrien    temphdr->colhdr = NULL;
103698944Sobrien  if (col_name != NULL)
103798944Sobrien    temphdr->col_name = xstrdup (colhdr);
103898944Sobrien  else
103998944Sobrien    temphdr->col_name = xstrdup (colhdr);
104098944Sobrien  temphdr->next = NULL;
104198944Sobrien  if (uiout->table.header_first == NULL)
104298944Sobrien    {
104398944Sobrien      temphdr->colno = 1;
104498944Sobrien      uiout->table.header_first = temphdr;
104598944Sobrien      uiout->table.header_last = temphdr;
104698944Sobrien    }
104798944Sobrien  else
104898944Sobrien    {
104998944Sobrien      temphdr->colno = uiout->table.header_last->colno + 1;
105098944Sobrien      uiout->table.header_last->next = temphdr;
105198944Sobrien      uiout->table.header_last = temphdr;
105298944Sobrien    }
105398944Sobrien  uiout->table.header_next = uiout->table.header_last;
105498944Sobrien}
105598944Sobrien
105698944Sobrien/* Extract the format information for the NEXT header and and advance
105798944Sobrien   the header pointer.  Return 0 if there was no next header.  */
105898944Sobrien
105998944Sobrienstatic int
106098944Sobrienget_next_header (struct ui_out *uiout,
106198944Sobrien		 int *colno,
106298944Sobrien		 int *width,
106398944Sobrien		 int *alignment,
106498944Sobrien		 char **colhdr)
106598944Sobrien{
106698944Sobrien  /* There may be no headers at all or we may have used all columns.  */
106798944Sobrien  if (uiout->table.header_next == NULL)
106898944Sobrien    return 0;
106998944Sobrien  *colno = uiout->table.header_next->colno;
107098944Sobrien  *width = uiout->table.header_next->width;
107198944Sobrien  *alignment = uiout->table.header_next->alignment;
107298944Sobrien  *colhdr = uiout->table.header_next->colhdr;
107398944Sobrien  /* Advance the header pointer to the next entry.  */
107498944Sobrien  uiout->table.header_next = uiout->table.header_next->next;
107598944Sobrien  return 1;
107698944Sobrien}
107798944Sobrien
107898944Sobrien
107998944Sobrien/* Verify that the field/tuple/list is correctly positioned.  Return
108098944Sobrien   the field number and corresponding alignment (if
108198944Sobrien   available/applicable).  */
108298944Sobrien
108398944Sobrienstatic void
108498944Sobrienverify_field (struct ui_out *uiout, int *fldno, int *width, int *align)
108598944Sobrien{
108698944Sobrien  struct ui_out_level *current = current_level (uiout);
108798944Sobrien  char *text;
108898944Sobrien
108998944Sobrien  if (uiout->table.flag)
109098944Sobrien    {
109198944Sobrien      if (!uiout->table.body_flag)
109298944Sobrien	internal_error (__FILE__, __LINE__,
109398944Sobrien			"table_body missing; table fields must be \
109498944Sobrienspecified after table_body and inside a list.");
109598944Sobrien      /* NOTE: cagney/2001-12-08: There was a check here to ensure
109698944Sobrien	 that this code was only executed when uiout->level was
109798944Sobrien	 greater than zero.  That no longer applies - this code is run
109898944Sobrien	 before each table row tuple is started and at that point the
109998944Sobrien	 level is zero.  */
110098944Sobrien    }
110198944Sobrien
110298944Sobrien  current->field_count += 1;
110398944Sobrien
110498944Sobrien  if (uiout->table.body_flag
110598944Sobrien      && uiout->table.entry_level == uiout->level
110698944Sobrien      && get_next_header (uiout, fldno, width, align, &text))
110798944Sobrien    {
110898944Sobrien      if (*fldno != current->field_count)
110998944Sobrien	internal_error (__FILE__, __LINE__,
111098944Sobrien			"ui-out internal error in handling headers.");
111198944Sobrien    }
111298944Sobrien  else
111398944Sobrien    {
111498944Sobrien      *width = 0;
111598944Sobrien      *align = ui_noalign;
111698944Sobrien      *fldno = current->field_count;
111798944Sobrien    }
111898944Sobrien}
111998944Sobrien
112098944Sobrien
112198944Sobrien/* access to ui_out format private members */
112298944Sobrien
112398944Sobrienvoid
112498944Sobrienui_out_get_field_separator (struct ui_out *uiout)
112598944Sobrien{
112698944Sobrien}
112798944Sobrien
112898944Sobrien/* Access to ui-out members data */
112998944Sobrien
113098944Sobrienstruct ui_out_data *
113198944Sobrienui_out_data (struct ui_out *uiout)
113298944Sobrien{
113398944Sobrien  return uiout->data;
113498944Sobrien}
113598944Sobrien
113698944Sobrien/* initalize private members at startup */
113798944Sobrien
113898944Sobrienstruct ui_out *
113998944Sobrienui_out_new (struct ui_out_impl *impl,
114098944Sobrien	    struct ui_out_data *data,
114198944Sobrien	    int flags)
114298944Sobrien{
114398944Sobrien  struct ui_out *uiout = XMALLOC (struct ui_out);
114498944Sobrien  uiout->data = data;
114598944Sobrien  uiout->impl = impl;
114698944Sobrien  uiout->flags = flags;
114798944Sobrien  uiout->table.flag = 0;
114898944Sobrien  uiout->table.body_flag = 0;
114998944Sobrien  uiout->level = 0;
115098944Sobrien  memset (uiout->levels, 0, sizeof (uiout->levels));
115198944Sobrien  uiout->table.header_first = NULL;
115298944Sobrien  uiout->table.header_last = NULL;
115398944Sobrien  uiout->table.header_next = NULL;
115498944Sobrien  return uiout;
115598944Sobrien}
115698944Sobrien
115798944Sobrien/* standard gdb initialization hook */
115898944Sobrien
115998944Sobrienvoid
116098944Sobrien_initialize_ui_out (void)
116198944Sobrien{
116298944Sobrien  /* nothing needs to be done */
116398944Sobrien}
1164