I made patches that may solve the problem:
  URL: http://rufus.w3.org/tools/Kaffe/messages/5936.html
  Subject: ByteToCharUTF8.java cannot handle long strings
  From: [EMAIL PROTECTED]
  Date: Fri Mar 03 2000 - 06:16:19 EST

In some cases, bytes left in the ByteToCharConverter's buffer
must be reprocessed with new input bytes, and cannot be
just flushed.

So I prepared a new method "withdraw" in ByteToCharConverter
which gives back the bytes left in the buffer to the caller
of the method.

Using "withdraw", InputStreamReader can concatenate the
unprocessed bytes and newly read bytes so that they can
be successfully converted to a string. 

Attached patches:

Patch for kaffe/io/ByteToCharConverter.java

*** kaffe/io/ByteToCharConverter.java.orig      Thu Nov 11 01:56:17 1999
--- kaffe/io/ByteToCharConverter.java   Mon May 15 13:26:01 2000
***************
*** 84,89 ****
--- 84,99 ----
        }
  }
  
+ public int withdraw ( byte[] to, int tpos, int tlen ) {
+       int n = (tlen < blen ? tlen : blen);
+       System.arraycopy( buf, 0, to, 0, n);
+       if ( n < blen ) {
+               System.arraycopy( buf, n, buf, 0, blen - n);
+       }
+       blen -= n;
+       return n;
+ }
+ 
  private static ByteToCharConverter getConverterInternal ( String enc ) {
        Class cls = (Class)cache.get(enc);
        if (cls == noConverter) {

Patch for java/io/InputStreamReader.java

*** java/io/InputStreamReader.java.orig Thu Dec  9 11:05:26 1999
--- java/io/InputStreamReader.java      Mon May 15 13:30:14 2000
***************
*** 43,63 ****
  
  public int read ( char cbuf[], int off, int len ) throws IOException {
        int outlen = 0;
-       int olen;
  
        synchronized ( lock ) {
-               // First we return anything left in the converter
-               outlen = encoding.flush(cbuf, off, len);
                while (len > outlen) {
                        int n = len - outlen;
!                       if (n > inbuf.length) {
!                               n = inbuf.length;
                        }
!                       int inlen = strm.read(inbuf, 0, n);
                        if (inlen < 0) {
!                               break;
                        }
!                       outlen += encoding.convert(inbuf, 0, inlen, cbuf, off+outlen, 
len-outlen);
                        if (inlen < n) {
                                break;
                        }
--- 43,63 ----
  
  public int read ( char cbuf[], int off, int len ) throws IOException {
        int outlen = 0;
  
        synchronized ( lock ) {
                while (len > outlen) {
+                       // First we return anything left in the converter
+                       int inpos = encoding.withdraw(inbuf, 0, inbuf.length);
                        int n = len - outlen;
!                       int m = inbuf.length - inpos;
!                       if (n > m) {
!                               n = m;
                        }
!                       int inlen = strm.read(inbuf, inpos, n);
                        if (inlen < 0) {
!                               inlen = 0;
                        }
!                       outlen += encoding.convert(inbuf, 0, inpos+inlen, cbuf, 
off+outlen, len-outlen);
                        if (inlen < n) {
                                break;
                        }

Reply via email to