You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xalan.apache.org by ga...@apache.org on 2001/07/26 08:28:55 UTC

cvs commit: xml-xalan/java/src/org/apache/xalan/serialize WriterToUTF8Buffered.java

garyp       01/07/25 23:28:55

  Modified:    java/src/org/apache/xalan/serialize
                        WriterToUTF8Buffered.java
  Log:
  Fix bugzilla bug 2639 (http://nagoya.apache.org/bugzilla/show_bug.cgi?id=2639) where buffer was overflowing because the expansion of the Unicode characters into multiple UTF8 characters was not being properly taken into account.  Many thanks to Gunnlaugur Thor Briem for his "multiply by three" trick.
  
  Revision  Changes    Path
  1.3       +25 -9     xml-xalan/java/src/org/apache/xalan/serialize/WriterToUTF8Buffered.java
  
  Index: WriterToUTF8Buffered.java
  ===================================================================
  RCS file: /home/cvs/xml-xalan/java/src/org/apache/xalan/serialize/WriterToUTF8Buffered.java,v
  retrieving revision 1.2
  retrieving revision 1.3
  diff -u -r1.2 -r1.3
  --- WriterToUTF8Buffered.java	2001/06/12 19:14:56	1.2
  +++ WriterToUTF8Buffered.java	2001/07/26 06:28:55	1.3
  @@ -135,20 +135,24 @@
     public void write(final int c) throws IOException
     {
   
  -    if (count >= buf.length)
  -    {
  -      flushBuffer();
  -    }
  -
  +  
       if (c < 0x80)
  +    {
  +      if (count >= buf.length)
  +        flushBuffer();
         buf[count++] = (byte) (c);
  +    }
       else if (c < 0x800)
       {
  +      if (count+1 >= buf.length)
  +        flushBuffer();
         buf[count++] = (byte) (0xc0 + (c >> 6));
         buf[count++] = (byte) (0x80 + (c & 0x3f));
       }
       else
       {
  +      if (count+2 >= buf.length)
  +        flushBuffer();
         buf[count++] = (byte) (0xe0 + (c >> 12));
         buf[count++] = (byte) (0x80 + ((c >> 6) & 0x3f));
         buf[count++] = (byte) (0x80 + (c & 0x3f));
  @@ -241,8 +245,14 @@
     public void write(final char chars[], final int start, final int length)
             throws java.io.IOException
     {
  +
  +    // We multiply the length by three since this is the maximum length
  +    // of the characters that we can put into the buffer.  It is possible
  +    // for each Unicode character to expand to three bytes.
  +
  +    int lengthx3 = (length << 1) + length;
   
  -    if (length >= buf.length)
  +    if (lengthx3 >= buf.length)
       {
   
         /* If the request length exceeds the size of the output buffer,
  @@ -254,7 +264,7 @@
         return;
       }
   
  -    if (length > buf.length - count)
  +    if (lengthx3 > buf.length - count)
       {
         flushBuffer();
       }
  @@ -293,8 +303,14 @@
     {
   
       final int length = s.length();
  +
  +    // We multiply the length by three since this is the maximum length
  +    // of the characters that we can put into the buffer.  It is possible
  +    // for each Unicode character to expand to three bytes.
  +
  +    int lengthx3 = (length << 1) + length;
   
  -    if (length >= buf.length)
  +    if (lengthx3 >= buf.length)
       {
   
         /* If the request length exceeds the size of the output buffer,
  @@ -306,7 +322,7 @@
         return;
       }
   
  -    if (length > buf.length - count)
  +    if (lengthx3 > buf.length - count)
       {
         flushBuffer();
       }
  
  
  

---------------------------------------------------------------------
To unsubscribe, e-mail: xalan-cvs-unsubscribe@xml.apache.org
For additional commands, e-mail: xalan-cvs-help@xml.apache.org