Add output styles to gdb
[deliverable/binutils-gdb.git] / gdb / cli-out.c
CommitLineData
8b93c638 1/* Output generating routines for GDB CLI.
349c5d5f 2
e2882c85 3 Copyright (C) 1999-2018 Free Software Foundation, Inc.
349c5d5f 4
8b93c638
JM
5 Contributed by Cygnus Solutions.
6 Written by Fernando Nasser for Cygnus.
7
8 This file is part of GDB.
9
10 This program is free software; you can redistribute it and/or modify
11 it under the terms of the GNU General Public License as published by
a9762ec7 12 the Free Software Foundation; either version 3 of the License, or
8b93c638
JM
13 (at your option) any later version.
14
15 This program is distributed in the hope that it will be useful,
16 but WITHOUT ANY WARRANTY; without even the implied warranty of
17 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
18 GNU General Public License for more details.
19
20 You should have received a copy of the GNU General Public License
a9762ec7 21 along with this program. If not, see <http://www.gnu.org/licenses/>. */
8b93c638
JM
22
23#include "defs.h"
24#include "ui-out.h"
25#include "cli-out.h"
82083d6d 26#include "completer.h"
82083d6d 27#include "readline/readline.h"
cbe56571 28#include "cli/cli-style.h"
8b93c638 29
02a45ac0
PA
30/* These are the CLI output functions */
31
8b93c638
JM
32/* Mark beginning of a table */
33
112e8700
SM
34void
35cli_ui_out::do_table_begin (int nbrofcols, int nr_rows, const char *tblid)
8b93c638 36{
698384cd 37 if (nr_rows == 0)
112e8700 38 m_suppress_output = true;
698384cd 39 else
ce2826aa 40 /* Only the table suppresses the output and, fortunately, a table
30fdc99f 41 is not a recursive data structure. */
112e8700 42 gdb_assert (!m_suppress_output);
8b93c638
JM
43}
44
45/* Mark beginning of a table body */
46
112e8700
SM
47void
48cli_ui_out::do_table_body ()
8b93c638 49{
112e8700 50 if (m_suppress_output)
698384cd 51 return;
112e8700 52
8b93c638 53 /* first, close the table header line */
112e8700 54 text ("\n");
8b93c638
JM
55}
56
57/* Mark end of a table */
58
112e8700
SM
59void
60cli_ui_out::do_table_end ()
8b93c638 61{
112e8700 62 m_suppress_output = false;
8b93c638
JM
63}
64
65/* Specify table header */
66
112e8700
SM
67void
68cli_ui_out::do_table_header (int width, ui_align alignment,
69 const std::string &col_name,
70 const std::string &col_hdr)
8b93c638 71{
112e8700 72 if (m_suppress_output)
698384cd 73 return;
0a8fce9a 74
cbe56571
TT
75 do_field_string (0, width, alignment, 0, col_hdr.c_str (),
76 ui_out_style_kind::DEFAULT);
8b93c638
JM
77}
78
79/* Mark beginning of a list */
80
112e8700
SM
81void
82cli_ui_out::do_begin (ui_out_type type, const char *id)
8b93c638
JM
83{
84}
85
86/* Mark end of a list */
87
112e8700
SM
88void
89cli_ui_out::do_end (ui_out_type type)
8b93c638
JM
90{
91}
92
93/* output an int field */
94
112e8700
SM
95void
96cli_ui_out::do_field_int (int fldno, int width, ui_align alignment,
97 const char *fldname, int value)
8b93c638 98{
112e8700 99 if (m_suppress_output)
698384cd 100 return;
112e8700 101
d63095c4 102 std::string str = string_printf ("%d", value);
0a8fce9a 103
cbe56571
TT
104 do_field_string (fldno, width, alignment, fldname, str.c_str (),
105 ui_out_style_kind::DEFAULT);
8b93c638
JM
106}
107
112e8700 108/* used to omit a field */
8b93c638 109
112e8700
SM
110void
111cli_ui_out::do_field_skip (int fldno, int width, ui_align alignment,
112 const char *fldname)
8b93c638 113{
112e8700 114 if (m_suppress_output)
698384cd 115 return;
0a8fce9a 116
cbe56571
TT
117 do_field_string (fldno, width, alignment, fldname, "",
118 ui_out_style_kind::DEFAULT);
8b93c638
JM
119}
120
121/* other specific cli_field_* end up here so alignment and field
122 separators are both handled by cli_field_string */
123
112e8700
SM
124void
125cli_ui_out::do_field_string (int fldno, int width, ui_align align,
cbe56571
TT
126 const char *fldname, const char *string,
127 ui_out_style_kind style)
8b93c638
JM
128{
129 int before = 0;
130 int after = 0;
c5504eaf 131
112e8700 132 if (m_suppress_output)
698384cd
AC
133 return;
134
8b93c638
JM
135 if ((align != ui_noalign) && string)
136 {
137 before = width - strlen (string);
138 if (before <= 0)
139 before = 0;
140 else
141 {
142 if (align == ui_right)
143 after = 0;
144 else if (align == ui_left)
145 {
146 after = before;
147 before = 0;
148 }
149 else
150 /* ui_center */
151 {
152 after = before / 2;
153 before -= after;
154 }
155 }
156 }
157
158 if (before)
112e8700
SM
159 spaces (before);
160
8b93c638 161 if (string)
cbe56571
TT
162 {
163 ui_file_style fstyle;
164 switch (style)
165 {
166 case ui_out_style_kind::DEFAULT:
167 /* Nothing. */
168 break;
169 case ui_out_style_kind::FILE:
170 /* Nothing. */
171 fstyle = file_name_style.style ();
172 break;
173 case ui_out_style_kind::FUNCTION:
174 fstyle = function_name_style.style ();
175 break;
176 default:
177 gdb_assert_not_reached ("missing case");
178 }
179 fputs_styled (string, fstyle, m_streams.back ());
180 }
112e8700 181
8b93c638 182 if (after)
112e8700 183 spaces (after);
8b93c638
JM
184
185 if (align != ui_noalign)
186 field_separator ();
187}
188
1871a62d 189/* Output field containing ARGS using printf formatting in FORMAT. */
8b93c638 190
112e8700
SM
191void
192cli_ui_out::do_field_fmt (int fldno, int width, ui_align align,
193 const char *fldname, const char *format,
194 va_list args)
8b93c638 195{
112e8700 196 if (m_suppress_output)
698384cd
AC
197 return;
198
1871a62d 199 std::string str = string_vprintf (format, args);
8b93c638 200
cbe56571
TT
201 do_field_string (fldno, width, align, fldname, str.c_str (),
202 ui_out_style_kind::DEFAULT);
8b93c638
JM
203}
204
112e8700
SM
205void
206cli_ui_out::do_spaces (int numspaces)
8b93c638 207{
112e8700 208 if (m_suppress_output)
698384cd 209 return;
14dba4b4 210
112e8700 211 print_spaces_filtered (numspaces, m_streams.back ());
8b93c638
JM
212}
213
112e8700
SM
214void
215cli_ui_out::do_text (const char *string)
8b93c638 216{
112e8700 217 if (m_suppress_output)
698384cd 218 return;
14dba4b4 219
112e8700 220 fputs_filtered (string, m_streams.back ());
8b93c638
JM
221}
222
112e8700
SM
223void
224cli_ui_out::do_message (const char *format, va_list args)
8b93c638 225{
112e8700 226 if (m_suppress_output)
698384cd 227 return;
14dba4b4 228
112e8700 229 vfprintf_unfiltered (m_streams.back (), format, args);
8b93c638
JM
230}
231
112e8700
SM
232void
233cli_ui_out::do_wrap_hint (const char *identstring)
8b93c638 234{
112e8700 235 if (m_suppress_output)
698384cd 236 return;
112e8700 237
8b93c638
JM
238 wrap_here (identstring);
239}
240
112e8700
SM
241void
242cli_ui_out::do_flush ()
8b93c638 243{
112e8700 244 gdb_flush (m_streams.back ());
8b93c638
JM
245}
246
14dba4b4
JK
247/* OUTSTREAM as non-NULL will push OUTSTREAM on the stack of output streams
248 and make it therefore active. OUTSTREAM as NULL will pop the last pushed
249 output stream; it is an internal error if it does not exist. */
250
7becfd03 251void
112e8700 252cli_ui_out::do_redirect (ui_file *outstream)
0fac0b41 253{
0fac0b41 254 if (outstream != NULL)
112e8700 255 m_streams.push_back (outstream);
14dba4b4 256 else
112e8700 257 m_streams.pop_back ();
0fac0b41
DJ
258}
259
8b93c638
JM
260/* local functions */
261
112e8700
SM
262void
263cli_ui_out::field_separator ()
8b93c638 264{
112e8700 265 fputc_filtered (' ', m_streams.back ());
8b93c638
JM
266}
267
112e8700 268/* Constructor for cli_ui_out. */
02a45ac0 269
112e8700
SM
270cli_ui_out::cli_ui_out (ui_file *stream, ui_out_flags flags)
271: ui_out (flags),
272 m_suppress_output (false)
0a8fce9a 273{
14dba4b4
JK
274 gdb_assert (stream != NULL);
275
112e8700
SM
276 m_streams.push_back (stream);
277}
14dba4b4 278
112e8700
SM
279cli_ui_out::~cli_ui_out ()
280{
0a8fce9a
PA
281}
282
283/* Initialize private members at startup. */
8b93c638 284
112e8700 285cli_ui_out *
8b93c638
JM
286cli_out_new (struct ui_file *stream)
287{
112e8700 288 return new cli_ui_out (stream, ui_source_list);
8b93c638
JM
289}
290
112e8700
SM
291ui_file *
292cli_ui_out::set_stream (struct ui_file *stream)
4389a95a 293{
112e8700 294 ui_file *old;
b9b118c3 295
112e8700
SM
296 old = m_streams.back ();
297 m_streams.back () = stream;
c5504eaf 298
4389a95a
AC
299 return old;
300}
b9b118c3 301
82083d6d
DE
302/* CLI interface to display tab-completion matches. */
303
304/* CLI version of displayer.crlf. */
305
306static void
307cli_mld_crlf (const struct match_list_displayer *displayer)
308{
309 rl_crlf ();
310}
311
312/* CLI version of displayer.putch. */
313
314static void
315cli_mld_putch (const struct match_list_displayer *displayer, int ch)
316{
317 putc (ch, rl_outstream);
318}
319
320/* CLI version of displayer.puts. */
321
322static void
323cli_mld_puts (const struct match_list_displayer *displayer, const char *s)
324{
325 fputs (s, rl_outstream);
326}
327
328/* CLI version of displayer.flush. */
329
330static void
331cli_mld_flush (const struct match_list_displayer *displayer)
332{
333 fflush (rl_outstream);
334}
335
56000a98
PA
336EXTERN_C void _rl_erase_entire_line (void);
337
82083d6d
DE
338/* CLI version of displayer.erase_entire_line. */
339
340static void
341cli_mld_erase_entire_line (const struct match_list_displayer *displayer)
342{
82083d6d
DE
343 _rl_erase_entire_line ();
344}
345
346/* CLI version of displayer.beep. */
347
348static void
349cli_mld_beep (const struct match_list_displayer *displayer)
350{
351 rl_ding ();
352}
353
354/* CLI version of displayer.read_key. */
355
356static int
357cli_mld_read_key (const struct match_list_displayer *displayer)
358{
359 return rl_read_key ();
360}
361
362/* CLI version of rl_completion_display_matches_hook.
363 See gdb_display_match_list for a description of the arguments. */
364
365void
366cli_display_match_list (char **matches, int len, int max)
367{
368 struct match_list_displayer displayer;
369
370 rl_get_screen_size (&displayer.height, &displayer.width);
371 displayer.crlf = cli_mld_crlf;
372 displayer.putch = cli_mld_putch;
373 displayer.puts = cli_mld_puts;
374 displayer.flush = cli_mld_flush;
375 displayer.erase_entire_line = cli_mld_erase_entire_line;
376 displayer.beep = cli_mld_beep;
377 displayer.read_key = cli_mld_read_key;
378
379 gdb_display_match_list (matches, len, max, &displayer);
380 rl_forced_update_display ();
381}
This page took 1.543707 seconds and 4 git commands to generate.