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