/* ******************************************************************************* * Copyright (C) 1996-2005, International Business Machines Corporation and * * others. All Rights Reserved. * ******************************************************************************* */ 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(); } }