1 /* Output generating routines for GDB CLI. 2 3 Copyright (C) 1999, 2000, 2001, 2002, 2003, 2005, 2007, 2008, 2009, 2010, 4 2011 Free Software Foundation, Inc. 5 6 Contributed by Cygnus Solutions. 7 Written by Fernando Nasser for Cygnus. 8 9 This file is part of GDB. 10 11 This program is free software; you can redistribute it and/or modify 12 it under the terms of the GNU General Public License as published by 13 the Free Software Foundation; either version 3 of the License, or 14 (at your option) any later version. 15 16 This program is distributed in the hope that it will be useful, 17 but WITHOUT ANY WARRANTY; without even the implied warranty of 18 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 19 GNU General Public License for more details. 20 21 You should have received a copy of the GNU General Public License 22 along with this program. If not, see <http://www.gnu.org/licenses/>. */ 23 24 #include "defs.h" 25 #include "ui-out.h" 26 #include "cli-out.h" 27 #include "tui.h" 28 #include "gdb_string.h" 29 #include "gdb_assert.h" 30 31 struct tui_ui_out_data 32 { 33 struct cli_ui_out_data base; 34 35 int line; 36 int start_of_line; 37 }; 38 typedef struct tui_ui_out_data tui_out_data; 39 40 /* This is the TUI ui-out implementation functions vector. It is 41 initialized below in _initialize_tui_out, inheriting the CLI 42 version, and overriding a few methods. */ 43 44 static struct ui_out_impl tui_ui_out_impl; 45 46 /* Output an int field. */ 47 48 static void 49 tui_field_int (struct ui_out *uiout, 50 int fldno, int width, 51 enum ui_align alignment, 52 const char *fldname, 53 int value) 54 { 55 tui_out_data *data = ui_out_data (uiout); 56 57 if (data->base.suppress_output) 58 return; 59 60 /* Don't print line number, keep it for later. */ 61 if (data->start_of_line == 0 && strcmp (fldname, "line") == 0) 62 { 63 data->start_of_line ++; 64 data->line = value; 65 return; 66 } 67 data->start_of_line ++; 68 69 (*cli_ui_out_impl.field_int) (uiout, fldno, 70 width, alignment, fldname, value); 71 } 72 73 /* Other cli_field_* end up here so alignment and field separators are 74 both handled by tui_field_string. */ 75 76 static void 77 tui_field_string (struct ui_out *uiout, 78 int fldno, int width, 79 enum ui_align align, 80 const char *fldname, 81 const char *string) 82 { 83 tui_out_data *data = ui_out_data (uiout); 84 85 if (data->base.suppress_output) 86 return; 87 88 if (fldname && data->line > 0 && strcmp (fldname, "file") == 0) 89 { 90 data->start_of_line ++; 91 if (data->line > 0) 92 { 93 tui_show_source (string, data->line); 94 } 95 return; 96 } 97 98 data->start_of_line++; 99 100 (*cli_ui_out_impl.field_string) (uiout, fldno, 101 width, align, 102 fldname, string); 103 } 104 105 /* This is the only field function that does not align. */ 106 107 static void 108 tui_field_fmt (struct ui_out *uiout, int fldno, 109 int width, enum ui_align align, 110 const char *fldname, 111 const char *format, 112 va_list args) 113 { 114 tui_out_data *data = ui_out_data (uiout); 115 116 if (data->base.suppress_output) 117 return; 118 119 data->start_of_line++; 120 121 (*cli_ui_out_impl.field_fmt) (uiout, fldno, 122 width, align, 123 fldname, format, args); 124 } 125 126 static void 127 tui_text (struct ui_out *uiout, const char *string) 128 { 129 tui_out_data *data = ui_out_data (uiout); 130 131 if (data->base.suppress_output) 132 return; 133 data->start_of_line ++; 134 if (data->line > 0) 135 { 136 if (strchr (string, '\n') != 0) 137 { 138 data->line = -1; 139 data->start_of_line = 0; 140 } 141 return; 142 } 143 if (strchr (string, '\n')) 144 data->start_of_line = 0; 145 146 (*cli_ui_out_impl.text) (uiout, string); 147 } 148 149 struct ui_out * 150 tui_out_new (struct ui_file *stream) 151 { 152 int flags = 0; 153 154 tui_out_data *data = XMALLOC (tui_out_data); 155 156 /* Initialize base "class". */ 157 cli_out_data_ctor (&data->base, stream); 158 159 /* Initialize our fields. */ 160 data->line = -1; 161 data->start_of_line = 0; 162 163 return ui_out_new (&tui_ui_out_impl, data, flags); 164 } 165 166 /* Standard gdb initialization hook. */ 167 168 extern void _initialize_tui_out (void); 169 170 void 171 _initialize_tui_out (void) 172 { 173 /* Inherit the CLI version. */ 174 tui_ui_out_impl = cli_ui_out_impl; 175 176 /* Override a few methods. */ 177 tui_ui_out_impl.field_int = tui_field_int; 178 tui_ui_out_impl.field_string = tui_field_string; 179 tui_ui_out_impl.field_fmt = tui_field_fmt; 180 tui_ui_out_impl.text = tui_text; 181 } 182