diff options
-rw-r--r-- | libjava/ChangeLog | 6 | ||||
-rw-r--r-- | libjava/java/io/PushbackInputStream.java | 19 |
2 files changed, 18 insertions, 7 deletions
diff --git a/libjava/ChangeLog b/libjava/ChangeLog index 0b15ae6..1f8e835 100644 --- a/libjava/ChangeLog +++ b/libjava/ChangeLog @@ -4,6 +4,12 @@ * java/io/FileInputStream.java (skip): Call fd.getFilePointer() and calculate correct number of bytes skipped. + + Based on patch from Intel's ORP team: + * java/io/PushbackInputStream.java (available): Calculate correct + number of bytes in buffer. + (read): Remove redundant bound check. Return bytes from both the + buffer and the stream. 2002-03-24 Tom Tromey <tromey@redhat.com> diff --git a/libjava/java/io/PushbackInputStream.java b/libjava/java/io/PushbackInputStream.java index 7afd3d5..ebf0e38 100644 --- a/libjava/java/io/PushbackInputStream.java +++ b/libjava/java/io/PushbackInputStream.java @@ -1,5 +1,5 @@ /* PushbackInputStream.java -- An input stream that can unread bytes - Copyright (C) 1998, 1999, 2001, 2001 Free Software Foundation, Inc. + Copyright (C) 1998, 1999, 2001, 2002 Free Software Foundation, Inc. This file is part of GNU Classpath. @@ -116,7 +116,7 @@ public class PushbackInputStream extends FilterInputStream */ public int available() throws IOException { - return pos + super.available(); + return (buf.length - pos) + super.available(); } /** @@ -200,18 +200,23 @@ public class PushbackInputStream extends FilterInputStream */ public synchronized int read(byte[] b, int off, int len) throws IOException { - if (off < 0 || len < 0 || off + len > b.length) - throw new ArrayIndexOutOfBoundsException(); - int numBytes = Math.min(buf.length - pos, len); if (numBytes > 0) { System.arraycopy (buf, pos, b, off, numBytes); pos += numBytes; - return numBytes; + len -= numBytes; + off += numBytes; } - return super.read(b, off, len); + if (len > 0) + { + len = super.read(b, off, len); + if (len == -1) // EOF + return numBytes > 0 ? numBytes : -1; + numBytes += len; + } + return numBytes; } /** |