windows-nat: Don't change current_event.dwThreadId in handle_output_debug_string()
[deliverable/binutils-gdb.git] / gdb / cli-out.c
CommitLineData
8b93c638 1/* Output generating routines for GDB CLI.
349c5d5f 2
32d0add0 3 Copyright (C) 1999-2015 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"
14dba4b4 27#include "vec.h"
82083d6d 28#include "readline/readline.h"
8b93c638 29
0a8fce9a 30typedef struct cli_ui_out_data cli_out_data;
8b93c638 31
8b93c638
JM
32/* Prototypes for local functions */
33
02a45ac0 34static void cli_text (struct ui_out *uiout, const char *string);
8b93c638
JM
35
36static void field_separator (void);
37
e2e11a41
AC
38static void out_field_fmt (struct ui_out *uiout, int fldno,
39 const char *fldname,
a0b31db1 40 const char *format,...) ATTRIBUTE_PRINTF (4, 5);
8b93c638 41
17b2616c
PA
42/* The destructor. */
43
44static void
45cli_uiout_dtor (struct ui_out *ui_out)
46{
47 cli_out_data *data = ui_out_data (ui_out);
48
49 VEC_free (ui_filep, data->streams);
50 xfree (data);
51}
52
02a45ac0
PA
53/* These are the CLI output functions */
54
8b93c638
JM
55/* Mark beginning of a table */
56
02a45ac0 57static void
e2e11a41 58cli_table_begin (struct ui_out *uiout, int nbrofcols,
d63f1d40 59 int nr_rows,
e2e11a41 60 const char *tblid)
8b93c638 61{
1248ede2 62 cli_out_data *data = ui_out_data (uiout);
c5504eaf 63
698384cd
AC
64 if (nr_rows == 0)
65 data->suppress_output = 1;
66 else
ce2826aa 67 /* Only the table suppresses the output and, fortunately, a table
30fdc99f 68 is not a recursive data structure. */
698384cd 69 gdb_assert (data->suppress_output == 0);
8b93c638
JM
70}
71
72/* Mark beginning of a table body */
73
02a45ac0 74static void
fba45db2 75cli_table_body (struct ui_out *uiout)
8b93c638 76{
1248ede2 77 cli_out_data *data = ui_out_data (uiout);
c5504eaf 78
698384cd
AC
79 if (data->suppress_output)
80 return;
8b93c638
JM
81 /* first, close the table header line */
82 cli_text (uiout, "\n");
83}
84
85/* Mark end of a table */
86
02a45ac0 87static void
fba45db2 88cli_table_end (struct ui_out *uiout)
8b93c638 89{
1248ede2 90 cli_out_data *data = ui_out_data (uiout);
c5504eaf 91
698384cd 92 data->suppress_output = 0;
8b93c638
JM
93}
94
95/* Specify table header */
96
02a45ac0 97static void
fba45db2 98cli_table_header (struct ui_out *uiout, int width, enum ui_align alignment,
b25959ec 99 const char *col_name,
e2e11a41 100 const char *colhdr)
8b93c638 101{
1248ede2 102 cli_out_data *data = ui_out_data (uiout);
c5504eaf 103
698384cd
AC
104 if (data->suppress_output)
105 return;
0a8fce9a
PA
106
107 /* Always go through the function pointer (virtual function call).
108 We may have been extended. */
109 uo_field_string (uiout, 0, width, alignment, 0, colhdr);
8b93c638
JM
110}
111
112/* Mark beginning of a list */
113
02a45ac0 114static void
631ec795
AC
115cli_begin (struct ui_out *uiout,
116 enum ui_out_type type,
117 int level,
118 const char *id)
8b93c638 119{
1248ede2 120 cli_out_data *data = ui_out_data (uiout);
c5504eaf 121
698384cd
AC
122 if (data->suppress_output)
123 return;
8b93c638
JM
124}
125
126/* Mark end of a list */
127
02a45ac0 128static void
631ec795
AC
129cli_end (struct ui_out *uiout,
130 enum ui_out_type type,
131 int level)
8b93c638 132{
1248ede2 133 cli_out_data *data = ui_out_data (uiout);
c5504eaf 134
698384cd
AC
135 if (data->suppress_output)
136 return;
8b93c638
JM
137}
138
139/* output an int field */
140
02a45ac0 141static void
fba45db2 142cli_field_int (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
143 enum ui_align alignment,
144 const char *fldname, int value)
8b93c638 145{
c5504eaf 146 char buffer[20]; /* FIXME: how many chars long a %d can become? */
1248ede2 147 cli_out_data *data = ui_out_data (uiout);
c5504eaf 148
698384cd
AC
149 if (data->suppress_output)
150 return;
08850b56 151 xsnprintf (buffer, sizeof (buffer), "%d", value);
0a8fce9a
PA
152
153 /* Always go through the function pointer (virtual function call).
154 We may have been extended. */
155 uo_field_string (uiout, fldno, width, alignment, fldname, buffer);
8b93c638
JM
156}
157
158/* used to ommit a field */
159
02a45ac0 160static void
fba45db2 161cli_field_skip (struct ui_out *uiout, int fldno, int width,
e2e11a41
AC
162 enum ui_align alignment,
163 const char *fldname)
8b93c638 164{
1248ede2 165 cli_out_data *data = ui_out_data (uiout);
c5504eaf 166
698384cd
AC
167 if (data->suppress_output)
168 return;
0a8fce9a
PA
169
170 /* Always go through the function pointer (virtual function call).
171 We may have been extended. */
172 uo_field_string (uiout, fldno, width, alignment, fldname, "");
8b93c638
JM
173}
174
175/* other specific cli_field_* end up here so alignment and field
176 separators are both handled by cli_field_string */
177
02a45ac0 178static void
8b93c638
JM
179cli_field_string (struct ui_out *uiout,
180 int fldno,
181 int width,
55555bbc 182 enum ui_align align,
e2e11a41 183 const char *fldname,
8b93c638
JM
184 const char *string)
185{
186 int before = 0;
187 int after = 0;
1248ede2 188 cli_out_data *data = ui_out_data (uiout);
c5504eaf 189
698384cd
AC
190 if (data->suppress_output)
191 return;
192
8b93c638
JM
193 if ((align != ui_noalign) && string)
194 {
195 before = width - strlen (string);
196 if (before <= 0)
197 before = 0;
198 else
199 {
200 if (align == ui_right)
201 after = 0;
202 else if (align == ui_left)
203 {
204 after = before;
205 before = 0;
206 }
207 else
208 /* ui_center */
209 {
210 after = before / 2;
211 before -= after;
212 }
213 }
214 }
215
216 if (before)
217 ui_out_spaces (uiout, before);
218 if (string)
219 out_field_fmt (uiout, fldno, fldname, "%s", string);
220 if (after)
221 ui_out_spaces (uiout, after);
222
223 if (align != ui_noalign)
224 field_separator ();
225}
226
30fdc99f 227/* This is the only field function that does not align. */
8b93c638 228
a0b31db1 229static void ATTRIBUTE_PRINTF (6, 0)
8b93c638
JM
230cli_field_fmt (struct ui_out *uiout, int fldno,
231 int width, enum ui_align align,
e2e11a41
AC
232 const char *fldname,
233 const char *format,
234 va_list args)
8b93c638 235{
1248ede2 236 cli_out_data *data = ui_out_data (uiout);
14dba4b4 237 struct ui_file *stream;
c5504eaf 238
698384cd
AC
239 if (data->suppress_output)
240 return;
241
14dba4b4
JK
242 stream = VEC_last (ui_filep, data->streams);
243 vfprintf_filtered (stream, format, args);
8b93c638
JM
244
245 if (align != ui_noalign)
246 field_separator ();
247}
248
02a45ac0 249static void
fba45db2 250cli_spaces (struct ui_out *uiout, int numspaces)
8b93c638 251{
1248ede2 252 cli_out_data *data = ui_out_data (uiout);
14dba4b4 253 struct ui_file *stream;
c5504eaf 254
698384cd
AC
255 if (data->suppress_output)
256 return;
14dba4b4
JK
257
258 stream = VEC_last (ui_filep, data->streams);
259 print_spaces_filtered (numspaces, stream);
8b93c638
JM
260}
261
02a45ac0 262static void
e2e11a41 263cli_text (struct ui_out *uiout, const char *string)
8b93c638 264{
1248ede2 265 cli_out_data *data = ui_out_data (uiout);
14dba4b4 266 struct ui_file *stream;
c5504eaf 267
698384cd
AC
268 if (data->suppress_output)
269 return;
14dba4b4
JK
270
271 stream = VEC_last (ui_filep, data->streams);
272 fputs_filtered (string, stream);
8b93c638
JM
273}
274
a0b31db1 275static void ATTRIBUTE_PRINTF (3, 0)
e2e11a41
AC
276cli_message (struct ui_out *uiout, int verbosity,
277 const char *format, va_list args)
8b93c638 278{
1248ede2 279 cli_out_data *data = ui_out_data (uiout);
c5504eaf 280
698384cd
AC
281 if (data->suppress_output)
282 return;
14dba4b4 283
8b93c638 284 if (ui_out_get_verblvl (uiout) >= verbosity)
14dba4b4
JK
285 {
286 struct ui_file *stream = VEC_last (ui_filep, data->streams);
287
288 vfprintf_unfiltered (stream, format, args);
289 }
8b93c638
JM
290}
291
02a45ac0 292static void
fba45db2 293cli_wrap_hint (struct ui_out *uiout, char *identstring)
8b93c638 294{
1248ede2 295 cli_out_data *data = ui_out_data (uiout);
c5504eaf 296
698384cd
AC
297 if (data->suppress_output)
298 return;
8b93c638
JM
299 wrap_here (identstring);
300}
301
02a45ac0 302static void
fba45db2 303cli_flush (struct ui_out *uiout)
8b93c638 304{
1248ede2 305 cli_out_data *data = ui_out_data (uiout);
14dba4b4 306 struct ui_file *stream = VEC_last (ui_filep, data->streams);
c5504eaf 307
14dba4b4 308 gdb_flush (stream);
8b93c638
JM
309}
310
14dba4b4
JK
311/* OUTSTREAM as non-NULL will push OUTSTREAM on the stack of output streams
312 and make it therefore active. OUTSTREAM as NULL will pop the last pushed
313 output stream; it is an internal error if it does not exist. */
314
02a45ac0 315static int
0fac0b41
DJ
316cli_redirect (struct ui_out *uiout, struct ui_file *outstream)
317{
0a8fce9a 318 cli_out_data *data = ui_out_data (uiout);
c5504eaf 319
0fac0b41 320 if (outstream != NULL)
14dba4b4
JK
321 VEC_safe_push (ui_filep, data->streams, outstream);
322 else
323 VEC_pop (ui_filep, data->streams);
0fac0b41
DJ
324
325 return 0;
326}
327
8b93c638
JM
328/* local functions */
329
330/* Like cli_field_fmt, but takes a variable number of args
30fdc99f 331 and makes a va_list and does not insert a separator. */
8b93c638
JM
332
333/* VARARGS */
334static void
e2e11a41
AC
335out_field_fmt (struct ui_out *uiout, int fldno,
336 const char *fldname,
337 const char *format,...)
8b93c638 338{
1248ede2 339 cli_out_data *data = ui_out_data (uiout);
14dba4b4 340 struct ui_file *stream = VEC_last (ui_filep, data->streams);
8b93c638
JM
341 va_list args;
342
343 va_start (args, format);
14dba4b4 344 vfprintf_filtered (stream, format, args);
8b93c638
JM
345
346 va_end (args);
347}
348
30fdc99f 349/* Access to ui_out format private members. */
8b93c638
JM
350
351static void
fba45db2 352field_separator (void)
8b93c638 353{
79a45e25 354 cli_out_data *data = ui_out_data (current_uiout);
14dba4b4 355 struct ui_file *stream = VEC_last (ui_filep, data->streams);
c5504eaf 356
14dba4b4 357 fputc_filtered (' ', stream);
8b93c638
JM
358}
359
02a45ac0
PA
360/* This is the CLI ui-out implementation functions vector */
361
89de4da4 362const struct ui_out_impl cli_ui_out_impl =
02a45ac0
PA
363{
364 cli_table_begin,
365 cli_table_body,
366 cli_table_end,
367 cli_table_header,
368 cli_begin,
369 cli_end,
370 cli_field_int,
371 cli_field_skip,
372 cli_field_string,
373 cli_field_fmt,
374 cli_spaces,
375 cli_text,
376 cli_message,
377 cli_wrap_hint,
378 cli_flush,
379 cli_redirect,
17b2616c 380 cli_uiout_dtor,
02a45ac0
PA
381 0, /* Does not need MI hacks (i.e. needs CLI hacks). */
382};
383
0a8fce9a
PA
384/* Constructor for a `cli_out_data' object. */
385
386void
387cli_out_data_ctor (cli_out_data *self, struct ui_file *stream)
388{
14dba4b4
JK
389 gdb_assert (stream != NULL);
390
391 self->streams = NULL;
392 VEC_safe_push (ui_filep, self->streams, stream);
393
0a8fce9a
PA
394 self->suppress_output = 0;
395}
396
397/* Initialize private members at startup. */
8b93c638
JM
398
399struct ui_out *
400cli_out_new (struct ui_file *stream)
401{
402 int flags = ui_source_list;
70ba0933 403 cli_out_data *data = XNEW (cli_out_data);
c5504eaf 404
0a8fce9a 405 cli_out_data_ctor (data, stream);
8b93c638
JM
406 return ui_out_new (&cli_ui_out_impl, data, flags);
407}
408
4389a95a
AC
409struct ui_file *
410cli_out_set_stream (struct ui_out *uiout, struct ui_file *stream)
411{
1248ede2 412 cli_out_data *data = ui_out_data (uiout);
14dba4b4
JK
413 struct ui_file *old;
414
415 old = VEC_pop (ui_filep, data->streams);
416 VEC_quick_push (ui_filep, data->streams, stream);
c5504eaf 417
4389a95a
AC
418 return old;
419}
82083d6d
DE
420\f
421/* CLI interface to display tab-completion matches. */
422
423/* CLI version of displayer.crlf. */
424
425static void
426cli_mld_crlf (const struct match_list_displayer *displayer)
427{
428 rl_crlf ();
429}
430
431/* CLI version of displayer.putch. */
432
433static void
434cli_mld_putch (const struct match_list_displayer *displayer, int ch)
435{
436 putc (ch, rl_outstream);
437}
438
439/* CLI version of displayer.puts. */
440
441static void
442cli_mld_puts (const struct match_list_displayer *displayer, const char *s)
443{
444 fputs (s, rl_outstream);
445}
446
447/* CLI version of displayer.flush. */
448
449static void
450cli_mld_flush (const struct match_list_displayer *displayer)
451{
452 fflush (rl_outstream);
453}
454
56000a98
PA
455EXTERN_C void _rl_erase_entire_line (void);
456
82083d6d
DE
457/* CLI version of displayer.erase_entire_line. */
458
459static void
460cli_mld_erase_entire_line (const struct match_list_displayer *displayer)
461{
82083d6d
DE
462 _rl_erase_entire_line ();
463}
464
465/* CLI version of displayer.beep. */
466
467static void
468cli_mld_beep (const struct match_list_displayer *displayer)
469{
470 rl_ding ();
471}
472
473/* CLI version of displayer.read_key. */
474
475static int
476cli_mld_read_key (const struct match_list_displayer *displayer)
477{
478 return rl_read_key ();
479}
480
481/* CLI version of rl_completion_display_matches_hook.
482 See gdb_display_match_list for a description of the arguments. */
483
484void
485cli_display_match_list (char **matches, int len, int max)
486{
487 struct match_list_displayer displayer;
488
489 rl_get_screen_size (&displayer.height, &displayer.width);
490 displayer.crlf = cli_mld_crlf;
491 displayer.putch = cli_mld_putch;
492 displayer.puts = cli_mld_puts;
493 displayer.flush = cli_mld_flush;
494 displayer.erase_entire_line = cli_mld_erase_entire_line;
495 displayer.beep = cli_mld_beep;
496 displayer.read_key = cli_mld_read_key;
497
498 gdb_display_match_list (matches, len, max, &displayer);
499 rl_forced_update_display ();
500}
This page took 1.029799 seconds and 4 git commands to generate.