X-Git-Url: http://drtracing.org/?a=blobdiff_plain;f=gdb%2Fui-file.c;h=1760b4c05288cf3b60329f4f34e23ab771fd9403;hb=94af9270db6b89f9a3a1f72e8f5091fee8b0294b;hp=3af6d2cc3b252c350725065c03484b00f8407919;hpb=2ee563b53258d390d7446e90a67f465d504ae44c;p=deliverable%2Fbinutils-gdb.git diff --git a/gdb/ui-file.c b/gdb/ui-file.c index 3af6d2cc3b..1760b4c052 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, 2009, 2010 + 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,19 +16,22 @@ 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. */ #include "defs.h" #include "ui-file.h" +#include "gdb_obstack.h" #include "gdb_string.h" +#include "gdb_select.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 +43,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 +61,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 +129,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 +163,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 +201,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 +244,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) { @@ -238,7 +265,7 @@ set_ui_file_data (struct ui_file *file, void *data, } /* ui_file utility function for converting a ``struct ui_file'' into - a memory buffer''. */ + a memory buffer. */ struct accumulated_ui_file { @@ -260,8 +287,7 @@ do_ui_file_xstrdup (void *context, const char *buffer, long length) } char * -ui_file_xstrdup (struct ui_file *file, - long *length) +ui_file_xstrdup (struct ui_file *file, long *length) { struct accumulated_ui_file acc; acc.buffer = NULL; @@ -269,9 +295,27 @@ ui_file_xstrdup (struct ui_file *file, ui_file_put (file, do_ui_file_xstrdup, &acc); if (acc.buffer == NULL) acc.buffer = xstrdup (""); - *length = acc.length; + if (length != NULL) + *length = acc.length; return acc.buffer; } + +static void +do_ui_file_obsavestring (void *context, const char *buffer, long length) +{ + struct obstack *obstack = (struct obstack *) context; + obstack_grow (obstack, buffer, length); +} + +char * +ui_file_obsavestring (struct ui_file *file, struct obstack *obstack, + long *length) +{ + ui_file_put (file, do_ui_file_obsavestring, obstack); + *length = obstack_object_size (obstack); + obstack_1grow (obstack, '\0'); + return obstack_finish (obstack); +} /* A pure memory based ``struct ui_file'' that can be used an output buffer. The buffers accumulated contents are available via @@ -314,7 +358,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 +376,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 +388,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 +401,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 +427,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 +454,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 +465,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,18 +479,43 @@ 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")); + + /* For the benefit of Windows, call gdb_select before reading from + the file. Wait until at least one byte of data is available. + Control-C can interrupt gdb_select, but not read. */ + { + int fd = fileno (stdio->file); + fd_set readfds; + FD_ZERO (&readfds); + FD_SET (fd, &readfds); + if (gdb_select (fd + 1, &readfds, NULL, NULL, NULL) == -1) + return -1; + } + + 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"); - fwrite (buf, length_buf, 1, stdio->file); + _("stdio_file_write: bad magic number")); + /* Calling error crashes when we are called from the exception framework. */ + if (fwrite (buf, length_buf, 1, stdio->file)) + ; } static void @@ -453,8 +524,10 @@ 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"); - fputs (linebuffer, stdio->file); + _("stdio_file_fputs: bad magic number")); + /* Calling error crashes when we are called from the exception framework. */ + if (fputs (linebuffer, stdio->file)) + ; } static int @@ -463,7 +536,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))); } @@ -526,7 +599,7 @@ 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"); + _("tee_file_delete: bad magic number")); if (tee->close_one) ui_file_delete (tee->one); if (tee->close_two) @@ -541,7 +614,7 @@ 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_file_flush: bad magic number")); tee->one->to_flush (tee->one); tee->two->to_flush (tee->two); } @@ -552,7 +625,7 @@ 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"); + _("tee_file_write: bad magic number")); ui_file_write (tee->one, buf, length_buf); ui_file_write (tee->two, buf, length_buf); } @@ -563,7 +636,7 @@ 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_file_fputs: bad magic number")); tee->one->to_fputs (linebuffer, tee->one); tee->two->to_fputs (linebuffer, tee->two); } @@ -574,6 +647,6 @@ 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"); + _("tee_file_isatty: bad magic number")); return (0); }