| /* |
| ******************************************************************************* |
| * 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(); |
| } |
| } |