2 *******************************************************************************
\r
3 * Copyright (C) 1996-2005, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 package com.ibm.icu.dev.tool.compression;
\r
11 * Utility class to generate the tables used by the SCSU interface and
\r
12 * the UnicodeCompressor class.
\r
14 * @author Stephen F. Booth
\r
15 * @version 1.0 08 Mar 99
\r
17 class CompressionTableGenerator
\r
19 // duplicate of constants in SCSU
\r
21 final static int LATININDEX = 0xF9;
\r
22 final static int IPAEXTENSIONINDEX = 0xFA;
\r
23 final static int GREEKINDEX = 0xFB;
\r
24 final static int ARMENIANINDEX = 0xFC;
\r
25 final static int HIRAGANAINDEX = 0xFD;
\r
26 final static int KATAKANAINDEX = 0xFE;
\r
27 final static int HALFWIDTHKATAKANAINDEX = 0xFF;
\r
29 final static int SDEFINEX = 0x0B;
\r
30 final static int SRESERVED = 0x0C; // reserved value
\r
31 final static int SQUOTEU = 0x0E;
\r
32 final static int SCHANGEU = 0x0F;
\r
34 final static int SQUOTE0 = 0x01;
\r
35 final static int SQUOTE1 = 0x02;
\r
36 final static int SQUOTE2 = 0x03;
\r
37 final static int SQUOTE3 = 0x04;
\r
38 final static int SQUOTE4 = 0x05;
\r
39 final static int SQUOTE5 = 0x06;
\r
40 final static int SQUOTE6 = 0x07;
\r
41 final static int SQUOTE7 = 0x08;
\r
43 final static int SCHANGE0 = 0x10;
\r
44 final static int SCHANGE1 = 0x11;
\r
45 final static int SCHANGE2 = 0x12;
\r
46 final static int SCHANGE3 = 0x13;
\r
47 final static int SCHANGE4 = 0x14;
\r
48 final static int SCHANGE5 = 0x15;
\r
49 final static int SCHANGE6 = 0x16;
\r
50 final static int SCHANGE7 = 0x17;
\r
52 final static int SDEFINE0 = 0x18;
\r
53 final static int SDEFINE1 = 0x19;
\r
54 final static int SDEFINE2 = 0x1A;
\r
55 final static int SDEFINE3 = 0x1B;
\r
56 final static int SDEFINE4 = 0x1C;
\r
57 final static int SDEFINE5 = 0x1D;
\r
58 final static int SDEFINE6 = 0x1E;
\r
59 final static int SDEFINE7 = 0x1F;
\r
61 //==========================
\r
62 // Unicode mode tags
\r
63 //==========================
\r
64 final static int UCHANGE0 = 0xE0;
\r
65 final static int UCHANGE1 = 0xE1;
\r
66 final static int UCHANGE2 = 0xE2;
\r
67 final static int UCHANGE3 = 0xE3;
\r
68 final static int UCHANGE4 = 0xE4;
\r
69 final static int UCHANGE5 = 0xE5;
\r
70 final static int UCHANGE6 = 0xE6;
\r
71 final static int UCHANGE7 = 0xE7;
\r
73 final static int UDEFINE0 = 0xE8;
\r
74 final static int UDEFINE1 = 0xE9;
\r
75 final static int UDEFINE2 = 0xEA;
\r
76 final static int UDEFINE3 = 0xEB;
\r
77 final static int UDEFINE4 = 0xEC;
\r
78 final static int UDEFINE5 = 0xED;
\r
79 final static int UDEFINE6 = 0xEE;
\r
80 final static int UDEFINE7 = 0xEF;
\r
82 final static int UQUOTEU = 0xF0;
\r
83 final static int UDEFINEX = 0xF1;
\r
84 final static int URESERVED = 0xF2; // reserved value
\r
86 final static int BLOCKSIZE = 0xFF;
\r
89 * Generate the table used as sOffsetTable in SCSU.
\r
90 * This table contains preformed indices so we can do array lookups
\r
91 * instead of calculations for speed during decompression.
\r
93 static void printOffsetTable()
\r
96 int [] offsetTable = new int [ BLOCKSIZE + 1 ];
\r
100 // half blocks from U+0080 to U+3380
\r
101 for( i = 0x01; i < 0x68; i++ )
\r
102 offsetTable[i] = i * 0x80;
\r
104 // half blocks from U+E000 to U+FF80
\r
105 for( i = 0x68; i < 0xA8; i++ )
\r
106 offsetTable[i] = (i * 0x80) + 0xAC00;
\r
108 // 0xA8..0xF8 is reserved
\r
110 offsetTable[ LATININDEX ] = 0x00C0;
\r
111 offsetTable[ IPAEXTENSIONINDEX ] = 0x0250;
\r
112 offsetTable[ GREEKINDEX ] = 0x0370;
\r
113 offsetTable[ ARMENIANINDEX ] = 0x0530;
\r
114 offsetTable[ HIRAGANAINDEX ] = 0x3040;
\r
115 offsetTable[ KATAKANAINDEX ] = 0x30A0;
\r
116 offsetTable[ HALFWIDTHKATAKANAINDEX ] = 0xFF60;
\r
118 // dump the generated table
\r
119 System.out.println("static int [] sOffsetTable = {");
\r
120 for(i = 0; i < offsetTable.length - 1; i++)
\r
121 System.out.print("0x" + Integer.toHexString(offsetTable[i])
\r
123 for(i = offsetTable.length - 1; i < offsetTable.length; i++)
\r
124 System.out.print("0x" + Integer.toHexString(offsetTable[i]));
\r
125 System.out.println();
\r
126 System.out.println("};");
\r
130 * Generate the table used as sSingleTagTable in UnicodeCompressor.
\r
131 * This table contains boolean values indicating if a byte is a
\r
132 * single-byte mode tag.
\r
134 static void printSingleTagTable()
\r
137 boolean [] singleTagTable = new boolean [ BLOCKSIZE + 1 ];
\r
139 for( i = 0x00; i <= BLOCKSIZE; i++ ) {
\r
142 case SQUOTEU: case SCHANGEU:
\r
143 case SDEFINEX: case SRESERVED:
\r
144 case SQUOTE0: case SQUOTE1:
\r
145 case SQUOTE2: case SQUOTE3:
\r
146 case SQUOTE4: case SQUOTE5:
\r
147 case SQUOTE6: case SQUOTE7:
\r
148 case SCHANGE0: case SCHANGE1:
\r
149 case SCHANGE2: case SCHANGE3:
\r
150 case SCHANGE4: case SCHANGE5:
\r
151 case SCHANGE6: case SCHANGE7:
\r
152 case SDEFINE0: case SDEFINE1:
\r
153 case SDEFINE2: case SDEFINE3:
\r
154 case SDEFINE4: case SDEFINE5:
\r
155 case SDEFINE6: case SDEFINE7:
\r
156 singleTagTable[i] = true;
\r
160 singleTagTable[i] = false;
\r
165 // dump the generated table
\r
166 System.out.println("private static boolean [] sSingleTagTable = {");
\r
167 for(i = 0; i < singleTagTable.length - 1; i++)
\r
168 System.out.print(singleTagTable[i] + ", ");
\r
169 for(i = singleTagTable.length - 1; i < singleTagTable.length; i++)
\r
170 System.out.print(singleTagTable[i]);
\r
171 System.out.println();
\r
172 System.out.println("};");
\r
177 * Generate the table used as sUnicodeTagTable in
\r
178 * This table contains boolean values indicating if a byte is a
\r
179 * unicode mode tag.
\r
181 static void printUnicodeTagTable()
\r
184 boolean [] unicodeTagTable = new boolean [ BLOCKSIZE + 1 ];
\r
186 for( i = 0x00; i <= BLOCKSIZE; i++ ) {
\r
188 case UQUOTEU: case UDEFINEX:
\r
190 case UCHANGE0: case UCHANGE1:
\r
191 case UCHANGE2: case UCHANGE3:
\r
192 case UCHANGE4: case UCHANGE5:
\r
193 case UCHANGE6: case UCHANGE7:
\r
194 case UDEFINE0: case UDEFINE1:
\r
195 case UDEFINE2: case UDEFINE3:
\r
196 case UDEFINE4: case UDEFINE5:
\r
197 case UDEFINE6: case UDEFINE7:
\r
198 unicodeTagTable[i] = true;
\r
202 unicodeTagTable[i] = false;
\r
207 // dump the generated table
\r
208 System.out.println("private static boolean [] sUnicodeTagTable = {");
\r
209 for(i = 0; i < unicodeTagTable.length - 1; i++)
\r
210 System.out.print(unicodeTagTable[i] + ", ");
\r
211 for(i = unicodeTagTable.length - 1; i < unicodeTagTable.length; i++)
\r
212 System.out.print(unicodeTagTable[i]);
\r
213 System.out.println();
\r
214 System.out.println("};");
\r
217 public static void main(String[] argv)
\r
219 printOffsetTable();
\r
220 printSingleTagTable();
\r
221 printUnicodeTagTable();
\r