You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@xerces.apache.org by je...@locus.apache.org on 2000/08/02 03:15:48 UTC

cvs commit: xml-xerces/java/src/org/apache/xerces/readers UTF8Reader.java

jeffreyr    00/08/01 18:15:48

  Modified:    java/src/org/apache/xerces/readers UTF8Reader.java
  Log:
  UTF8Reader.java
  
  Revision  Changes    Path
  1.6       +51 -31    xml-xerces/java/src/org/apache/xerces/readers/UTF8Reader.java
  
  Index: UTF8Reader.java
  ===================================================================
  RCS file: /home/cvs/xml-xerces/java/src/org/apache/xerces/readers/UTF8Reader.java,v
  retrieving revision 1.5
  retrieving revision 1.6
  diff -u -r1.5 -r1.6
  --- UTF8Reader.java	2000/05/17 18:32:41	1.5
  +++ UTF8Reader.java	2000/08/02 01:15:48	1.6
  @@ -88,7 +88,7 @@
    * the SUN java runtime compiler (JIT) and the code here has been
    * carefully "crafted" to avoid those problems.
    * 
  - * @version $Id: UTF8Reader.java,v 1.5 2000/05/17 18:32:41 jeffreyr Exp $
  + * @version $Id: UTF8Reader.java,v 1.6 2000/08/02 01:15:48 jeffreyr Exp $
    */
   final class UTF8Reader extends XMLEntityReader {
       //
  @@ -146,7 +146,7 @@
               fCurrentChunk = fCurrentChunk.nextChunk();
               fCurrentIndex = 0;
               fMostRecentData = fCurrentChunk.toByteArray();
  -            return (fMostRecentByte = fMostRecentData[fCurrentIndex] & 0xFF);
  +            return(fMostRecentByte = fMostRecentData[fCurrentIndex] & 0xFF);
           } else {
               fCurrentChunk = UTF8DataChunk.createChunk(fStringPool, fCurrentChunk);
               return fillCurrentChunk();
  @@ -166,14 +166,14 @@
               if (++fCurrentIndex == UTF8DataChunk.CHUNK_SIZE)
                   return slowLoadNextByte();
               else
  -                return (fMostRecentByte = fMostRecentData[fCurrentIndex] & 0xFF);
  +                return(fMostRecentByte = fMostRecentData[fCurrentIndex] & 0xFF);
           }
       }
       //
       //
       //
       private boolean atEOF(int offset) {
  -        return (offset > fLength);
  +        return(offset > fLength);
       }
       //
       //
  @@ -425,20 +425,30 @@
           // ch = ((0x0f & b0)<<18) + ((0x3f & b1)<<12) + ((0x3f & b2)<<6) + (0x3f & b3); // u uuuu zzzz yyyy yyxx xxxx (0x10000 to 0x1ffff)
           // if (ch >= 0x110000)
           boolean result = false;
  -        if (!(b0 > 0xF4 || (b0 == 0xF4 && b1 >= 0x90))) { // [#x10000-#x10FFFF]
  -            if (skipPastChar) {
  -                fCharacterCounter++;
  -                loadNextByte();
  -                return true;
  +
  +        if (( 0xf8 & b0 ) == 0xf0 ) {
  +            if (!(b0 > 0xF4 || (b0 == 0xF4 && b1 >= 0x90))) { // [#x10000-#x10FFFF]
  +                if (skipPastChar) {
  +                    fCharacterCounter++;
  +                    loadNextByte();
  +                    return true;
  +                }
  +                result = true;
               }
  -            result = true;
  +            fCurrentChunk = saveChunk;
  +            fCurrentIndex = saveIndex;
  +            fCurrentOffset = saveOffset;
  +            fMostRecentData = saveChunk.toByteArray();
  +            fMostRecentByte = b0;
  +            return result;
  +        } else{
  +            fCurrentChunk = saveChunk;
  +            fCurrentIndex = saveIndex;
  +            fCurrentOffset = saveOffset;
  +            fMostRecentData = saveChunk.toByteArray();
  +            fMostRecentByte = b0;
  +            return result;
           }
  -        fCurrentChunk = saveChunk;
  -        fCurrentIndex = saveIndex;
  -        fCurrentOffset = saveOffset;
  -        fMostRecentData = saveChunk.toByteArray();
  -        fMostRecentByte = b0;
  -        return result;
       }
       //
       //
  @@ -794,7 +804,7 @@
               int b1 = loadNextByte();
               if ((0xe0 & b0) == 0xc0) { // 110yyyyy 10xxxxxx
                   ch = ((0x1f & b0)<<6) + (0x3f & b1);
  -            } else {
  +            } else if(( 0xf8 & b0 ) == 0xf0 ){
                   int b2 = loadNextByte();
                   if ((0xf0 & b0) == 0xe0) { // 1110zzzz 10yyyyyy 10xxxxxx
                       // if ((ch >= 0xD800 && ch <= 0xDFFF) || ch >= 0xFFFE)
  @@ -802,7 +812,7 @@
                   } else {
                       int b3 = loadNextByte(); // 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx
                       ch = ((0x0f & b0)<<18) + ((0x3f & b1)<<12)
  -                           + ((0x3f & b2)<<6) + (0x3f & b3);
  +                         + ((0x3f & b2)<<6) + (0x3f & b3);
                   }
               }
           }
  @@ -2504,10 +2514,29 @@
               loadNextByte();
               return true;
           }
  +
           int b3 = loadNextByte();  // 11110uuu 10uuzzzz 10yyyyyy 10xxxxxx
           // ch = ((0x0f & b0)<<18) + ((0x3f & b1)<<12) + ((0x3f & b2)<<6) + (0x3f & b3); // u uuuu zzzz yyyy yyxx xxxx (0x10000 to 0x1ffff)
           // if (ch >= 0x110000)
  -        if (b0 > 0xF4 || (b0 == 0xF4 && b1 >= 0x90)) {
  +        if (( 0xf8 & b0 ) == 0xf0 ) {
  +            if (b0 > 0xF4 || (b0 == 0xF4 && b1 >= 0x90)) {
  +                fCurrentChunk = saveChunk;
  +                fCurrentIndex = saveIndex;
  +                fCurrentOffset = saveOffset;
  +                fMostRecentData = saveChunk.toByteArray();
  +                fMostRecentByte = b0;
  +                return false;
  +            }
  +            int ch = ((0x0f & b0)<<18) + ((0x3f & b1)<<12) + ((0x3f & b2)<<6) + (0x3f & b3);
  +            if (ch < 0x10000) {
  +                appendCharData(ch);
  +            } else {
  +                appendCharData(((ch-0x00010000)>>10)+0xd800);
  +                appendCharData(((ch-0x00010000)&0x3ff)+0xdc00);
  +            }
  +            loadNextByte();
  +            return true;
  +        } else {
               fCurrentChunk = saveChunk;
               fCurrentIndex = saveIndex;
               fCurrentOffset = saveOffset;
  @@ -2515,15 +2544,6 @@
               fMostRecentByte = b0;
               return false;
           }
  -        int ch = ((0x0f & b0)<<18) + ((0x3f & b1)<<12) + ((0x3f & b2)<<6) + (0x3f & b3);
  -        if (ch < 0x10000) {
  -            appendCharData(ch);
  -        } else {
  -            appendCharData(((ch-0x00010000)>>10)+0xd800);
  -            appendCharData(((ch-0x00010000)&0x3ff)+0xdc00);
  -        }
  -        loadNextByte();
  -        return true;
       }
       private boolean skipMultiByteCharData(int b0) throws Exception {
           UTF8DataChunk saveChunk = fCurrentChunk;
  @@ -2696,7 +2716,7 @@
       //
       //
       //
  -    private static final char[] cdata_string = { 'C','D','A','T','A','[' };
  +    private static final char[] cdata_string = { 'C','D','A','T','A','['};
       private StringPool.CharArrayRange fCharArrayRange = null;
       private InputStream fInputStream = null;
       private StringPool fStringPool = null;
  @@ -2719,7 +2739,7 @@
               fMostRecentData = buf;
               fCurrentIndex = 0;
               fCurrentChunk.setByteArray(fMostRecentData);
  -            return (fMostRecentByte = fMostRecentData[0] & 0xFF);
  +            return(fMostRecentByte = fMostRecentData[0] & 0xFF);
           }
           if (buf == null)
               buf = new byte[UTF8DataChunk.CHUNK_SIZE];
  @@ -2753,6 +2773,6 @@
           fLength += offset;
           fCurrentIndex = 0;
           fCurrentChunk.setByteArray(fMostRecentData);
  -        return (fMostRecentByte = fMostRecentData[0] & 0xFF);
  +        return(fMostRecentByte = fMostRecentData[0] & 0xFF);
       }
   }