OSDN Git Service

PR libgcj/18840:
authortromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Jan 2005 20:04:33 +0000 (20:04 +0000)
committertromey <tromey@138bc75d-0d04-0410-961f-82ee72b054a4>
Tue, 11 Jan 2005 20:04:33 +0000 (20:04 +0000)
* java/io/BufferedInputStream.java (read): Repeatedly read to
fill buffer.
(refill): Change test to see if buffer must be grown.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@93192 138bc75d-0d04-0410-961f-82ee72b054a4

libjava/ChangeLog
libjava/java/io/BufferedInputStream.java

index 14bc828..1276a68 100644 (file)
@@ -1,3 +1,10 @@
+2005-01-11  Tom Tromey  <tromey@redhat.com>
+
+       PR libgcj/18840:
+       * java/io/BufferedInputStream.java (read): Repeatedly read to
+       fill buffer.
+       (refill): Change test to see if buffer must be grown.
+
 2005-01-10  Tom Tromey  <tromey@redhat.com>
 
        * mauve-libgcj: Exclude some swing tests.
index 27fc4b7..5343f07 100644 (file)
@@ -1,5 +1,5 @@
 /* BufferedInputStream.java -- An input stream that implements buffering
-   Copyright (C) 1998, 1999, 2001, 2004  Free Software Foundation, Inc.
+   Copyright (C) 1998, 1999, 2001, 2004, 2005  Free Software Foundation, Inc.
 
 This file is part of GNU Classpath.
 
@@ -198,7 +198,7 @@ public class BufferedInputStream extends FilterInputStream
   {
     marktarget = marklimit = readlimit;
     if (marklimit > CHUNKSIZE)
-       marklimit = CHUNKSIZE;
+      marklimit = CHUNKSIZE;
     markpos = pos;
   }
 
@@ -241,7 +241,10 @@ public class BufferedInputStream extends FilterInputStream
    * This method reads bytes from a stream and stores them into a caller
    * supplied buffer.  It starts storing the data at index <code>off</code>
    * into the buffer and attempts to read <code>len</code> bytes.  This method
-   * can return before reading the number of bytes requested.
+   * can return before reading the number of bytes requested, but it will try
+   * to read the requested number of bytes by repeatedly calling the underlying
+   * stream as long as available() for this stream continues to return a
+   * non-zero value (or until the requested number of bytes have been read).
    * The actual number of bytes read is returned as an int.  A -1 is returned
    * to indicate the end of the stream.
    * <p>
@@ -263,16 +266,34 @@ public class BufferedInputStream extends FilterInputStream
     if (off < 0 || len < 0 || b.length - off < len)
       throw new IndexOutOfBoundsException();
 
+    if (len == 0)
+      return 0;
+
     if (pos >= count && !refill())
       return -1;               // No bytes were read before EOF.
 
     int totalBytesRead = Math.min(count - pos, len);
     System.arraycopy(buf, pos, b, off, totalBytesRead);
     pos += totalBytesRead;
+    off += totalBytesRead;
+    len -= totalBytesRead;
 
     if (markpos >= 0 && pos - markpos > marktarget)
       markpos = -1;
 
+    while (len > 0 && super.available() > 0 && refill())
+      {
+       int remain = Math.min(count - pos, len);
+       System.arraycopy(buf, pos, b, off, remain);
+       pos += remain;
+       off += remain;
+       len -= remain;
+       totalBytesRead += remain;
+
+       if (markpos >= 0 && pos - markpos > marktarget)
+         markpos = -1;
+      }
+
     return totalBytesRead;
   }
 
@@ -311,7 +332,7 @@ public class BufferedInputStream extends FilterInputStream
   public synchronized long skip(long n) throws IOException
   {
     if (buf == null)
-       throw new IOException("Stream closed.");
+      throw new IOException("Stream closed.");
 
     final long origN = n;
 
@@ -343,7 +364,7 @@ public class BufferedInputStream extends FilterInputStream
   boolean refill() throws IOException
   {
     if (buf == null)
-       throw new IOException("Stream closed.");
+      throw new IOException("Stream closed.");
 
     if (markpos < 0)
       count = pos = 0;
@@ -357,7 +378,7 @@ public class BufferedInputStream extends FilterInputStream
        pos -= markpos;
        markpos = 0;
       }
-    else if (marktarget >= buf.length && marklimit < marktarget)       // BTW, markpos == 0
+    else if (count >= buf.length && count < marktarget)        // BTW, markpos == 0
       {
        // Need to grow the buffer now to have room for marklimit bytes.
        // Note that the new buffer is one greater than marklimit.
@@ -378,6 +399,6 @@ public class BufferedInputStream extends FilterInputStream
       return false;
 
     count += numread;
-    return true;
+    return numread > 0;
   }
 }