]> gitweb.fperrin.net Git - Dictionary.git/blob - jars/icu4j-4_4_2-src/tools/misc/src/com/ibm/icu/dev/tool/layout/ThaiStateTable.java
go
[Dictionary.git] / jars / icu4j-4_4_2-src / tools / misc / src / com / ibm / icu / dev / tool / layout / ThaiStateTable.java
1 /*\r
2  *******************************************************************************\r
3  * Copyright (C) 1998-2008, International Business Machines Corporation and    *\r
4  * others. All Rights Reserved.                                                *\r
5  *******************************************************************************\r
6  *\r
7  * Created on Dec 09, 2003\r
8  *\r
9  *******************************************************************************\r
10  */\r
11 package com.ibm.icu.dev.tool.layout;\r
12 \r
13 import java.io.PrintStream;\r
14 import java.util.Vector;\r
15 \r
16 public class ThaiStateTable\r
17 {\r
18     static Vector stateTable = null;\r
19     static int nextState = 0;\r
20     \r
21     private final static int newState()\r
22     {\r
23         ThaiStateTransition[] stateRow = new ThaiStateTransition[ThaiCharacterClasses.cCount];\r
24         \r
25         for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {\r
26             stateRow[c] = null;\r
27         }\r
28         \r
29         stateTable.addElement(stateRow);\r
30         \r
31         return nextState++;\r
32     }\r
33     \r
34     private final static boolean isLegalHere(int state, char pairAction)\r
35     {\r
36         switch (pairAction) {\r
37         case 'A':\r
38             return state == 0;\r
39             \r
40         case 'C':\r
41         case 'D':\r
42         case 'E':\r
43         case 'F':\r
44         case 'G':\r
45         case 'H':\r
46             return true;\r
47         \r
48         case 'R':\r
49         case 'S':\r
50             return false;\r
51         }\r
52         \r
53         return false;\r
54     }\r
55     \r
56     private final static boolean composesWithAnything(int charClass)\r
57     {\r
58         for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {\r
59             char action = ThaiCharacterClasses.getPairAction(charClass, c);\r
60             \r
61             if (action >= 'C' && action <= 'I') {\r
62                 return true;\r
63             }\r
64         }\r
65         \r
66         return false;\r
67     }\r
68     \r
69     private final static void fixNextStates()\r
70     {\r
71         ThaiStateTransition[] groundState = (ThaiStateTransition[]) stateTable.elementAt(0);\r
72         \r
73         for (int s = 1; s < stateTable.size(); s += 1) {\r
74             ThaiStateTransition[] state = (ThaiStateTransition[]) stateTable.elementAt(s);\r
75             \r
76             for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {\r
77                 ThaiStateTransition transition = state[c];\r
78                 \r
79                 if (transition.getNextState() == 0) {\r
80                     transition.setNextState(groundState[c].getNextState());\r
81                 }\r
82             }\r
83         }\r
84     }\r
85     \r
86     private final static int addState(int prevClass, int prevPrevClass)\r
87     {\r
88         int state = newState();\r
89         ThaiStateTransition[] stateRow = (ThaiStateTransition[]) stateTable.elementAt(state);\r
90         \r
91         for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {\r
92             char pairAction = ThaiCharacterClasses.getPairAction(prevClass, c);\r
93             int nextSt = 0;\r
94             \r
95             switch (pairAction) {\r
96             case 'G':\r
97                 if (prevClass == ThaiCharacterClasses.NIK &&\r
98                     prevPrevClass == ThaiCharacterClasses.AV1) {\r
99                     pairAction = 'R';\r
100                 } else if (prevPrevClass != ThaiCharacterClasses.COA) {\r
101                     pairAction = 'C';\r
102                 }\r
103                 break;\r
104                 \r
105             case 'E':\r
106                 if (prevPrevClass == ThaiCharacterClasses.COA) {\r
107                     pairAction = 'F';\r
108                 }\r
109                 break;\r
110                 \r
111             case 'I':\r
112                 if (prevClass == ThaiCharacterClasses.TON &&\r
113                     (prevPrevClass < ThaiCharacterClasses.CON ||\r
114                      prevPrevClass > ThaiCharacterClasses.COD)) {\r
115                     pairAction = 'S';\r
116                 } else {\r
117                     pairAction = 'A';\r
118                 }\r
119                 break;\r
120                 \r
121             default:\r
122                 break;\r
123             }\r
124             \r
125             if (c != prevClass && isLegalHere(state, pairAction) && composesWithAnything(c)) {\r
126                 nextSt = addState(c, prevClass);\r
127             }\r
128             \r
129             stateRow[c] = new ThaiStateTransition(nextSt, pairAction);\r
130         }\r
131         \r
132         return state;\r
133     }\r
134     \r
135     static\r
136     {\r
137         stateTable = new Vector();\r
138             \r
139         addState(ThaiCharacterClasses.NON, ThaiCharacterClasses.NON);\r
140             \r
141         fixNextStates();\r
142     }\r
143     \r
144     public static ThaiStateTransition getTransition(int state, int currClass)\r
145     {\r
146         ThaiStateTransition[] row = (ThaiStateTransition[]) stateTable.elementAt(state);\r
147         \r
148         return row[currClass];\r
149     }\r
150 \r
151     private static String header0 =\r
152 "const ThaiShaping::StateTransition ThaiShaping::thaiStateTable[][ThaiShaping::classCount] = {";\r
153 \r
154     private static String header1 =\r
155 "    //+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+";\r
156 \r
157     private static String header2 =\r
158 "    //|         N         C         C         C         L         F         F         F         B         B         B         T         A         A         A         N         A         A         A    |\n" +\r
159 "    //|         O         O         O         O         V         V         V         V         V         V         D         O         D         D         D         I         V         V         V    |\n" +\r
160 "    //|         N         N         A         D         O         1         2         3         1         2         I         N         1         2         3         K         1         2         3    |";\r
161     \r
162     public static void writeStateTable(PrintStream output)\r
163     {\r
164         System.out.print("Writing state table...");\r
165         \r
166         output.println(header0);\r
167         output.println(header1);\r
168         output.println(header2);\r
169         output.println(header1);\r
170         \r
171         for (int state = 0; state < stateTable.size(); state += 1) {\r
172             ThaiStateTransition[] row = (ThaiStateTransition[]) stateTable.elementAt(state);\r
173             \r
174             output.print("    /*");\r
175             \r
176             if (state < 10) {\r
177                 output.print("0");\r
178             }\r
179             \r
180             output.print(state);\r
181             \r
182             output.print("*/ {");\r
183             \r
184             for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {\r
185                 row[c].write(output);\r
186                 \r
187                 if (c < ThaiCharacterClasses.cCount - 1) {\r
188                     output.print(", ");\r
189                 }\r
190             }\r
191             \r
192             output.print("}");\r
193                     \r
194             if (state < stateTable.size() - 1) {\r
195                 output.print(",");\r
196             }\r
197                     \r
198             output.println();\r
199         }\r
200         \r
201         output.println("};\n");\r
202         \r
203         System.out.println(" done.");\r
204     }\r
205 }\r