Don't create empty literal pieces
[deliverable/binutils-gdb.git] / gdb / cli-out.c
CommitLineData
8b93c638 1/* Output generating routines for GDB CLI.
349c5d5f 2
42a4f53d 3 Copyright (C) 1999-2019 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"
4de283e4 24#include "ui-out.h"
8b93c638 25#include "cli-out.h"
82083d6d 26#include "completer.h"
82083d6d 27#include "readline/readline.h"
4de283e4 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 75 do_field_string (0, width, alignment, 0, col_hdr.c_str (),
e43b10e1 76 ui_file_style ());
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 95void
381befee
TT
96cli_ui_out::do_field_signed (int fldno, int width, ui_align alignment,
97 const char *fldname, LONGEST value)
8b93c638 98{
112e8700 99 if (m_suppress_output)
698384cd 100 return;
112e8700 101
381befee 102 do_field_string (fldno, width, alignment, fldname, plongest (value),
e43b10e1 103 ui_file_style ());
8b93c638
JM
104}
105
1f77b012
TT
106/* output an unsigned field */
107
108void
109cli_ui_out::do_field_unsigned (int fldno, int width, ui_align alignment,
110 const char *fldname, ULONGEST value)
111{
112 if (m_suppress_output)
113 return;
114
115 do_field_string (fldno, width, alignment, fldname, pulongest (value),
e43b10e1 116 ui_file_style ());
1f77b012
TT
117}
118
112e8700 119/* used to omit a field */
8b93c638 120
112e8700
SM
121void
122cli_ui_out::do_field_skip (int fldno, int width, ui_align alignment,
123 const char *fldname)
8b93c638 124{
112e8700 125 if (m_suppress_output)
698384cd 126 return;
0a8fce9a 127
cbe56571 128 do_field_string (fldno, width, alignment, fldname, "",
e43b10e1 129 ui_file_style ());
8b93c638
JM
130}
131
132/* other specific cli_field_* end up here so alignment and field
133 separators are both handled by cli_field_string */
134
112e8700
SM
135void
136cli_ui_out::do_field_string (int fldno, int width, ui_align align,
cbe56571 137 const char *fldname, const char *string,
e43b10e1 138 const ui_file_style &style)
8b93c638
JM
139{
140 int before = 0;
141 int after = 0;
c5504eaf 142
112e8700 143 if (m_suppress_output)
698384cd
AC
144 return;
145
8b93c638
JM
146 if ((align != ui_noalign) && string)
147 {
148 before = width - strlen (string);
149 if (before <= 0)
150 before = 0;
151 else
152 {
153 if (align == ui_right)
154 after = 0;
155 else if (align == ui_left)
156 {
157 after = before;
158 before = 0;
159 }
160 else
161 /* ui_center */
162 {
163 after = before / 2;
164 before -= after;
165 }
166 }
167 }
168
169 if (before)
112e8700
SM
170 spaces (before);
171
8b93c638 172 if (string)
e43b10e1 173 fputs_styled (string, style, m_streams.back ());
112e8700 174
8b93c638 175 if (after)
112e8700 176 spaces (after);
8b93c638
JM
177
178 if (align != ui_noalign)
179 field_separator ();
180}
181
1871a62d 182/* Output field containing ARGS using printf formatting in FORMAT. */
8b93c638 183
112e8700
SM
184void
185cli_ui_out::do_field_fmt (int fldno, int width, ui_align align,
186 const char *fldname, const char *format,
187 va_list args)
8b93c638 188{
112e8700 189 if (m_suppress_output)
698384cd
AC
190 return;
191
1871a62d 192 std::string str = string_vprintf (format, args);
8b93c638 193
cbe56571 194 do_field_string (fldno, width, align, fldname, str.c_str (),
e43b10e1 195 ui_file_style ());
8b93c638
JM
196}
197
112e8700
SM
198void
199cli_ui_out::do_spaces (int numspaces)
8b93c638 200{
112e8700 201 if (m_suppress_output)
698384cd 202 return;
14dba4b4 203
112e8700 204 print_spaces_filtered (numspaces, m_streams.back ());
8b93c638
JM
205}
206
112e8700
SM
207void
208cli_ui_out::do_text (const char *string)
8b93c638 209{
112e8700 210 if (m_suppress_output)
698384cd 211 return;
14dba4b4 212
112e8700 213 fputs_filtered (string, m_streams.back ());
8b93c638
JM
214}
215
112e8700
SM
216void
217cli_ui_out::do_message (const char *format, va_list args)
8b93c638 218{
112e8700 219 if (m_suppress_output)
698384cd 220 return;
14dba4b4 221
112e8700 222 vfprintf_unfiltered (m_streams.back (), format, args);
8b93c638
JM
223}
224
112e8700
SM
225void
226cli_ui_out::do_wrap_hint (const char *identstring)
8b93c638 227{
112e8700 228 if (m_suppress_output)
698384cd 229 return;
112e8700 230
8b93c638
JM
231 wrap_here (identstring);
232}
233
112e8700
SM
234void
235cli_ui_out::do_flush ()
8b93c638 236{
112e8700 237 gdb_flush (m_streams.back ());
8b93c638
JM
238}
239
14dba4b4
JK
240/* OUTSTREAM as non-NULL will push OUTSTREAM on the stack of output streams
241 and make it therefore active. OUTSTREAM as NULL will pop the last pushed
242 output stream; it is an internal error if it does not exist. */
243
7becfd03 244void
112e8700 245cli_ui_out::do_redirect (ui_file *outstream)
0fac0b41 246{
0fac0b41 247 if (outstream != NULL)
112e8700 248 m_streams.push_back (outstream);
14dba4b4 249 else
112e8700 250 m_streams.pop_back ();
0fac0b41
DJ
251}
252
8b93c638
JM
253/* local functions */
254
112e8700
SM
255void
256cli_ui_out::field_separator ()
8b93c638 257{
112e8700 258 fputc_filtered (' ', m_streams.back ());
8b93c638
JM
259}
260
112e8700 261/* Constructor for cli_ui_out. */
02a45ac0 262
112e8700
SM
263cli_ui_out::cli_ui_out (ui_file *stream, ui_out_flags flags)
264: ui_out (flags),
265 m_suppress_output (false)
0a8fce9a 266{
14dba4b4
JK
267 gdb_assert (stream != NULL);
268
112e8700
SM
269 m_streams.push_back (stream);
270}
14dba4b4 271
112e8700
SM
272cli_ui_out::~cli_ui_out ()
273{
0a8fce9a
PA
274}
275
276/* Initialize private members at startup. */
8b93c638 277
112e8700 278cli_ui_out *
8b93c638
JM
279cli_out_new (struct ui_file *stream)
280{
112e8700 281 return new cli_ui_out (stream, ui_source_list);
8b93c638
JM
282}
283
112e8700
SM
284ui_file *
285cli_ui_out::set_stream (struct ui_file *stream)
4389a95a 286{
112e8700 287 ui_file *old;
b9b118c3 288
112e8700
SM
289 old = m_streams.back ();
290 m_streams.back () = stream;
c5504eaf 291
4389a95a
AC
292 return old;
293}
b9b118c3 294
046bebe1
TT
295bool
296cli_ui_out::can_emit_style_escape () const
297{
298 return m_streams.back ()->can_emit_style_escape ();
299}
300
82083d6d
DE
301/* CLI interface to display tab-completion matches. */
302
303/* CLI version of displayer.crlf. */
304
305static void
306cli_mld_crlf (const struct match_list_displayer *displayer)
307{
308 rl_crlf ();
309}
310
311/* CLI version of displayer.putch. */
312
313static void
314cli_mld_putch (const struct match_list_displayer *displayer, int ch)
315{
316 putc (ch, rl_outstream);
317}
318
319/* CLI version of displayer.puts. */
320
321static void
322cli_mld_puts (const struct match_list_displayer *displayer, const char *s)
323{
324 fputs (s, rl_outstream);
325}
326
327/* CLI version of displayer.flush. */
328
329static void
330cli_mld_flush (const struct match_list_displayer *displayer)
331{
332 fflush (rl_outstream);
333}
334
56000a98
PA
335EXTERN_C void _rl_erase_entire_line (void);
336
82083d6d
DE
337/* CLI version of displayer.erase_entire_line. */
338
339static void
340cli_mld_erase_entire_line (const struct match_list_displayer *displayer)
341{
82083d6d
DE
342 _rl_erase_entire_line ();
343}
344
345/* CLI version of displayer.beep. */
346
347static void
348cli_mld_beep (const struct match_list_displayer *displayer)
349{
350 rl_ding ();
351}
352
353/* CLI version of displayer.read_key. */
354
355static int
356cli_mld_read_key (const struct match_list_displayer *displayer)
357{
358 return rl_read_key ();
359}
360
361/* CLI version of rl_completion_display_matches_hook.
362 See gdb_display_match_list for a description of the arguments. */
363
364void
365cli_display_match_list (char **matches, int len, int max)
366{
367 struct match_list_displayer displayer;
368
369 rl_get_screen_size (&displayer.height, &displayer.width);
370 displayer.crlf = cli_mld_crlf;
371 displayer.putch = cli_mld_putch;
372 displayer.puts = cli_mld_puts;
373 displayer.flush = cli_mld_flush;
374 displayer.erase_entire_line = cli_mld_erase_entire_line;
375 displayer.beep = cli_mld_beep;
376 displayer.read_key = cli_mld_read_key;
377
378 gdb_display_match_list (matches, len, max, &displayer);
379 rl_forced_update_display ();
380}
This page took 1.216782 seconds and 4 git commands to generate.