home *** CD-ROM | disk | FTP | other *** search
/ Cre@te Online 2000 December / Cre@teOnline CD05.iso / MacSoft / XML ConsoleMax.sea / XML ConsoleMax / Required / parser.jar / com / sun / xml / parser / XmlReader$Utf8Reader.class (.txt) < prev   
Encoding:
Java Class File  |  2000-02-23  |  2.4 KB  |  121 lines

  1. package com.sun.xml.parser;
  2.  
  3. import java.io.CharConversionException;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6.  
  7. final class XmlReader$Utf8Reader extends XmlReader.BaseReader {
  8.    private char nextChar;
  9.  
  10.    XmlReader$Utf8Reader(InputStream var1) {
  11.       super(var1);
  12.    }
  13.  
  14.    public int read(char[] var1, int var2, int var3) throws IOException {
  15.       int var4 = 0;
  16.       int var5 = 0;
  17.       if (var3 <= 0) {
  18.          return 0;
  19.       } else if (var2 + var3 <= var1.length && var2 >= 0) {
  20.          if (this.nextChar != 0) {
  21.             var1[var2 + var4++] = this.nextChar;
  22.             this.nextChar = 0;
  23.          }
  24.  
  25.          while(var4 < var3) {
  26.             if (super.finish <= super.start) {
  27.                if (super.instream == null) {
  28.                   var5 = -1;
  29.                   break;
  30.                }
  31.  
  32.                super.start = 0;
  33.                super.finish = super.instream.read(super.buffer, 0, super.buffer.length);
  34.                if (super.finish <= 0) {
  35.                   ((XmlReader.BaseReader)this).close();
  36.                   var5 = -1;
  37.                   break;
  38.                }
  39.             }
  40.  
  41.             var5 = super.buffer[super.start] & 255;
  42.             if ((var5 & 128) == 0) {
  43.                ++super.start;
  44.                var1[var2 + var4++] = (char)var5;
  45.             } else {
  46.                int var6 = super.start;
  47.  
  48.                try {
  49.                   if ((super.buffer[var6] & 224) == 192) {
  50.                      var5 = (super.buffer[var6++] & 31) << 6;
  51.                      var5 += super.buffer[var6++] & 63;
  52.                   } else if ((super.buffer[var6] & 240) == 224) {
  53.                      var5 = (super.buffer[var6++] & 15) << 12;
  54.                      var5 += (super.buffer[var6++] & 63) << 6;
  55.                      var5 += super.buffer[var6++] & 63;
  56.                   } else {
  57.                      if ((super.buffer[var6] & 248) != 240) {
  58.                         throw new CharConversionException("Unconvertible UTF-8 character beginning with 0x" + Integer.toHexString(super.buffer[super.start] & 255));
  59.                      }
  60.  
  61.                      var5 = (super.buffer[var6++] & 7) << 18;
  62.                      var5 += (super.buffer[var6++] & 63) << 12;
  63.                      var5 += (super.buffer[var6++] & 63) << 6;
  64.                      var5 += super.buffer[var6++] & 63;
  65.                      if (var5 > 1114111) {
  66.                         throw new CharConversionException("UTF-8 encoding of character 0x00" + Integer.toHexString(var5) + " can't be converted to Unicode.");
  67.                      }
  68.  
  69.                      if (var5 > 65535) {
  70.                         var5 -= 65536;
  71.                         this.nextChar = (char)('\udc00' + (var5 & 1023));
  72.                         var5 = '\ud800' + (var5 >> 10);
  73.                      }
  74.                   }
  75.                } catch (ArrayIndexOutOfBoundsException var7) {
  76.                   var5 = 0;
  77.                }
  78.  
  79.                if (var6 > super.finish) {
  80.                   System.arraycopy(super.buffer, super.start, super.buffer, 0, super.finish - super.start);
  81.                   super.finish -= super.start;
  82.                   super.start = 0;
  83.                   var6 = super.instream.read(super.buffer, super.finish, super.buffer.length - super.finish);
  84.                   if (var6 < 0) {
  85.                      ((XmlReader.BaseReader)this).close();
  86.                      throw new CharConversionException("Partial UTF-8 char");
  87.                   }
  88.  
  89.                   super.finish += var6;
  90.                } else {
  91.                   ++super.start;
  92.  
  93.                   while(super.start < var6) {
  94.                      if ((super.buffer[super.start] & 192) != 128) {
  95.                         ((XmlReader.BaseReader)this).close();
  96.                         throw new CharConversionException("Malformed UTF-8 char -- is an XML encoding declaration missing?");
  97.                      }
  98.  
  99.                      ++super.start;
  100.                   }
  101.  
  102.                   var1[var2 + var4++] = (char)var5;
  103.                   if (this.nextChar != 0 && var4 < var3) {
  104.                      var1[var2 + var4++] = this.nextChar;
  105.                      this.nextChar = 0;
  106.                   }
  107.                }
  108.             }
  109.          }
  110.  
  111.          if (var4 > 0) {
  112.             return var4;
  113.          } else {
  114.             return var5 == -1 ? -1 : 0;
  115.          }
  116.       } else {
  117.          throw new ArrayIndexOutOfBoundsException();
  118.       }
  119.    }
  120. }
  121.