Refactor Sized_relobj_file::do_relocate_sections.
[deliverable/binutils-gdb.git] / gdb / cli-out.c
CommitLineData
8b93c638 1/* Output generating routines for GDB CLI.
349c5d5f 2
61baf725 3 Copyright (C) 1999-2017 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"
8b93c638 28
02a45ac0
PA
29/* These are the CLI output functions */
30
8b93c638
JM
31/* Mark beginning of a table */
32
112e8700
SM
33void
34cli_ui_out::do_table_begin (int nbrofcols, int nr_rows, const char *tblid)
8b93c638 35{
698384cd 36 if (nr_rows == 0)
112e8700 37 m_suppress_output = true;
698384cd 38 else
ce2826aa 39 /* Only the table suppresses the output and, fortunately, a table
30fdc99f 40 is not a recursive data structure. */
112e8700 41 gdb_assert (!m_suppress_output);
8b93c638
JM
42}
43
44/* Mark beginning of a table body */
45
112e8700
SM
46void
47cli_ui_out::do_table_body ()
8b93c638 48{
112e8700 49 if (m_suppress_output)
698384cd 50 return;
112e8700 51
8b93c638 52 /* first, close the table header line */
112e8700 53 text ("\n");
8b93c638
JM
54}
55
56/* Mark end of a table */
57
112e8700
SM
58void
59cli_ui_out::do_table_end ()
8b93c638 60{
112e8700 61 m_suppress_output = false;
8b93c638
JM
62}
63
64/* Specify table header */
65
112e8700
SM
66void
67cli_ui_out::do_table_header (int width, ui_align alignment,
68 const std::string &col_name,
69 const std::string &col_hdr)
8b93c638 70{
112e8700 71 if (m_suppress_output)
698384cd 72 return;
0a8fce9a 73
112e8700 74 do_field_string (0, width, alignment, 0, col_hdr.c_str ());
8b93c638
JM
75}
76
77/* Mark beginning of a list */
78
112e8700
SM
79void
80cli_ui_out::do_begin (ui_out_type type, const char *id)
8b93c638
JM
81{
82}
83
84/* Mark end of a list */
85
112e8700
SM
86void
87cli_ui_out::do_end (ui_out_type type)
8b93c638
JM
88{
89}
90
91/* output an int field */
92
112e8700
SM
93void
94cli_ui_out::do_field_int (int fldno, int width, ui_align alignment,
95 const char *fldname, int value)
8b93c638 96{
c5504eaf 97 char buffer[20]; /* FIXME: how many chars long a %d can become? */
c5504eaf 98
112e8700 99 if (m_suppress_output)
698384cd 100 return;
112e8700 101
08850b56 102 xsnprintf (buffer, sizeof (buffer), "%d", value);
0a8fce9a 103
112e8700 104 do_field_string (fldno, width, alignment, fldname, buffer);
8b93c638
JM
105}
106
112e8700 107/* used to omit a field */
8b93c638 108
112e8700
SM
109void
110cli_ui_out::do_field_skip (int fldno, int width, ui_align alignment,
111 const char *fldname)
8b93c638 112{
112e8700 113 if (m_suppress_output)
698384cd 114 return;
0a8fce9a 115
112e8700 116 do_field_string (fldno, width, alignment, fldname, "");
8b93c638
JM
117}
118
119/* other specific cli_field_* end up here so alignment and field
120 separators are both handled by cli_field_string */
121
112e8700
SM
122void
123cli_ui_out::do_field_string (int fldno, int width, ui_align align,
124 const char *fldname, const char *string)
8b93c638
JM
125{
126 int before = 0;
127 int after = 0;
c5504eaf 128
112e8700 129 if (m_suppress_output)
698384cd
AC
130 return;
131
8b93c638
JM
132 if ((align != ui_noalign) && string)
133 {
134 before = width - strlen (string);
135 if (before <= 0)
136 before = 0;
137 else
138 {
139 if (align == ui_right)
140 after = 0;
141 else if (align == ui_left)
142 {
143 after = before;
144 before = 0;
145 }
146 else
147 /* ui_center */
148 {
149 after = before / 2;
150 before -= after;
151 }
152 }
153 }
154
155 if (before)
112e8700
SM
156 spaces (before);
157
8b93c638 158 if (string)
112e8700
SM
159 out_field_fmt (fldno, fldname, "%s", string);
160
8b93c638 161 if (after)
112e8700 162 spaces (after);
8b93c638
JM
163
164 if (align != ui_noalign)
165 field_separator ();
166}
167
30fdc99f 168/* This is the only field function that does not align. */
8b93c638 169
112e8700
SM
170void
171cli_ui_out::do_field_fmt (int fldno, int width, ui_align align,
172 const char *fldname, const char *format,
173 va_list args)
8b93c638 174{
112e8700 175 if (m_suppress_output)
698384cd
AC
176 return;
177
112e8700 178 vfprintf_filtered (m_streams.back (), format, args);
8b93c638
JM
179
180 if (align != ui_noalign)
181 field_separator ();
182}
183
112e8700
SM
184void
185cli_ui_out::do_spaces (int numspaces)
8b93c638 186{
112e8700 187 if (m_suppress_output)
698384cd 188 return;
14dba4b4 189
112e8700 190 print_spaces_filtered (numspaces, m_streams.back ());
8b93c638
JM
191}
192
112e8700
SM
193void
194cli_ui_out::do_text (const char *string)
8b93c638 195{
112e8700 196 if (m_suppress_output)
698384cd 197 return;
14dba4b4 198
112e8700 199 fputs_filtered (string, m_streams.back ());
8b93c638
JM
200}
201
112e8700
SM
202void
203cli_ui_out::do_message (const char *format, va_list args)
8b93c638 204{
112e8700 205 if (m_suppress_output)
698384cd 206 return;
14dba4b4 207
112e8700 208 vfprintf_unfiltered (m_streams.back (), format, args);
8b93c638
JM
209}
210
112e8700
SM
211void
212cli_ui_out::do_wrap_hint (const char *identstring)
8b93c638 213{
112e8700 214 if (m_suppress_output)
698384cd 215 return;
112e8700 216
8b93c638
JM
217 wrap_here (identstring);
218}
219
112e8700
SM
220void
221cli_ui_out::do_flush ()
8b93c638 222{
112e8700 223 gdb_flush (m_streams.back ());
8b93c638
JM
224}
225
14dba4b4
JK
226/* OUTSTREAM as non-NULL will push OUTSTREAM on the stack of output streams
227 and make it therefore active. OUTSTREAM as NULL will pop the last pushed
228 output stream; it is an internal error if it does not exist. */
229
112e8700
SM
230int
231cli_ui_out::do_redirect (ui_file *outstream)
0fac0b41 232{
0fac0b41 233 if (outstream != NULL)
112e8700 234 m_streams.push_back (outstream);
14dba4b4 235 else
112e8700 236 m_streams.pop_back ();
0fac0b41
DJ
237
238 return 0;
239}
240
8b93c638
JM
241/* local functions */
242
112e8700 243/* Like cli_ui_out::do_field_fmt, but takes a variable number of args
30fdc99f 244 and makes a va_list and does not insert a separator. */
8b93c638
JM
245
246/* VARARGS */
112e8700
SM
247void
248cli_ui_out::out_field_fmt (int fldno, const char *fldname,
249 const char *format, ...)
8b93c638 250{
8b93c638
JM
251 va_list args;
252
253 va_start (args, format);
112e8700 254 vfprintf_filtered (m_streams.back (), format, args);
8b93c638
JM
255
256 va_end (args);
257}
258
112e8700
SM
259void
260cli_ui_out::field_separator ()
8b93c638 261{
112e8700 262 fputc_filtered (' ', m_streams.back ());
8b93c638
JM
263}
264
112e8700 265/* Constructor for cli_ui_out. */
02a45ac0 266
112e8700
SM
267cli_ui_out::cli_ui_out (ui_file *stream, ui_out_flags flags)
268: ui_out (flags),
269 m_suppress_output (false)
0a8fce9a 270{
14dba4b4
JK
271 gdb_assert (stream != NULL);
272
112e8700
SM
273 m_streams.push_back (stream);
274}
14dba4b4 275
112e8700
SM
276cli_ui_out::~cli_ui_out ()
277{
0a8fce9a
PA
278}
279
280/* Initialize private members at startup. */
8b93c638 281
112e8700 282cli_ui_out *
8b93c638
JM
283cli_out_new (struct ui_file *stream)
284{
112e8700 285 return new cli_ui_out (stream, ui_source_list);
8b93c638
JM
286}
287
112e8700
SM
288ui_file *
289cli_ui_out::set_stream (struct ui_file *stream)
4389a95a 290{
112e8700 291 ui_file *old;
b9b118c3 292
112e8700
SM
293 old = m_streams.back ();
294 m_streams.back () = stream;
c5504eaf 295
4389a95a
AC
296 return old;
297}
b9b118c3 298
82083d6d
DE
299/* CLI interface to display tab-completion matches. */
300
301/* CLI version of displayer.crlf. */
302
303static void
304cli_mld_crlf (const struct match_list_displayer *displayer)
305{
306 rl_crlf ();
307}
308
309/* CLI version of displayer.putch. */
310
311static void
312cli_mld_putch (const struct match_list_displayer *displayer, int ch)
313{
314 putc (ch, rl_outstream);
315}
316
317/* CLI version of displayer.puts. */
318
319static void
320cli_mld_puts (const struct match_list_displayer *displayer, const char *s)
321{
322 fputs (s, rl_outstream);
323}
324
325/* CLI version of displayer.flush. */
326
327static void
328cli_mld_flush (const struct match_list_displayer *displayer)
329{
330 fflush (rl_outstream);
331}
332
56000a98
PA
333EXTERN_C void _rl_erase_entire_line (void);
334
82083d6d
DE
335/* CLI version of displayer.erase_entire_line. */
336
337static void
338cli_mld_erase_entire_line (const struct match_list_displayer *displayer)
339{
82083d6d
DE
340 _rl_erase_entire_line ();
341}
342
343/* CLI version of displayer.beep. */
344
345static void
346cli_mld_beep (const struct match_list_displayer *displayer)
347{
348 rl_ding ();
349}
350
351/* CLI version of displayer.read_key. */
352
353static int
354cli_mld_read_key (const struct match_list_displayer *displayer)
355{
356 return rl_read_key ();
357}
358
359/* CLI version of rl_completion_display_matches_hook.
360 See gdb_display_match_list for a description of the arguments. */
361
362void
363cli_display_match_list (char **matches, int len, int max)
364{
365 struct match_list_displayer displayer;
366
367 rl_get_screen_size (&displayer.height, &displayer.width);
368 displayer.crlf = cli_mld_crlf;
369 displayer.putch = cli_mld_putch;
370 displayer.puts = cli_mld_puts;
371 displayer.flush = cli_mld_flush;
372 displayer.erase_entire_line = cli_mld_erase_entire_line;
373 displayer.beep = cli_mld_beep;
374 displayer.read_key = cli_mld_read_key;
375
376 gdb_display_match_list (matches, len, max, &displayer);
377 rl_forced_update_display ();
378}
This page took 1.298022 seconds and 4 git commands to generate.