home *** CD-ROM | disk | FTP | other *** search
/ Chip 2002 March / Chip_2002-03_cd1.bin / internet / kosek / xml / xt-czech / SingleByteEncoding.java < prev    next >
Text File  |  2000-10-30  |  2KB  |  87 lines

  1. package com.jclark.xml.tok;
  2.  
  3. /**
  4.  * An <CODE>Encoding</CODE> for an arbitrary encoding
  5.  * that represents every character by exactly one byte.
  6.  *
  7.  * @version $Revision: 1.1 $ $Date: 2000/01/18 13:06:33 $
  8.  */
  9. final class SingleByteEncoding extends Encoding {
  10.  
  11.   private final byte[] byteTypeTable = new byte[256];
  12.   private final int[] asciiToByte = new int[256];
  13.   private final String map;
  14.  
  15.   SingleByteEncoding(String map) {
  16.     super(1);
  17.     this.map = map;
  18.     for (int i = 0; i < 256; i++)
  19.       asciiToByte[i] = 0xFF;
  20.     for (int i = 0; i < 256; i++) {
  21.       char c = map.charAt(i);
  22.       if (c != 0xFFFD) {
  23.     byteTypeTable[i] = charTypeTable[c >> 8][c & 0xFF];
  24.       if (c < 128)
  25.         asciiToByte[c] = (byte)i;
  26.       }
  27.       else
  28.     byteTypeTable[i] = BT_MALFORM;
  29.     }
  30.   }
  31.  
  32.   int byteType(byte[] buf, int off) {
  33.     return byteTypeTable[buf[off] & 0xFF];
  34.   }
  35.  
  36.   int byteToAscii(byte[] buf, int off) {
  37.     return map.charAt(buf[off]);
  38.   }
  39.  
  40.   // c is a significant ASCII character
  41.   boolean charMatches(byte[] buf, int off, char c) {
  42.     return asciiToByte[c] == buf[off];
  43.   }
  44.  
  45.   public int convert(byte[] sourceBuf, int sourceStart, int sourceEnd,
  46.              char[] targetBuf, int targetStart) {
  47.     int initTargetStart = targetStart;
  48.     int c;
  49.     while (sourceStart != sourceEnd)
  50.       targetBuf[targetStart++] = map.charAt(sourceBuf[sourceStart++] & 0xFF);
  51.     return targetStart - initTargetStart;
  52.   }
  53.  
  54.   public int getFixedBytesPerChar() {
  55.     return 1;
  56.   }
  57.  
  58.   public void movePosition(final byte[] buf, int off, int end, Position pos) {
  59.     /* Maintain the invariant: off - colStart == colNumber. */
  60.     int colStart = off - pos.columnNumber;
  61.     int lineNumber = pos.lineNumber;
  62.     while (off != end) {
  63.       switch (byteTypeTable[buf[off++] & 0xFF]) {
  64.       case BT_CR:
  65.     lineNumber += 1;
  66.     colStart = off;
  67.     break;
  68.       case BT_LF:
  69.     lineNumber += 1;
  70.     if (off != end && buf[off] == asciiToByte['\n'])
  71.       off++;
  72.     colStart = off;
  73.     break;
  74.       }
  75.     }
  76.     pos.columnNumber = off - colStart;
  77.     pos.lineNumber = lineNumber;
  78.   }
  79.  
  80.   int extendData(final byte[] buf, int off, final int end) {
  81.     while (off != end && byteTypeTable[buf[off] & 0xFF] >= 0)
  82.       off++;
  83.     return off;
  84.   }
  85.  
  86. }
  87.