* 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.
This commit is contained in:
Jan Kratochvil 2010-09-03 15:42:04 +00:00
parent c8cbd2725a
commit 14dba4b472
8 changed files with 127 additions and 28 deletions

View file

@ -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;
}