X-Git-Url: http://git.efficios.com/?a=blobdiff_plain;f=gdb%2Fui-file.c;h=6ad5414b19ff7e7f50bb1a0fdc80e7cb6539fe25;hb=ac7b618e105c458ef9c34e8735cf5f17b526fb4d;hp=d077009956a140754bc958bc9e330dc3c3b50968;hpb=abd8680d6efd97e7ba848a6392ee3ad72be18cd0;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ui-file.c b/gdb/ui-file.c index d077009956..6ad5414b19 100644 --- a/gdb/ui-file.c +++ b/gdb/ui-file.c @@ -1,5 +1,6 @@ /* UI_FILE - a generic STDIO like output stream. - Copyright (C) 1999, 2000 Free Software Foundation, Inc. + + Copyright 1999, 2000, 2001, 2002 Free Software Foundation, Inc. This file is part of GDB. @@ -22,13 +23,14 @@ #include "defs.h" #include "ui-file.h" +#include "gdb_string.h" -#undef XMALLOC -#define XMALLOC(TYPE) ((TYPE*) xmalloc (sizeof (TYPE))) +#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; @@ -40,6 +42,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; @@ -49,7 +52,7 @@ struct ui_file int ui_file_magic; struct ui_file * -ui_file_new () +ui_file_new (void) { struct ui_file *file = xmalloc (sizeof (struct ui_file)); file->magic = &ui_file_magic; @@ -57,6 +60,7 @@ ui_file_new () 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); @@ -64,23 +68,20 @@ ui_file_new () } void -ui_file_delete (file) - struct ui_file *file; +ui_file_delete (struct ui_file *file) { file->to_delete (file); - free (file); + xfree (file); } static int -null_file_isatty (file) - struct ui_file *file; +null_file_isatty (struct ui_file *file) { return 0; } static void -null_file_rewind (file) - struct ui_file *file; +null_file_rewind (struct ui_file *file) { return; } @@ -94,8 +95,7 @@ null_file_put (struct ui_file *file, } static void -null_file_flush (file) - struct ui_file *file; +null_file_flush (struct ui_file *file) { return; } @@ -128,10 +128,17 @@ 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 (buf, file) - const char *buf; - struct ui_file *file; +null_file_fputs (const char *buf, struct ui_file *file) { if (file->to_write == null_file_write) /* Both the write and fputs methods are null. Discard the @@ -145,38 +152,34 @@ null_file_fputs (buf, file) } static void -null_file_delete (file) - struct ui_file *file; +null_file_delete (struct ui_file *file) { return; } void * -ui_file_data (file) - struct ui_file *file; +ui_file_data (struct ui_file *file) { if (file->magic != &ui_file_magic) - internal_error ("ui_file_data: bad magic number"); + internal_error (__FILE__, __LINE__, + "ui_file_data: bad magic number"); return file->to_data; } void -gdb_flush (file) - struct ui_file *file; +gdb_flush (struct ui_file *file) { file->to_flush (file); } int -ui_file_isatty (file) - struct ui_file *file; +ui_file_isatty (struct ui_file *file) { return file->to_isatty (file); } void -ui_file_rewind (file) - struct ui_file *file; +ui_file_rewind (struct ui_file *file) { file->to_rewind (file); } @@ -197,42 +200,38 @@ 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 (buf, file) - const char *buf; - struct ui_file *file; +fputs_unfiltered (const char *buf, struct ui_file *file) { file->to_fputs (buf, file); } void -set_ui_file_flush (file, flush) - struct ui_file *file; - ui_file_flush_ftype *flush; +set_ui_file_flush (struct ui_file *file, ui_file_flush_ftype *flush) { file->to_flush = flush; } void -set_ui_file_isatty (file, isatty) - struct ui_file *file; - ui_file_isatty_ftype *isatty; +set_ui_file_isatty (struct ui_file *file, ui_file_isatty_ftype *isatty) { file->to_isatty = isatty; } void -set_ui_file_rewind (file, rewind) - struct ui_file *file; - ui_file_rewind_ftype *rewind; +set_ui_file_rewind (struct ui_file *file, ui_file_rewind_ftype *rewind) { file->to_rewind = rewind; } void -set_ui_file_put (file, put) - struct ui_file *file; - ui_file_put_ftype *put; +set_ui_file_put (struct ui_file *file, ui_file_put_ftype *put) { file->to_put = put; } @@ -245,18 +244,20 @@ set_ui_file_write (struct ui_file *file, } void -set_ui_file_fputs (file, fputs) - struct ui_file *file; - ui_file_fputs_ftype *fputs; +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) { file->to_fputs = fputs; } void -set_ui_file_data (file, data, delete) - struct ui_file *file; - void *data; - ui_file_delete_ftype *delete; +set_ui_file_data (struct ui_file *file, void *data, + ui_file_delete_ftype *delete) { file->to_data = data; file->to_delete = delete; @@ -314,7 +315,7 @@ static ui_file_rewind_ftype mem_file_rewind; static ui_file_put_ftype mem_file_put; static ui_file_write_ftype mem_file_write; static ui_file_delete_ftype mem_file_delete; -static struct ui_file *mem_file_new PARAMS ((void)); +static struct ui_file *mem_file_new (void); static int mem_file_magic; static struct ui_file * @@ -338,10 +339,11 @@ mem_file_delete (struct ui_file *file) { struct mem_file *stream = ui_file_data (file); if (stream->magic != &mem_file_magic) - internal_error ("mem_file_delete: bad magic number"); + internal_error (__FILE__, __LINE__, + "mem_file_delete: bad magic number"); if (stream->buffer != NULL) - free (stream->buffer); - free (stream); + xfree (stream->buffer); + xfree (stream); } struct ui_file * @@ -355,7 +357,8 @@ mem_file_rewind (struct ui_file *file) { struct mem_file *stream = ui_file_data (file); if (stream->magic != &mem_file_magic) - internal_error ("mem_file_rewind: bad magic number"); + internal_error (__FILE__, __LINE__, + "mem_file_rewind: bad magic number"); stream->length_buffer = 0; } @@ -366,7 +369,8 @@ mem_file_put (struct ui_file *file, { struct mem_file *stream = ui_file_data (file); if (stream->magic != &mem_file_magic) - internal_error ("mem_file_put: bad magic number"); + internal_error (__FILE__, __LINE__, + "mem_file_put: bad magic number"); if (stream->length_buffer > 0) write (dest, stream->buffer, stream->length_buffer); } @@ -378,7 +382,8 @@ mem_file_write (struct ui_file *file, { struct mem_file *stream = ui_file_data (file); if (stream->magic != &mem_file_magic) - internal_error ("mem_file_write: bad magic number"); + internal_error (__FILE__, __LINE__, + "mem_file_write: bad magic number"); if (stream->buffer == NULL) { stream->length_buffer = length_buffer; @@ -404,9 +409,10 @@ 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 PARAMS ((FILE * file, int close_p)); +static struct ui_file *stdio_file_new (FILE * file, int close_p); static ui_file_flush_ftype stdio_file_flush; static int stdio_file_magic; @@ -419,9 +425,7 @@ struct stdio_file }; static struct ui_file * -stdio_file_new (file, close_p) - FILE *file; - int close_p; +stdio_file_new (FILE *file, int close_p) { struct ui_file *ui_file = ui_file_new (); struct stdio_file *stdio = xmalloc (sizeof (struct stdio_file)); @@ -432,80 +436,182 @@ stdio_file_new (file, 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; } static void -stdio_file_delete (file) - struct ui_file *file; +stdio_file_delete (struct ui_file *file) { struct stdio_file *stdio = ui_file_data (file); if (stdio->magic != &stdio_file_magic) - internal_error ("stdio_file_delete: bad magic number"); + internal_error (__FILE__, __LINE__, + "stdio_file_delete: bad magic number"); if (stdio->close_p) { fclose (stdio->file); } - free (stdio); + xfree (stdio); } static void -stdio_file_flush (file) - struct ui_file *file; +stdio_file_flush (struct ui_file *file) { struct stdio_file *stdio = ui_file_data (file); if (stdio->magic != &stdio_file_magic) - internal_error ("stdio_file_flush: bad magic number"); + internal_error (__FILE__, __LINE__, + "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 ("stdio_file_write: bad magic number"); + internal_error (__FILE__, __LINE__, + "stdio_file_write: bad magic number"); fwrite (buf, length_buf, 1, stdio->file); } static void -stdio_file_fputs (linebuffer, file) - const char *linebuffer; - struct ui_file *file; +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 ("stdio_file_fputs: bad magic number"); + internal_error (__FILE__, __LINE__, + "stdio_file_fputs: bad magic number"); fputs (linebuffer, stdio->file); } static int -stdio_file_isatty (file) - struct ui_file *file; +stdio_file_isatty (struct ui_file *file) { struct stdio_file *stdio = ui_file_data (file); if (stdio->magic != &stdio_file_magic) - internal_error ("stdio_file_isatty: bad magic number"); + internal_error (__FILE__, __LINE__, + "stdio_file_isatty: bad magic number"); return (isatty (fileno (stdio->file))); } /* Like fdopen(). Create a ui_file from a previously opened FILE. */ struct ui_file * -stdio_fileopen (file) - FILE *file; +stdio_fileopen (FILE *file) { return stdio_file_new (file, 0); } struct ui_file * -gdb_fopen (name, mode) - char *name; - char *mode; +gdb_fopen (char *name, char *mode) { FILE *f = fopen (name, mode); if (f == NULL) 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); +}