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