home *** CD-ROM | disk | FTP | other *** search
/ PC Pro 1999 April / DPPCPRO0499.ISO / April / Notes / 50b2wic.exe / DATA1.CAB / NotesProgramFilesJavaSupport / rt.jar / sun / misc / UCDecoder.class (.txt) < prev    next >
Encoding:
Java Class File  |  1998-04-23  |  3.2 KB  |  117 lines

  1. package sun.misc;
  2.  
  3. import java.io.ByteArrayOutputStream;
  4. import java.io.IOException;
  5. import java.io.InputStream;
  6. import java.io.OutputStream;
  7.  
  8. public class UCDecoder extends CharacterDecoder {
  9.    private static final byte[] map_array = new byte[]{48, 49, 50, 51, 52, 53, 54, 55, 56, 57, 65, 66, 67, 68, 69, 70, 71, 72, 73, 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 97, 98, 99, 100, 101, 102, 103, 104, 105, 106, 107, 108, 109, 110, 111, 112, 113, 114, 115, 116, 117, 118, 119, 120, 121, 122, 40, 41};
  10.    private int sequence;
  11.    private byte[] tmp = new byte[2];
  12.    private CRC16 crc = new CRC16();
  13.    private ByteArrayOutputStream lineAndSeq = new ByteArrayOutputStream(2);
  14.  
  15.    protected int bytesPerAtom() {
  16.       return 2;
  17.    }
  18.  
  19.    protected int bytesPerLine() {
  20.       return 48;
  21.    }
  22.  
  23.    protected void decodeAtom(InputStream var1, OutputStream var2, int var3) throws IOException {
  24.       byte var9 = -1;
  25.       byte var10 = -1;
  26.       byte var11 = -1;
  27.       byte[] var14 = new byte[3];
  28.       int var4 = var1.read(var14);
  29.       if (var4 != 3) {
  30.          throw new CEStreamExhausted();
  31.       } else {
  32.          for(int var15 = 0; var15 < 64 && (var9 == -1 || var10 == -1 || var11 == -1); ++var15) {
  33.             if (var14[0] == map_array[var15]) {
  34.                var9 = (byte)var15;
  35.             }
  36.  
  37.             if (var14[1] == map_array[var15]) {
  38.                var10 = (byte)var15;
  39.             }
  40.  
  41.             if (var14[2] == map_array[var15]) {
  42.                var11 = (byte)var15;
  43.             }
  44.          }
  45.  
  46.          byte var12 = (byte)(((var9 & 56) << 2) + (var10 & 31));
  47.          byte var13 = (byte)(((var9 & 7) << 5) + (var11 & 31));
  48.          int var5 = 0;
  49.          int var6 = 0;
  50.  
  51.          for(int var16 = 1; var16 < 256; var16 *= 2) {
  52.             if ((var12 & var16) != 0) {
  53.                ++var5;
  54.             }
  55.  
  56.             if ((var13 & var16) != 0) {
  57.                ++var6;
  58.             }
  59.          }
  60.  
  61.          int var7 = (var10 & 32) / 32;
  62.          int var8 = (var11 & 32) / 32;
  63.          if ((var5 & 1) != var7) {
  64.             throw new CEFormatException("UCDecoder: High byte parity error.");
  65.          } else if ((var6 & 1) != var8) {
  66.             throw new CEFormatException("UCDecoder: Low byte parity error.");
  67.          } else {
  68.             var2.write(var12);
  69.             this.crc.update(var12);
  70.             if (var3 == 2) {
  71.                var2.write(var13);
  72.                this.crc.update(var13);
  73.             }
  74.  
  75.          }
  76.       }
  77.    }
  78.  
  79.    protected void decodeBufferPrefix(InputStream var1, OutputStream var2) {
  80.       this.sequence = 0;
  81.    }
  82.  
  83.    protected int decodeLinePrefix(InputStream var1, OutputStream var2) throws IOException {
  84.       this.crc.value = 0;
  85.  
  86.       do {
  87.          int var6 = var1.read(this.tmp, 0, 1);
  88.          if (var6 == -1) {
  89.             throw new CEStreamExhausted();
  90.          }
  91.       } while(this.tmp[0] != 42);
  92.  
  93.       this.lineAndSeq.reset();
  94.       this.decodeAtom(var1, this.lineAndSeq, 2);
  95.       byte[] var5 = this.lineAndSeq.toByteArray();
  96.       int var3 = var5[0] & 255;
  97.       int var4 = var5[1] & 255;
  98.       if (var4 != this.sequence) {
  99.          throw new CEFormatException("UCDecoder: Out of sequence line.");
  100.       } else {
  101.          this.sequence = this.sequence + 1 & 255;
  102.          return var3;
  103.       }
  104.    }
  105.  
  106.    protected void decodeLineSuffix(InputStream var1, OutputStream var2) throws IOException {
  107.       int var3 = this.crc.value;
  108.       this.lineAndSeq.reset();
  109.       this.decodeAtom(var1, this.lineAndSeq, 2);
  110.       byte[] var5 = this.lineAndSeq.toByteArray();
  111.       int var4 = (var5[0] << 8 & '\uff00') + (var5[1] & 255);
  112.       if (var4 != var3) {
  113.          throw new CEFormatException("UCDecoder: CRC check failed.");
  114.       }
  115.    }
  116. }
  117.