Wed Dec 20 18:23:10 1995 Roland McGrath <roland@churchy.gnu.ai.mit.edu>
authorRoland McGrath <roland@gnu.org>
Thu, 21 Dec 1995 10:00:22 +0000 (10:00 +0000)
committerRoland McGrath <roland@gnu.org>
Thu, 21 Dec 1995 10:00:22 +0000 (10:00 +0000)
* stdio/internals.c (flushbuf): If the target is -1, always
discard the buffer of read data.
Only set TWIDDLED flag in !ALIGNED case.
Never increment target or offset when old value is -1.

ChangeLog
stdio/internals.c

index 6375ebb..66f7e41 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,10 @@
+Wed Dec 20 18:23:10 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
+
+       * stdio/internals.c (flushbuf): If the target is -1, always
+       discard the buffer of read data.
+       Only set TWIDDLED flag in !ALIGNED case.
+       Never increment target or offset when old value is -1.
+
 Tue Dec 19 17:00:42 1995  Roland McGrath  <roland@churchy.gnu.ai.mit.edu>
 
        * hurd/hurdpid.c (_S_msg_proc_newids): Only run the hook when the
index c238bf3..acdf977 100644 (file)
@@ -199,9 +199,14 @@ DEFUN(flushbuf, (fp, c),
 
       size_t buffer_offset = 0;
 
-      /* If the user has read some of the buffer, the target position
-        is incremented for each character he has read.  */
-      fp->__target += fp->__bufp - fp->__buffer;
+      if (fp->__target == -1)
+       /* For an unseekable object, data recently read bears no relation
+          to data we will write later.  Discard the buffer.  */
+       fp->__get_limit = fp->__buffer;
+      else
+       /* If the user has read some of the buffer, the target position
+          is incremented for each character he has read.  */
+       fp->__target += fp->__bufp - fp->__buffer;
 
       if (fp->__mode.__read && fp->__room_funcs.__input != NULL &&
          !fp->__mode.__append)
@@ -231,12 +236,12 @@ DEFUN(flushbuf, (fp, c),
                /* Start bufp as far into the buffer as we were into
                   this block before we read it.  */
                buffer_offset = o;
-           }
 
-         /* The target position is now set to where the beginning of the
-            buffer maps to; and the get_limit was set by the input-room
-            function.  */
-         twiddled = 1;
+             /* The target position is now set to where the beginning of the
+                buffer maps to; and the get_limit was set by the input-room
+                function.  */
+             twiddled = 1;
+           }
        }
 
       if (fp->__buffer != NULL)
@@ -289,7 +294,8 @@ DEFUN(flushbuf, (fp, c),
         call with nothing in the buffer, so just say the buffer's
         been flushed, increment the file offset, and return.  */
       fp->__bufp = fp->__buffer;
-      fp->__offset += to_write;
+      if (fp->__offset != -1)
+       fp->__offset += to_write;
       goto end;
     }
 
@@ -315,7 +321,7 @@ DEFUN(flushbuf, (fp, c),
                   bother to find the current position; we can get it
                   later if we need it.  */
                fp->__offset = fp->__target = -1;
-             else
+             else if (fp->__offset != -1)
                /* Record that we've moved forward in the file.  */
                fp->__offset += wrote;
            }
@@ -339,7 +345,7 @@ DEFUN(flushbuf, (fp, c),
          char cc = (unsigned char) c;
          if ((*fp->__io_funcs.__write)(fp->__cookie, &cc, 1) < 1)
            fp->__error = 1;
-         else
+         else if (fp->__offset != -1)
            {
              /* Record that we've moved forward in the file.  */
              ++fp->__offset;
@@ -355,9 +361,10 @@ DEFUN(flushbuf, (fp, c),
 
   if (!twiddled)
     {
-      /* The new target position moves up as
-        much as the user wrote into the buffer.  */
-      fp->__target += buffer_written;
+      if (fp->__target != -1)
+       /* The new target position moves up as
+          much as the user wrote into the buffer.  */
+       fp->__target += buffer_written;
 
       /* Set the reading limit to the beginning of the buffer,
         so the next `getc' will call __fillbf.  */
@@ -433,8 +440,9 @@ DEFUN(fillbuf, (fp), register FILE *fp)
          buffer += count;
          nread += count;
          to_read -= count;
-         /* Record that we've moved forward in the file.  */
-         fp->__offset += count;
+         if (fp->__offset != -1)
+           /* Record that we've moved forward in the file.  */
+           fp->__offset += count;
        }
     }