Hi,
On Thu, 2003-06-05 at 17:54, Mark Wielaard wrote:
> On Thu, 2003-06-05 at 15:48, Helmer Kr�mer wrote:
> > So I would not completely remove the loop, but rather replace it with
> > something like "do {} while (len>0 && available()>0)"; dunno whether
> > that's really more correct, though...
> >
> > What do you think?
>
> Seems that is more correct. But since available() isn't that reliable I
> wouldn't implement it that way since it might make the method block much
> more then needed. See for example the java.util.ZipInputStream
> available() method definition (which says to almost always returns 1!).
>
> Also note that the javadoc say:
>
> Subclasses of this class are encouraged, but not required, to
> attempt to read as many bytes as possible in the same fashion.
>
> So users cannot rely on this behaviour anyway.
But I did try it out and the attached patch does what you suggest. Makes
the simple ReadLineTest and Snark work correctly and doesn't introduce
Mauve or make check regressions.
Cheers,
Mark
Index: libraries/javalib/java/io/BufferedInputStream.java
===================================================================
RCS file: /cvs/kaffe/kaffe/libraries/javalib/java/io/BufferedInputStream.java,v
retrieving revision 1.10
diff -u -r1.10 BufferedInputStream.java
--- libraries/javalib/java/io/BufferedInputStream.java 4 Apr 2003 06:11:41 -0000 1.10
+++ libraries/javalib/java/io/BufferedInputStream.java 5 Jun 2003 16:41:50 -0000
@@ -103,8 +103,8 @@
}
int total = 0;
- while (len > 0) {
+ do {
// If buffer fully consumed, invalidate mark & reset buffer
if (pos == buf.length) {
pos = count = 0;
@@ -138,7 +138,8 @@
pos += nread;
off += nread;
len -= nread;
- }
+ } while (len > 0 && available() > 0);
+
return total;
}