2 *******************************************************************************
\r
3 * Copyright (C) 1998-2008, International Business Machines Corporation and *
\r
4 * others. All Rights Reserved. *
\r
5 *******************************************************************************
\r
7 * Created on Dec 09, 2003
\r
9 *******************************************************************************
\r
11 package com.ibm.icu.dev.tool.layout;
\r
13 import java.io.PrintStream;
\r
14 import java.util.Vector;
\r
16 public class ThaiStateTable
\r
18 static Vector stateTable = null;
\r
19 static int nextState = 0;
\r
21 private final static int newState()
\r
23 ThaiStateTransition[] stateRow = new ThaiStateTransition[ThaiCharacterClasses.cCount];
\r
25 for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {
\r
29 stateTable.addElement(stateRow);
\r
34 private final static boolean isLegalHere(int state, char pairAction)
\r
36 switch (pairAction) {
\r
56 private final static boolean composesWithAnything(int charClass)
\r
58 for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {
\r
59 char action = ThaiCharacterClasses.getPairAction(charClass, c);
\r
61 if (action >= 'C' && action <= 'I') {
\r
69 private final static void fixNextStates()
\r
71 ThaiStateTransition[] groundState = (ThaiStateTransition[]) stateTable.elementAt(0);
\r
73 for (int s = 1; s < stateTable.size(); s += 1) {
\r
74 ThaiStateTransition[] state = (ThaiStateTransition[]) stateTable.elementAt(s);
\r
76 for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {
\r
77 ThaiStateTransition transition = state[c];
\r
79 if (transition.getNextState() == 0) {
\r
80 transition.setNextState(groundState[c].getNextState());
\r
86 private final static int addState(int prevClass, int prevPrevClass)
\r
88 int state = newState();
\r
89 ThaiStateTransition[] stateRow = (ThaiStateTransition[]) stateTable.elementAt(state);
\r
91 for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {
\r
92 char pairAction = ThaiCharacterClasses.getPairAction(prevClass, c);
\r
95 switch (pairAction) {
\r
97 if (prevClass == ThaiCharacterClasses.NIK &&
\r
98 prevPrevClass == ThaiCharacterClasses.AV1) {
\r
100 } else if (prevPrevClass != ThaiCharacterClasses.COA) {
\r
106 if (prevPrevClass == ThaiCharacterClasses.COA) {
\r
112 if (prevClass == ThaiCharacterClasses.TON &&
\r
113 (prevPrevClass < ThaiCharacterClasses.CON ||
\r
114 prevPrevClass > ThaiCharacterClasses.COD)) {
\r
125 if (c != prevClass && isLegalHere(state, pairAction) && composesWithAnything(c)) {
\r
126 nextSt = addState(c, prevClass);
\r
129 stateRow[c] = new ThaiStateTransition(nextSt, pairAction);
\r
137 stateTable = new Vector();
\r
139 addState(ThaiCharacterClasses.NON, ThaiCharacterClasses.NON);
\r
144 public static ThaiStateTransition getTransition(int state, int currClass)
\r
146 ThaiStateTransition[] row = (ThaiStateTransition[]) stateTable.elementAt(state);
\r
148 return row[currClass];
\r
151 private static String header0 =
\r
152 "const ThaiShaping::StateTransition ThaiShaping::thaiStateTable[][ThaiShaping::classCount] = {";
\r
154 private static String header1 =
\r
155 " //+--------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------+";
\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
162 public static void writeStateTable(PrintStream output)
\r
164 System.out.print("Writing state table...");
\r
166 output.println(header0);
\r
167 output.println(header1);
\r
168 output.println(header2);
\r
169 output.println(header1);
\r
171 for (int state = 0; state < stateTable.size(); state += 1) {
\r
172 ThaiStateTransition[] row = (ThaiStateTransition[]) stateTable.elementAt(state);
\r
174 output.print(" /*");
\r
180 output.print(state);
\r
182 output.print("*/ {");
\r
184 for (int c = 0; c < ThaiCharacterClasses.cCount; c += 1) {
\r
185 row[c].write(output);
\r
187 if (c < ThaiCharacterClasses.cCount - 1) {
\r
188 output.print(", ");
\r
194 if (state < stateTable.size() - 1) {
\r
201 output.println("};\n");
\r
203 System.out.println(" done.");
\r