diff options
author | Jan Kratochvil <jan.kratochvil@redhat.com> | 2010-09-03 15:42:04 +0000 |
---|---|---|
committer | Jan Kratochvil <jan.kratochvil@redhat.com> | 2010-09-03 15:42:04 +0000 |
commit | 14dba4b472beeb95c8018fedc795d9379b36e0a3 (patch) | |
tree | a892be119172870b7efb5013cb4490d16f618ad9 /gdb/cli-out.c | |
parent | c8cbd2725ad1bb3cf51dc01f5c6e219b749e03f2 (diff) | |
download | binutils-gdb-14dba4b472beeb95c8018fedc795d9379b36e0a3.tar.gz |
gdb/
* breakpoint.c (save_breakpoints): Use RETURN_MASK_ALL.
* cli-out.c: Include vec.h.
(cli_field_fmt, cli_spaces, cli_text, cli_message, cli_flush): New
variable stream, initialize it, use it.
(cli_redirect): New function comment. Replace the stream and
original_stream fields by the new streams field. Remove the
original_stream != NULL conditional, assert error on NULL instead.
(out_field_fmt, field_separator): New variable stream, initialize it, use it.
(cli_out_data_ctor): Assert non-NULL stream. Replace the stream and
original_stream fields by the new streams field.
(cli_out_set_stream): Replace the stream field by the new streams
field.
* cli-out.h: Include vec.h.
(ui_filep): New typedef, call DEF_VEC_P for it.
(struct cli_ui_out_data): Replace the stream and original_stream
fields by the new streams field.
* cli/cli-logging.c (set_logging_redirect): Call ui_out_redirect with
NULL first. Extend the comment.
(handle_redirections): Call ui_out_redirect with output.
* python/py-breakpoint.c (bppy_get_commands): Move ui_out_redirect
calls outside of the TRY_CATCH block.
gdb/testsuite/
* gdb.base/ui-redirect.exp: New file.
Diffstat (limited to 'gdb/cli-out.c')
-rw-r--r-- | gdb/cli-out.c | 60 |
1 files changed, 40 insertions, 20 deletions
diff --git a/gdb/cli-out.c b/gdb/cli-out.c index de0559f0e9d..78673114020 100644 --- a/gdb/cli-out.c +++ b/gdb/cli-out.c @@ -26,6 +26,7 @@ #include "cli-out.h" #include "gdb_string.h" #include "gdb_assert.h" +#include "vec.h" typedef struct cli_ui_out_data cli_out_data; @@ -224,11 +225,13 @@ cli_field_fmt (struct ui_out *uiout, int fldno, va_list args) { cli_out_data *data = ui_out_data (uiout); + struct ui_file *stream; if (data->suppress_output) return; - vfprintf_filtered (data->stream, format, args); + stream = VEC_last (ui_filep, data->streams); + vfprintf_filtered (stream, format, args); if (align != ui_noalign) field_separator (); @@ -238,20 +241,26 @@ static void cli_spaces (struct ui_out *uiout, int numspaces) { cli_out_data *data = ui_out_data (uiout); + struct ui_file *stream; if (data->suppress_output) return; - print_spaces_filtered (numspaces, data->stream); + + stream = VEC_last (ui_filep, data->streams); + print_spaces_filtered (numspaces, stream); } static void cli_text (struct ui_out *uiout, const char *string) { cli_out_data *data = ui_out_data (uiout); + struct ui_file *stream; if (data->suppress_output) return; - fputs_filtered (string, data->stream); + + stream = VEC_last (ui_filep, data->streams); + fputs_filtered (string, stream); } static void ATTRIBUTE_PRINTF (3, 0) @@ -262,8 +271,13 @@ cli_message (struct ui_out *uiout, int verbosity, if (data->suppress_output) return; + if (ui_out_get_verblvl (uiout) >= verbosity) - vfprintf_unfiltered (data->stream, format, args); + { + struct ui_file *stream = VEC_last (ui_filep, data->streams); + + vfprintf_unfiltered (stream, format, args); + } } static void @@ -280,25 +294,24 @@ static void cli_flush (struct ui_out *uiout) { cli_out_data *data = ui_out_data (uiout); + struct ui_file *stream = VEC_last (ui_filep, data->streams); - gdb_flush (data->stream); + gdb_flush (stream); } +/* OUTSTREAM as non-NULL will push OUTSTREAM on the stack of output streams + and make it therefore active. OUTSTREAM as NULL will pop the last pushed + output stream; it is an internal error if it does not exist. */ + static int cli_redirect (struct ui_out *uiout, struct ui_file *outstream) { cli_out_data *data = ui_out_data (uiout); if (outstream != NULL) - { - data->original_stream = data->stream; - data->stream = outstream; - } - else if (data->original_stream != NULL) - { - data->stream = data->original_stream; - data->original_stream = NULL; - } + VEC_safe_push (ui_filep, data->streams, outstream); + else + VEC_pop (ui_filep, data->streams); return 0; } @@ -315,10 +328,11 @@ out_field_fmt (struct ui_out *uiout, int fldno, const char *format,...) { cli_out_data *data = ui_out_data (uiout); + struct ui_file *stream = VEC_last (ui_filep, data->streams); va_list args; va_start (args, format); - vfprintf_filtered (data->stream, format, args); + vfprintf_filtered (stream, format, args); va_end (args); } @@ -329,8 +343,9 @@ static void field_separator (void) { cli_out_data *data = ui_out_data (uiout); + struct ui_file *stream = VEC_last (ui_filep, data->streams); - fputc_filtered (' ', data->stream); + fputc_filtered (' ', stream); } /* This is the CLI ui-out implementation functions vector */ @@ -364,8 +379,11 @@ struct ui_out_impl cli_ui_out_impl = void cli_out_data_ctor (cli_out_data *self, struct ui_file *stream) { - self->stream = stream; - self->original_stream = NULL; + gdb_assert (stream != NULL); + + self->streams = NULL; + VEC_safe_push (ui_filep, self->streams, stream); + self->suppress_output = 0; } @@ -385,8 +403,10 @@ struct ui_file * cli_out_set_stream (struct ui_out *uiout, struct ui_file *stream) { cli_out_data *data = ui_out_data (uiout); - struct ui_file *old = data->stream; + struct ui_file *old; + + old = VEC_pop (ui_filep, data->streams); + VEC_quick_push (ui_filep, data->streams, stream); - data->stream = stream; return old; } |