1*b725ae77Skettenis /* Output generating routines for GDB. 2*b725ae77Skettenis Copyright 1999, 2000, 2001 Free Software Foundation, Inc. 3*b725ae77Skettenis Contributed by Cygnus Solutions. 4*b725ae77Skettenis Written by Fernando Nasser for Cygnus. 5*b725ae77Skettenis 6*b725ae77Skettenis This file is part of GDB. 7*b725ae77Skettenis 8*b725ae77Skettenis This program is free software; you can redistribute it and/or modify 9*b725ae77Skettenis it under the terms of the GNU General Public License as published by 10*b725ae77Skettenis the Free Software Foundation; either version 2 of the License, or 11*b725ae77Skettenis (at your option) any later version. 12*b725ae77Skettenis 13*b725ae77Skettenis This program is distributed in the hope that it will be useful, 14*b725ae77Skettenis but WITHOUT ANY WARRANTY; without even the implied warranty of 15*b725ae77Skettenis MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 16*b725ae77Skettenis GNU General Public License for more details. 17*b725ae77Skettenis 18*b725ae77Skettenis You should have received a copy of the GNU General Public License 19*b725ae77Skettenis along with this program; if not, write to the Free Software 20*b725ae77Skettenis Foundation, Inc., 59 Temple Place - Suite 330, 21*b725ae77Skettenis Boston, MA 02111-1307, USA. */ 22*b725ae77Skettenis 23*b725ae77Skettenis #ifndef UI_OUT_H 24*b725ae77Skettenis #define UI_OUT_H 1 25*b725ae77Skettenis 26*b725ae77Skettenis /* The ui_out structure */ 27*b725ae77Skettenis 28*b725ae77Skettenis struct ui_out; 29*b725ae77Skettenis struct ui_out_data; 30*b725ae77Skettenis struct ui_file; 31*b725ae77Skettenis 32*b725ae77Skettenis /* the current ui_out */ 33*b725ae77Skettenis 34*b725ae77Skettenis /* FIXME: This should not be a global but something passed down from main.c 35*b725ae77Skettenis or top.c */ 36*b725ae77Skettenis extern struct ui_out *uiout; 37*b725ae77Skettenis 38*b725ae77Skettenis /* alignment enum */ 39*b725ae77Skettenis enum ui_align 40*b725ae77Skettenis { 41*b725ae77Skettenis ui_left = -1, 42*b725ae77Skettenis ui_center, 43*b725ae77Skettenis ui_right, 44*b725ae77Skettenis ui_noalign 45*b725ae77Skettenis }; 46*b725ae77Skettenis 47*b725ae77Skettenis /* flags enum */ 48*b725ae77Skettenis enum ui_flags 49*b725ae77Skettenis { 50*b725ae77Skettenis ui_from_tty = 1, 51*b725ae77Skettenis ui_source_list = 2 52*b725ae77Skettenis }; 53*b725ae77Skettenis 54*b725ae77Skettenis 55*b725ae77Skettenis /* The ui_out stream structure. */ 56*b725ae77Skettenis /* NOTE: cagney/2000-02-01: The ui_stream object can be subsumed by 57*b725ae77Skettenis the more generic ui_file object. */ 58*b725ae77Skettenis 59*b725ae77Skettenis struct ui_stream 60*b725ae77Skettenis { 61*b725ae77Skettenis struct ui_out *uiout; 62*b725ae77Skettenis struct ui_file *stream; 63*b725ae77Skettenis }; 64*b725ae77Skettenis 65*b725ae77Skettenis 66*b725ae77Skettenis /* Prototypes for ui-out API. */ 67*b725ae77Skettenis 68*b725ae77Skettenis /* A result is a recursive data structure consisting of lists and 69*b725ae77Skettenis tuples. */ 70*b725ae77Skettenis 71*b725ae77Skettenis enum ui_out_type 72*b725ae77Skettenis { 73*b725ae77Skettenis ui_out_type_tuple, 74*b725ae77Skettenis ui_out_type_list 75*b725ae77Skettenis }; 76*b725ae77Skettenis 77*b725ae77Skettenis extern void ui_out_begin (struct ui_out *uiout, 78*b725ae77Skettenis enum ui_out_type level_type, 79*b725ae77Skettenis const char *id); 80*b725ae77Skettenis 81*b725ae77Skettenis extern void ui_out_end (struct ui_out *uiout, enum ui_out_type type); 82*b725ae77Skettenis 83*b725ae77Skettenis extern struct cleanup *ui_out_begin_cleanup_end (struct ui_out *uiout, 84*b725ae77Skettenis enum ui_out_type level_type, 85*b725ae77Skettenis const char *id); 86*b725ae77Skettenis 87*b725ae77Skettenis /* A table can be considered a special tuple/list combination with the 88*b725ae77Skettenis implied structure: ``table = { hdr = { header, ... } , body = [ { 89*b725ae77Skettenis field, ... }, ... ] }''. If NR_ROWS is negative then there is at 90*b725ae77Skettenis least one row. */ 91*b725ae77Skettenis extern void ui_out_table_header (struct ui_out *uiout, int width, 92*b725ae77Skettenis enum ui_align align, const char *col_name, 93*b725ae77Skettenis const char *colhdr); 94*b725ae77Skettenis 95*b725ae77Skettenis extern void ui_out_table_body (struct ui_out *uiout); 96*b725ae77Skettenis 97*b725ae77Skettenis extern struct cleanup *make_cleanup_ui_out_table_begin_end (struct ui_out *ui_out, 98*b725ae77Skettenis int nr_cols, 99*b725ae77Skettenis int nr_rows, 100*b725ae77Skettenis const char *tblid); 101*b725ae77Skettenis /* Compatibility wrappers. */ 102*b725ae77Skettenis 103*b725ae77Skettenis extern struct cleanup *make_cleanup_ui_out_list_begin_end (struct ui_out *uiout, 104*b725ae77Skettenis const char *id); 105*b725ae77Skettenis 106*b725ae77Skettenis extern struct cleanup *make_cleanup_ui_out_tuple_begin_end (struct ui_out *uiout, 107*b725ae77Skettenis const char *id); 108*b725ae77Skettenis 109*b725ae77Skettenis extern void ui_out_field_int (struct ui_out *uiout, const char *fldname, 110*b725ae77Skettenis int value); 111*b725ae77Skettenis 112*b725ae77Skettenis extern void ui_out_field_fmt_int (struct ui_out *uiout, int width, 113*b725ae77Skettenis enum ui_align align, const char *fldname, 114*b725ae77Skettenis int value); 115*b725ae77Skettenis 116*b725ae77Skettenis extern void ui_out_field_core_addr (struct ui_out *uiout, const char *fldname, 117*b725ae77Skettenis CORE_ADDR address); 118*b725ae77Skettenis 119*b725ae77Skettenis extern void ui_out_field_string (struct ui_out * uiout, const char *fldname, 120*b725ae77Skettenis const char *string); 121*b725ae77Skettenis 122*b725ae77Skettenis extern void ui_out_field_stream (struct ui_out *uiout, const char *fldname, 123*b725ae77Skettenis struct ui_stream *buf); 124*b725ae77Skettenis 125*b725ae77Skettenis extern void ui_out_field_fmt (struct ui_out *uiout, const char *fldname, 126*b725ae77Skettenis const char *format, ...); 127*b725ae77Skettenis 128*b725ae77Skettenis extern void ui_out_field_skip (struct ui_out *uiout, const char *fldname); 129*b725ae77Skettenis 130*b725ae77Skettenis extern void ui_out_spaces (struct ui_out *uiout, int numspaces); 131*b725ae77Skettenis 132*b725ae77Skettenis extern void ui_out_text (struct ui_out *uiout, const char *string); 133*b725ae77Skettenis 134*b725ae77Skettenis extern void ui_out_message (struct ui_out *uiout, int verbosity, 135*b725ae77Skettenis const char *format, ...); 136*b725ae77Skettenis 137*b725ae77Skettenis extern struct ui_stream *ui_out_stream_new (struct ui_out *uiout); 138*b725ae77Skettenis 139*b725ae77Skettenis extern void ui_out_stream_delete (struct ui_stream *buf); 140*b725ae77Skettenis 141*b725ae77Skettenis struct cleanup *make_cleanup_ui_out_stream_delete (struct ui_stream *buf); 142*b725ae77Skettenis 143*b725ae77Skettenis extern void ui_out_wrap_hint (struct ui_out *uiout, char *identstring); 144*b725ae77Skettenis 145*b725ae77Skettenis extern void ui_out_flush (struct ui_out *uiout); 146*b725ae77Skettenis 147*b725ae77Skettenis extern void ui_out_get_field_separator (struct ui_out *uiout); 148*b725ae77Skettenis 149*b725ae77Skettenis extern int ui_out_set_flags (struct ui_out *uiout, int mask); 150*b725ae77Skettenis 151*b725ae77Skettenis extern int ui_out_clear_flags (struct ui_out *uiout, int mask); 152*b725ae77Skettenis 153*b725ae77Skettenis extern int ui_out_get_verblvl (struct ui_out *uiout); 154*b725ae77Skettenis 155*b725ae77Skettenis extern int ui_out_test_flags (struct ui_out *uiout, int mask); 156*b725ae77Skettenis 157*b725ae77Skettenis #if 0 158*b725ae77Skettenis extern void ui_out_result_begin (struct ui_out *uiout, char *class); 159*b725ae77Skettenis 160*b725ae77Skettenis extern void ui_out_result_end (struct ui_out *uiout); 161*b725ae77Skettenis 162*b725ae77Skettenis extern void ui_out_info_begin (struct ui_out *uiout, char *class); 163*b725ae77Skettenis 164*b725ae77Skettenis extern void ui_out_info_end (struct ui_out *uiout); 165*b725ae77Skettenis 166*b725ae77Skettenis extern void ui_out_notify_begin (struct ui_out *uiout, char *class); 167*b725ae77Skettenis 168*b725ae77Skettenis extern void ui_out_notify_end (struct ui_out *uiout); 169*b725ae77Skettenis 170*b725ae77Skettenis extern void ui_out_error_begin (struct ui_out *uiout, char *class); 171*b725ae77Skettenis 172*b725ae77Skettenis extern void ui_out_error_end (struct ui_out *uiout); 173*b725ae77Skettenis #endif 174*b725ae77Skettenis 175*b725ae77Skettenis #if 0 176*b725ae77Skettenis extern void gdb_error (struct ui_out *uiout, int severity, char *format, ...); 177*b725ae77Skettenis 178*b725ae77Skettenis extern void gdb_query (struct ui_out *uiout, int qflags, char *qprompt); 179*b725ae77Skettenis #endif 180*b725ae77Skettenis 181*b725ae77Skettenis /* HACK: Code in GDB is currently checking to see the type of ui_out 182*b725ae77Skettenis builder when determining which output to produce. This function is 183*b725ae77Skettenis a hack to encapsulate that test. Once GDB manages to separate the 184*b725ae77Skettenis CLI/MI from the core of GDB the problem should just go away .... */ 185*b725ae77Skettenis 186*b725ae77Skettenis extern int ui_out_is_mi_like_p (struct ui_out *uiout); 187*b725ae77Skettenis 188*b725ae77Skettenis /* From here on we have things that are only needed by implementation 189*b725ae77Skettenis routines and main.c. We should pehaps have a separate file for that, 190*b725ae77Skettenis like a ui-out-impl.h file */ 191*b725ae77Skettenis 192*b725ae77Skettenis /* User Interface Output Implementation Function Table */ 193*b725ae77Skettenis 194*b725ae77Skettenis /* Type definition of all implementation functions. */ 195*b725ae77Skettenis 196*b725ae77Skettenis typedef void (table_begin_ftype) (struct ui_out * uiout, 197*b725ae77Skettenis int nbrofcols, int nr_rows, 198*b725ae77Skettenis const char *tblid); 199*b725ae77Skettenis typedef void (table_body_ftype) (struct ui_out * uiout); 200*b725ae77Skettenis typedef void (table_end_ftype) (struct ui_out * uiout); 201*b725ae77Skettenis typedef void (table_header_ftype) (struct ui_out * uiout, int width, 202*b725ae77Skettenis enum ui_align align, const char *col_name, 203*b725ae77Skettenis const char *colhdr); 204*b725ae77Skettenis /* Note: level 0 is the top-level so LEVEL is always greater than 205*b725ae77Skettenis zero. */ 206*b725ae77Skettenis typedef void (ui_out_begin_ftype) (struct ui_out *uiout, 207*b725ae77Skettenis enum ui_out_type type, 208*b725ae77Skettenis int level, const char *id); 209*b725ae77Skettenis typedef void (ui_out_end_ftype) (struct ui_out *uiout, 210*b725ae77Skettenis enum ui_out_type type, 211*b725ae77Skettenis int level); 212*b725ae77Skettenis typedef void (field_int_ftype) (struct ui_out * uiout, int fldno, int width, 213*b725ae77Skettenis enum ui_align align, 214*b725ae77Skettenis const char *fldname, int value); 215*b725ae77Skettenis typedef void (field_skip_ftype) (struct ui_out * uiout, int fldno, int width, 216*b725ae77Skettenis enum ui_align align, 217*b725ae77Skettenis const char *fldname); 218*b725ae77Skettenis typedef void (field_string_ftype) (struct ui_out * uiout, int fldno, int width, 219*b725ae77Skettenis enum ui_align align, 220*b725ae77Skettenis const char *fldname, 221*b725ae77Skettenis const char *string); 222*b725ae77Skettenis typedef void (field_fmt_ftype) (struct ui_out * uiout, int fldno, int width, 223*b725ae77Skettenis enum ui_align align, 224*b725ae77Skettenis const char *fldname, 225*b725ae77Skettenis const char *format, 226*b725ae77Skettenis va_list args); 227*b725ae77Skettenis typedef void (spaces_ftype) (struct ui_out * uiout, int numspaces); 228*b725ae77Skettenis typedef void (text_ftype) (struct ui_out * uiout, 229*b725ae77Skettenis const char *string); 230*b725ae77Skettenis typedef void (message_ftype) (struct ui_out * uiout, int verbosity, 231*b725ae77Skettenis const char *format, va_list args); 232*b725ae77Skettenis typedef void (wrap_hint_ftype) (struct ui_out * uiout, char *identstring); 233*b725ae77Skettenis typedef void (flush_ftype) (struct ui_out * uiout); 234*b725ae77Skettenis typedef int (redirect_ftype) (struct ui_out * uiout, 235*b725ae77Skettenis struct ui_file * outstream); 236*b725ae77Skettenis 237*b725ae77Skettenis /* ui-out-impl */ 238*b725ae77Skettenis 239*b725ae77Skettenis /* IMPORTANT: If you change this structure, make sure to change the default 240*b725ae77Skettenis initialization in ui-out.c */ 241*b725ae77Skettenis 242*b725ae77Skettenis struct ui_out_impl 243*b725ae77Skettenis { 244*b725ae77Skettenis table_begin_ftype *table_begin; 245*b725ae77Skettenis table_body_ftype *table_body; 246*b725ae77Skettenis table_end_ftype *table_end; 247*b725ae77Skettenis table_header_ftype *table_header; 248*b725ae77Skettenis ui_out_begin_ftype *begin; 249*b725ae77Skettenis ui_out_end_ftype *end; 250*b725ae77Skettenis field_int_ftype *field_int; 251*b725ae77Skettenis field_skip_ftype *field_skip; 252*b725ae77Skettenis field_string_ftype *field_string; 253*b725ae77Skettenis field_fmt_ftype *field_fmt; 254*b725ae77Skettenis spaces_ftype *spaces; 255*b725ae77Skettenis text_ftype *text; 256*b725ae77Skettenis message_ftype *message; 257*b725ae77Skettenis wrap_hint_ftype *wrap_hint; 258*b725ae77Skettenis flush_ftype *flush; 259*b725ae77Skettenis redirect_ftype *redirect; 260*b725ae77Skettenis int is_mi_like_p; 261*b725ae77Skettenis }; 262*b725ae77Skettenis 263*b725ae77Skettenis extern struct ui_out_data *ui_out_data (struct ui_out *uiout); 264*b725ae77Skettenis 265*b725ae77Skettenis 266*b725ae77Skettenis /* Create a ui_out object */ 267*b725ae77Skettenis 268*b725ae77Skettenis extern struct ui_out *ui_out_new (struct ui_out_impl *impl, 269*b725ae77Skettenis struct ui_out_data *data, 270*b725ae77Skettenis int flags); 271*b725ae77Skettenis 272*b725ae77Skettenis /* Redirect the ouptut of a ui_out object temporarily. */ 273*b725ae77Skettenis 274*b725ae77Skettenis extern int ui_out_redirect (struct ui_out *uiout, struct ui_file *outstream); 275*b725ae77Skettenis 276*b725ae77Skettenis #endif /* UI_OUT_H */ 277