]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/compression/CompressionTableGenerator.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / compression / CompressionTableGenerator.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1996-2005, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  */\r
7 package com.ibm.icu.dev.tool.compression;\r
8 \r
9 \r
10 /**\r
11  * Utility class to generate the tables used by the SCSU interface and\r
12  * the UnicodeCompressor class.\r
13  *\r
14  * @author Stephen F. Booth\r
15  * @version 1.0 08 Mar 99\r
16  */\r
17 class CompressionTableGenerator\r
18 {\r
19     // duplicate of constants in SCSU\r
20 \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
28 \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
33 \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
42 \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
51 \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
60 \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
72 \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
81 \r
82     final static int UQUOTEU                     = 0xF0;\r
83     final static int UDEFINEX                    = 0xF1;\r
84     final static int URESERVED                   = 0xF2;  // reserved value\r
85 \r
86     final static int BLOCKSIZE = 0xFF;\r
87     \r
88     /**\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
92      */\r
93     static void printOffsetTable()\r
94     {\r
95         int     i           = 0;\r
96     int []    offsetTable = new int [ BLOCKSIZE + 1 ];\r
97 \r
98         // 0x00 is reserved\r
99 \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
103     \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
107     \r
108         // 0xA8..0xF8 is reserved\r
109  \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
117 \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
122                  + ", ");\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
127     }\r
128     \r
129     /**\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
133      */\r
134     static void printSingleTagTable()\r
135     {\r
136         int        i              = 0;\r
137     boolean [] singleTagTable = new boolean  [ BLOCKSIZE + 1 ];\r
138 \r
139         for( i = 0x00; i <= BLOCKSIZE; i++ ) {\r
140             switch( i ) {\r
141         \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
157                 break;\r
158         \r
159         default:\r
160         singleTagTable[i] = false;\r
161                 break;\r
162             }\r
163         }\r
164     \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
173     }\r
174     \r
175     \r
176     /**\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
180      */\r
181     static void printUnicodeTagTable()\r
182     {\r
183         int        i               = 0;\r
184     boolean [] unicodeTagTable = new boolean  [ BLOCKSIZE + 1 ];\r
185 \r
186         for( i = 0x00; i <= BLOCKSIZE; i++ ) {\r
187             switch( i ) {\r
188         case UQUOTEU:  case UDEFINEX: \r
189         case URESERVED:\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
199                 break;\r
200         \r
201         default:\r
202         unicodeTagTable[i] = false;\r
203                 break;\r
204             }\r
205         }\r
206     \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
215     }\r
216     \r
217     public static void main(String[] argv)\r
218     {\r
219         printOffsetTable();\r
220         printSingleTagTable();\r
221         printUnicodeTagTable();\r
222     }\r
223 }\r