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