blob: 7718b1e6e7fcaf71f16c76e3d5425239b05683de [file] [log] [blame]
/*
*******************************************************************************
* Copyright (C) 1996-2003, International Business Machines Corporation and *
* others. All Rights Reserved. *
*******************************************************************************
*
* $Source: /xsrl/Nsvn/icu/icu4j/src/com/ibm/icu/dev/tool/compression/CompressionTableGenerator.java,v $
* $Date: 2003/06/03 18:49:31 $
* $Revision: 1.5 $
*
*****************************************************************************************
*/
package com.ibm.icu.dev.tool.compression;
/**
* Utility class to generate the tables used by the SCSU interface and
* the UnicodeCompressor class.
*
* @author Stephen F. Booth
* @version 1.0 08 Mar 99
*/
class CompressionTableGenerator
{
// duplicate of constants in SCSU
final static int LATININDEX = 0xF9;
final static int IPAEXTENSIONINDEX = 0xFA;
final static int GREEKINDEX = 0xFB;
final static int ARMENIANINDEX = 0xFC;
final static int HIRAGANAINDEX = 0xFD;
final static int KATAKANAINDEX = 0xFE;
final static int HALFWIDTHKATAKANAINDEX = 0xFF;
final static int SDEFINEX = 0x0B;
final static int SRESERVED = 0x0C; // reserved value
final static int SQUOTEU = 0x0E;
final static int SCHANGEU = 0x0F;
final static int SQUOTE0 = 0x01;
final static int SQUOTE1 = 0x02;
final static int SQUOTE2 = 0x03;
final static int SQUOTE3 = 0x04;
final static int SQUOTE4 = 0x05;
final static int SQUOTE5 = 0x06;
final static int SQUOTE6 = 0x07;
final static int SQUOTE7 = 0x08;
final static int SCHANGE0 = 0x10;
final static int SCHANGE1 = 0x11;
final static int SCHANGE2 = 0x12;
final static int SCHANGE3 = 0x13;
final static int SCHANGE4 = 0x14;
final static int SCHANGE5 = 0x15;
final static int SCHANGE6 = 0x16;
final static int SCHANGE7 = 0x17;
final static int SDEFINE0 = 0x18;
final static int SDEFINE1 = 0x19;
final static int SDEFINE2 = 0x1A;
final static int SDEFINE3 = 0x1B;
final static int SDEFINE4 = 0x1C;
final static int SDEFINE5 = 0x1D;
final static int SDEFINE6 = 0x1E;
final static int SDEFINE7 = 0x1F;
//==========================
// Unicode mode tags
//==========================
final static int UCHANGE0 = 0xE0;
final static int UCHANGE1 = 0xE1;
final static int UCHANGE2 = 0xE2;
final static int UCHANGE3 = 0xE3;
final static int UCHANGE4 = 0xE4;
final static int UCHANGE5 = 0xE5;
final static int UCHANGE6 = 0xE6;
final static int UCHANGE7 = 0xE7;
final static int UDEFINE0 = 0xE8;
final static int UDEFINE1 = 0xE9;
final static int UDEFINE2 = 0xEA;
final static int UDEFINE3 = 0xEB;
final static int UDEFINE4 = 0xEC;
final static int UDEFINE5 = 0xED;
final static int UDEFINE6 = 0xEE;
final static int UDEFINE7 = 0xEF;
final static int UQUOTEU = 0xF0;
final static int UDEFINEX = 0xF1;
final static int URESERVED = 0xF2; // reserved value
final static int BLOCKSIZE = 0xFF;
/**
* Generate the table used as sOffsetTable in SCSU.
* This table contains preformed indices so we can do array lookups
* instead of calculations for speed during decompression.
*/
static void printOffsetTable()
{
int i = 0;
int [] offsetTable = new int [ BLOCKSIZE + 1 ];
// 0x00 is reserved
// half blocks from U+0080 to U+3380
for( i = 0x01; i < 0x68; i++ )
offsetTable[i] = i * 0x80;
// half blocks from U+E000 to U+FF80
for( i = 0x68; i < 0xA8; i++ )
offsetTable[i] = (i * 0x80) + 0xAC00;
// 0xA8..0xF8 is reserved
offsetTable[ LATININDEX ] = 0x00C0;
offsetTable[ IPAEXTENSIONINDEX ] = 0x0250;
offsetTable[ GREEKINDEX ] = 0x0370;
offsetTable[ ARMENIANINDEX ] = 0x0530;
offsetTable[ HIRAGANAINDEX ] = 0x3040;
offsetTable[ KATAKANAINDEX ] = 0x30A0;
offsetTable[ HALFWIDTHKATAKANAINDEX ] = 0xFF60;
// dump the generated table
System.out.println("static int [] sOffsetTable = {");
for(i = 0; i < offsetTable.length - 1; i++)
System.out.print("0x" + Integer.toHexString(offsetTable[i])
+ ", ");
for(i = offsetTable.length - 1; i < offsetTable.length; i++)
System.out.print("0x" + Integer.toHexString(offsetTable[i]));
System.out.println();
System.out.println("};");
}
/**
* Generate the table used as sSingleTagTable in UnicodeCompressor.
* This table contains boolean values indicating if a byte is a
* single-byte mode tag.
*/
static void printSingleTagTable()
{
int i = 0;
boolean [] singleTagTable = new boolean [ BLOCKSIZE + 1 ];
for( i = 0x00; i <= BLOCKSIZE; i++ ) {
switch( i ) {
case SQUOTEU: case SCHANGEU:
case SDEFINEX: case SRESERVED:
case SQUOTE0: case SQUOTE1:
case SQUOTE2: case SQUOTE3:
case SQUOTE4: case SQUOTE5:
case SQUOTE6: case SQUOTE7:
case SCHANGE0: case SCHANGE1:
case SCHANGE2: case SCHANGE3:
case SCHANGE4: case SCHANGE5:
case SCHANGE6: case SCHANGE7:
case SDEFINE0: case SDEFINE1:
case SDEFINE2: case SDEFINE3:
case SDEFINE4: case SDEFINE5:
case SDEFINE6: case SDEFINE7:
singleTagTable[i] = true;
break;
default:
singleTagTable[i] = false;
break;
}
}
// dump the generated table
System.out.println("private static boolean [] sSingleTagTable = {");
for(i = 0; i < singleTagTable.length - 1; i++)
System.out.print(singleTagTable[i] + ", ");
for(i = singleTagTable.length - 1; i < singleTagTable.length; i++)
System.out.print(singleTagTable[i]);
System.out.println();
System.out.println("};");
}
/**
* Generate the table used as sUnicodeTagTable in
* This table contains boolean values indicating if a byte is a
* unicode mode tag.
*/
static void printUnicodeTagTable()
{
int i = 0;
boolean [] unicodeTagTable = new boolean [ BLOCKSIZE + 1 ];
for( i = 0x00; i <= BLOCKSIZE; i++ ) {
switch( i ) {
case UQUOTEU: case UDEFINEX:
case URESERVED:
case UCHANGE0: case UCHANGE1:
case UCHANGE2: case UCHANGE3:
case UCHANGE4: case UCHANGE5:
case UCHANGE6: case UCHANGE7:
case UDEFINE0: case UDEFINE1:
case UDEFINE2: case UDEFINE3:
case UDEFINE4: case UDEFINE5:
case UDEFINE6: case UDEFINE7:
unicodeTagTable[i] = true;
break;
default:
unicodeTagTable[i] = false;
break;
}
}
// dump the generated table
System.out.println("private static boolean [] sUnicodeTagTable = {");
for(i = 0; i < unicodeTagTable.length - 1; i++)
System.out.print(unicodeTagTable[i] + ", ");
for(i = unicodeTagTable.length - 1; i < unicodeTagTable.length; i++)
System.out.print(unicodeTagTable[i]);
System.out.println();
System.out.println("};");
}
public static void main(String[] argv)
{
printOffsetTable();
printSingleTagTable();
printUnicodeTagTable();
}
};