* gdb-add-index.sh: Really remove.
[deliverable/binutils-gdb.git] / gdb / ui-file.c
index 5a2d04778fe19f19dc36e4fd1d0c951eb60818ae..f40bfdb89f0674d4bca60f6de98766c0d6a59050 100644 (file)
@@ -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,
    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 <http://www.gnu.org/licenses/>.  */
 
 /* 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 <errno.h>
 
@@ -55,6 +56,7 @@ struct ui_file *
 ui_file_new (void)
 {
   struct ui_file *file = xmalloc (sizeof (struct ui_file));
+
   file->magic = &ui_file_magic;
   set_ui_file_data (file, NULL, null_file_delete);
   set_ui_file_flush (file, null_file_flush);
@@ -118,6 +120,7 @@ null_file_write (struct ui_file *file,
          is possible to clean up that code.  */
       int i;
       char b[2];
+
       b[1] = '\0';
       for (i = 0; i < sizeof_buf; i++)
        {
@@ -264,7 +267,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
 {
@@ -276,6 +279,7 @@ static void
 do_ui_file_xstrdup (void *context, const char *buffer, long length)
 {
   struct accumulated_ui_file *acc = context;
+
   if (acc->buffer == NULL)
     acc->buffer = xmalloc (length + 1);
   else
@@ -286,18 +290,37 @@ 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;
   acc.length = 0;
   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);
+}
 \f
 /* A pure memory based ``struct ui_file'' that can be used an output
    buffer. The buffers accumulated contents are available via
@@ -323,6 +346,7 @@ mem_file_new (void)
 {
   struct mem_file *stream = XMALLOC (struct mem_file);
   struct ui_file *file = ui_file_new ();
+
   set_ui_file_data (file, stream, mem_file_delete);
   set_ui_file_rewind (file, mem_file_rewind);
   set_ui_file_put (file, mem_file_put);
@@ -338,6 +362,7 @@ static void
 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"));
@@ -356,6 +381,7 @@ static void
 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"));
@@ -368,6 +394,7 @@ mem_file_put (struct ui_file *file,
              void *dest)
 {
   struct mem_file *stream = ui_file_data (file);
+
   if (stream->magic != &mem_file_magic)
     internal_error (__FILE__, __LINE__,
                    _("mem_file_put: bad magic number"));
@@ -381,6 +408,7 @@ mem_file_write (struct ui_file *file,
                long length_buffer)
 {
   struct mem_file *stream = ui_file_data (file);
+
   if (stream->magic != &mem_file_magic)
     internal_error (__FILE__, __LINE__,
                    _("mem_file_write: bad magic number"));
@@ -394,6 +422,7 @@ mem_file_write (struct ui_file *file,
   else
     {
       int new_length = stream->length_buffer + length_buffer;
+
       if (new_length >= stream->sizeof_buffer)
        {
          stream->sizeof_buffer = new_length;
@@ -429,6 +458,7 @@ 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));
+
   stdio->magic = &stdio_file_magic;
   stdio->file = file;
   stdio->close_p = close_p;
@@ -445,6 +475,7 @@ static void
 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"));
@@ -459,6 +490,7 @@ static void
 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"));
@@ -469,9 +501,24 @@ 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);
 }
 
@@ -479,26 +526,33 @@ 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);
+  /* Calling error crashes when we are called from the exception framework.  */
+  if (fwrite (buf, length_buf, 1, stdio->file))
+    ;
 }
 
 static void
 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);
+  /* Calling error crashes when we are called from the exception framework.  */
+  if (fputs (linebuffer, stdio->file))
+    ;
 }
 
 static int
 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"));
@@ -517,6 +571,7 @@ struct ui_file *
 gdb_fopen (char *name, char *mode)
 {
   FILE *f = fopen (name, mode);
+
   if (f == NULL)
     return NULL;
   return stdio_file_new (f, 1);
@@ -545,6 +600,7 @@ tee_file_new (struct ui_file *one, int close_one,
 {
   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;
@@ -562,6 +618,7 @@ 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"));
@@ -577,6 +634,7 @@ 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"));
@@ -588,6 +646,7 @@ 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"));
@@ -599,6 +658,7 @@ 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"));
@@ -610,8 +670,10 @@ 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);
+
+  return ui_file_isatty (tee->one);
 }
This page took 0.026661 seconds and 4 git commands to generate.