X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fui-file.c;h=9a1d892b132b14e7e0b74e6ac4aa636fb823db26;hb=96e32df874f88b174fde0c5c7133a4ee50fe2154;hp=3dbcaab13267fd03cdfb90dda6eb8f318ec50598;hpb=349c5d5f6c08699c3e433b28e2beaa24b65a63b0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ui-file.c b/gdb/ui-file.c index 3dbcaab132..9a1d892b13 100644 --- a/gdb/ui-file.c +++ b/gdb/ui-file.c @@ -1,12 +1,13 @@ /* UI_FILE - a generic STDIO like output stream. - Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. + Copyright (C) 1999, 2000, 2001, 2002, 2007, 2008 + Free Software Foundation, Inc. This file is part of GDB. This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by - the Free Software Foundation; either version 2 of the License, or + the Free Software Foundation; either version 3 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, @@ -15,9 +16,7 @@ GNU General Public License for more details. You should have received a copy of the GNU General Public License - along with this program; if not, write to the Free Software - Foundation, Inc., 59 Temple Place - Suite 330, - Boston, MA 02111-1307, USA. */ + along with this program. If not, see . */ /* Implement the ``struct ui_file'' object. */ @@ -25,9 +24,12 @@ #include "ui-file.h" #include "gdb_string.h" +#include + static ui_file_isatty_ftype null_file_isatty; static ui_file_write_ftype null_file_write; static ui_file_fputs_ftype null_file_fputs; +static ui_file_read_ftype null_file_read; static ui_file_flush_ftype null_file_flush; static ui_file_delete_ftype null_file_delete; static ui_file_rewind_ftype null_file_rewind; @@ -39,6 +41,7 @@ struct ui_file ui_file_flush_ftype *to_flush; ui_file_write_ftype *to_write; ui_file_fputs_ftype *to_fputs; + ui_file_read_ftype *to_read; ui_file_delete_ftype *to_delete; ui_file_isatty_ftype *to_isatty; ui_file_rewind_ftype *to_rewind; @@ -56,6 +59,7 @@ ui_file_new (void) set_ui_file_flush (file, null_file_flush); set_ui_file_write (file, null_file_write); set_ui_file_fputs (file, null_file_fputs); + set_ui_file_read (file, null_file_read); set_ui_file_isatty (file, null_file_isatty); set_ui_file_rewind (file, null_file_rewind); set_ui_file_put (file, null_file_put); @@ -123,6 +127,15 @@ null_file_write (struct ui_file *file, } } +static long +null_file_read (struct ui_file *file, + char *buf, + long sizeof_buf) +{ + errno = EBADF; + return 0; +} + static void null_file_fputs (const char *buf, struct ui_file *file) { @@ -148,7 +161,7 @@ ui_file_data (struct ui_file *file) { if (file->magic != &ui_file_magic) internal_error (__FILE__, __LINE__, - "ui_file_data: bad magic number"); + _("ui_file_data: bad magic number")); return file->to_data; } @@ -186,6 +199,12 @@ ui_file_write (struct ui_file *file, file->to_write (file, buf, length_buf); } +long +ui_file_read (struct ui_file *file, char *buf, long length_buf) +{ + return file->to_read (file, buf, length_buf); +} + void fputs_unfiltered (const char *buf, struct ui_file *file) { @@ -223,6 +242,12 @@ set_ui_file_write (struct ui_file *file, file->to_write = write; } +void +set_ui_file_read (struct ui_file *file, ui_file_read_ftype *read) +{ + file->to_read = read; +} + void set_ui_file_fputs (struct ui_file *file, ui_file_fputs_ftype *fputs) { @@ -314,7 +339,7 @@ mem_file_delete (struct ui_file *file) struct mem_file *stream = ui_file_data (file); if (stream->magic != &mem_file_magic) internal_error (__FILE__, __LINE__, - "mem_file_delete: bad magic number"); + _("mem_file_delete: bad magic number")); if (stream->buffer != NULL) xfree (stream->buffer); xfree (stream); @@ -332,7 +357,7 @@ mem_file_rewind (struct ui_file *file) struct mem_file *stream = ui_file_data (file); if (stream->magic != &mem_file_magic) internal_error (__FILE__, __LINE__, - "mem_file_rewind: bad magic number"); + _("mem_file_rewind: bad magic number")); stream->length_buffer = 0; } @@ -344,7 +369,7 @@ mem_file_put (struct ui_file *file, struct mem_file *stream = ui_file_data (file); if (stream->magic != &mem_file_magic) internal_error (__FILE__, __LINE__, - "mem_file_put: bad magic number"); + _("mem_file_put: bad magic number")); if (stream->length_buffer > 0) write (dest, stream->buffer, stream->length_buffer); } @@ -357,7 +382,7 @@ mem_file_write (struct ui_file *file, struct mem_file *stream = ui_file_data (file); if (stream->magic != &mem_file_magic) internal_error (__FILE__, __LINE__, - "mem_file_write: bad magic number"); + _("mem_file_write: bad magic number")); if (stream->buffer == NULL) { stream->length_buffer = length_buffer; @@ -383,6 +408,7 @@ mem_file_write (struct ui_file *file, static ui_file_write_ftype stdio_file_write; static ui_file_fputs_ftype stdio_file_fputs; +static ui_file_read_ftype stdio_file_read; static ui_file_isatty_ftype stdio_file_isatty; static ui_file_delete_ftype stdio_file_delete; static struct ui_file *stdio_file_new (FILE * file, int close_p); @@ -409,6 +435,7 @@ stdio_file_new (FILE *file, int close_p) set_ui_file_flush (ui_file, stdio_file_flush); set_ui_file_write (ui_file, stdio_file_write); set_ui_file_fputs (ui_file, stdio_file_fputs); + set_ui_file_read (ui_file, stdio_file_read); set_ui_file_isatty (ui_file, stdio_file_isatty); return ui_file; } @@ -419,7 +446,7 @@ stdio_file_delete (struct ui_file *file) struct stdio_file *stdio = ui_file_data (file); if (stdio->magic != &stdio_file_magic) internal_error (__FILE__, __LINE__, - "stdio_file_delete: bad magic number"); + _("stdio_file_delete: bad magic number")); if (stdio->close_p) { fclose (stdio->file); @@ -433,17 +460,27 @@ stdio_file_flush (struct ui_file *file) struct stdio_file *stdio = ui_file_data (file); if (stdio->magic != &stdio_file_magic) internal_error (__FILE__, __LINE__, - "stdio_file_flush: bad magic number"); + _("stdio_file_flush: bad magic number")); fflush (stdio->file); } +static long +stdio_file_read (struct ui_file *file, char *buf, long length_buf) +{ + struct stdio_file *stdio = ui_file_data (file); + if (stdio->magic != &stdio_file_magic) + internal_error (__FILE__, __LINE__, + _("stdio_file_read: bad magic number")); + return read (fileno (stdio->file), buf, length_buf); +} + static void stdio_file_write (struct ui_file *file, const char *buf, long length_buf) { struct stdio_file *stdio = ui_file_data (file); if (stdio->magic != &stdio_file_magic) internal_error (__FILE__, __LINE__, - "stdio_file_write: bad magic number"); + _("stdio_file_write: bad magic number")); fwrite (buf, length_buf, 1, stdio->file); } @@ -453,7 +490,7 @@ stdio_file_fputs (const char *linebuffer, struct ui_file *file) struct stdio_file *stdio = ui_file_data (file); if (stdio->magic != &stdio_file_magic) internal_error (__FILE__, __LINE__, - "stdio_file_fputs: bad magic number"); + _("stdio_file_fputs: bad magic number")); fputs (linebuffer, stdio->file); } @@ -463,7 +500,7 @@ stdio_file_isatty (struct ui_file *file) struct stdio_file *stdio = ui_file_data (file); if (stdio->magic != &stdio_file_magic) internal_error (__FILE__, __LINE__, - "stdio_file_isatty: bad magic number"); + _("stdio_file_isatty: bad magic number")); return (isatty (fileno (stdio->file))); } @@ -483,3 +520,97 @@ gdb_fopen (char *name, char *mode) return NULL; return stdio_file_new (f, 1); } + +/* ``struct ui_file'' implementation that maps onto two ui-file objects. */ + +static ui_file_write_ftype tee_file_write; +static ui_file_fputs_ftype tee_file_fputs; +static ui_file_isatty_ftype tee_file_isatty; +static ui_file_delete_ftype tee_file_delete; +static ui_file_flush_ftype tee_file_flush; + +static int tee_file_magic; + +struct tee_file + { + int *magic; + struct ui_file *one, *two; + int close_one, close_two; + }; + +struct ui_file * +tee_file_new (struct ui_file *one, int close_one, + struct ui_file *two, int close_two) +{ + struct ui_file *ui_file = ui_file_new (); + struct tee_file *tee = xmalloc (sizeof (struct tee_file)); + tee->magic = &tee_file_magic; + tee->one = one; + tee->two = two; + tee->close_one = close_one; + tee->close_two = close_two; + set_ui_file_data (ui_file, tee, tee_file_delete); + set_ui_file_flush (ui_file, tee_file_flush); + set_ui_file_write (ui_file, tee_file_write); + set_ui_file_fputs (ui_file, tee_file_fputs); + set_ui_file_isatty (ui_file, tee_file_isatty); + return ui_file; +} + +static void +tee_file_delete (struct ui_file *file) +{ + struct tee_file *tee = ui_file_data (file); + if (tee->magic != &tee_file_magic) + internal_error (__FILE__, __LINE__, + _("tee_file_delete: bad magic number")); + if (tee->close_one) + ui_file_delete (tee->one); + if (tee->close_two) + ui_file_delete (tee->two); + + xfree (tee); +} + +static void +tee_file_flush (struct ui_file *file) +{ + struct tee_file *tee = ui_file_data (file); + if (tee->magic != &tee_file_magic) + internal_error (__FILE__, __LINE__, + _("tee_file_flush: bad magic number")); + tee->one->to_flush (tee->one); + tee->two->to_flush (tee->two); +} + +static void +tee_file_write (struct ui_file *file, const char *buf, long length_buf) +{ + struct tee_file *tee = ui_file_data (file); + if (tee->magic != &tee_file_magic) + internal_error (__FILE__, __LINE__, + _("tee_file_write: bad magic number")); + ui_file_write (tee->one, buf, length_buf); + ui_file_write (tee->two, buf, length_buf); +} + +static void +tee_file_fputs (const char *linebuffer, struct ui_file *file) +{ + struct tee_file *tee = ui_file_data (file); + if (tee->magic != &tee_file_magic) + internal_error (__FILE__, __LINE__, + _("tee_file_fputs: bad magic number")); + tee->one->to_fputs (linebuffer, tee->one); + tee->two->to_fputs (linebuffer, tee->two); +} + +static int +tee_file_isatty (struct ui_file *file) +{ + struct tee_file *tee = ui_file_data (file); + if (tee->magic != &tee_file_magic) + internal_error (__FILE__, __LINE__, + _("tee_file_isatty: bad magic number")); + return (0); +}