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