Index: java/io/InputStreamReader.java =================================================================== RCS file: /cvsroot/classpath/classpath/java/io/InputStreamReader.java,v retrieving revision 1.22 diff -u -r1.22 InputStreamReader.java --- java/io/InputStreamReader.java 15 Apr 2005 16:13:34 -0000 1.22 +++ java/io/InputStreamReader.java 18 Apr 2005 22:06:15 -0000 @@ -336,7 +336,6 @@ throw new IOException("Reader has been closed"); if (isDone) return -1; - if(decoder != null){ int totalBytes = (int)((double)length * maxBytesPerChar); byte[] bytes = new byte[totalBytes]; @@ -360,6 +359,7 @@ read = remaining; byteBuffer = ByteBuffer.wrap(bytes, 0, read); CharBuffer cb = CharBuffer.wrap(buf, offset, length); + int startPos = cb.position(); if(hasSavedSurrogate){ hasSavedSurrogate = false; @@ -369,16 +369,18 @@ CoderResult cr = decoder.decode(byteBuffer, cb, isDone); decoder.reset(); - // 1 char remains which is the first half of a surrogate pair. if(cr.isOverflow() && cb.hasRemaining()){ CharBuffer overflowbuf = CharBuffer.allocate(2); cr = decoder.decode(byteBuffer, overflowbuf, isDone); overflowbuf.flip(); - cb.put(overflowbuf.get()); - savedSurrogate = overflowbuf.get(); - hasSavedSurrogate = true; - isDone = false; + if(overflowbuf.hasRemaining()) + { + cb.put(overflowbuf.get()); + savedSurrogate = overflowbuf.get(); + hasSavedSurrogate = true; + isDone = false; + } } if(byteBuffer.hasRemaining()) { @@ -388,7 +390,7 @@ } else byteBuffer = null; - return (read == 0)?-1:cb.position(); + return (read == 0)?-1:(cb.position() - startPos); } else { byte[] bytes = new byte[length]; int read = in.read(bytes);