Source code of Windows XP (NT5)
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

791 lines
34 KiB

  1. //+---------------------------------------------------------------------------
  2. //
  3. //
  4. // CThaiTrigramTrieIter
  5. //
  6. // History:
  7. // created 8/99 aarayas
  8. //
  9. // �1999 Microsoft Corporation
  10. //----------------------------------------------------------------------------
  11. #include "CThaiTrigramTrieIter.hpp"
  12. bool IsTagEqual(WCHAR pos1, WCHAR pos2)
  13. {
  14. // if unambigious tags.
  15. if (pos1 < 48)
  16. return (pos1 == pos2);
  17. else
  18. {
  19. switch (pos1)
  20. {
  21. case 48: // 48. ADVI ADVN
  22. return ((pos2 == 29) || (pos2 == 28));
  23. case 49: // 49. ADVI ADVN NCMN
  24. return ((pos2 == 29) || (pos2 == 28) || (pos2 == 5));
  25. case 50: // 50. ADVI ADVN VSTA
  26. return ((pos2 == 29) || (pos2 == 28) || (pos2 == 12));
  27. case 51: // 51. ADVI VATT
  28. return ((pos2 == 29) || (pos2 == 13));
  29. case 52: // 52. ADVN ADVP
  30. return ((pos2 == 28) || (pos2 == 30));
  31. case 53: // 53. ADVN ADVP ADVS
  32. return ((pos2 == 28) || (pos2 == 30) || (pos2 == 31));
  33. case 54: // 54. ADVN ADVP DIAQ DIBQ JCMP JSBR RPRE *
  34. return ((pos2 == 28) || (pos2 == 30) || (pos2 == 25));
  35. case 55: // 55. ADVN ADVP NCMN VATT
  36. return ((pos2 == 28) || (pos2 == 30) || (pos2 == 5) || (pos2 == 13));
  37. case 56: // 56. ADVN ADVP VSTA
  38. return ((pos2 == 28) || (pos2 == 30) || (pos2 == 12));
  39. case 57: // 57. ADVN ADVS DDAC DDAN DIAC VATT XVAE *
  40. return ((pos2 == 28) || (pos2 == 31) || (pos2 == 20));
  41. case 58: // 58. ADVN ADVS DDAN NCMN VATT VSTA *
  42. return ((pos2 == 28) || (pos2 == 31) || (pos2 == 19));
  43. case 59: // 59. ADVN ADVS NCMN
  44. return ((pos2 == 28) || (pos2 == 31) || (pos2 == 5));
  45. case 60: // 60. ADVN ADVS NCMN VATT
  46. return ((pos2 == 28) || (pos2 == 31) || (pos2 == 5) || (pos2 == 13));
  47. case 61: // 61. ADVN ADVS VACT
  48. return ((pos2 == 28) || (pos2 == 31) || (pos2 == 11));
  49. case 62: // 62. ADVN ADVS VATT
  50. return ((pos2 == 28) || (pos2 == 31) || (pos2 == 13));
  51. case 63: // 63. ADVN CFQC NCMN RPRE VSTA *
  52. return ((pos2 == 28) || (pos2 == 35) || (pos2 == 5));
  53. case 64: // 64. ADVN CLTV CNIT NCMN RPRE
  54. return ((pos2 == 28) || (pos2 == 33) || (pos2 == 32) || (pos2 == 5) || (pos2 == 40));
  55. case 65: // 65. ADVN DCNM
  56. return ((pos2 == 28) || (pos2 == 26));
  57. case 66: // 66. ADVN DDAC DDAN
  58. return ((pos2 == 28) || (pos2 == 20) || (pos2 == 19));
  59. case 67: // 67. ADVN DDAC DDAN NCMN PDMN
  60. return ((pos2 == 28) || (pos2 == 20) || (pos2 == 19) || (pos2 == 5) || (pos2 == 8));
  61. case 68: // 68. ADVN DDAC DDAN PDMN
  62. return ((pos2 == 28) || (pos2 == 20) || (pos2 == 19) || (pos2 == 8));
  63. case 69: // 69. ADVN DDAN DDBQ
  64. return ((pos2 == 28) || (pos2 == 19) || (pos2 == 21));
  65. case 70: // 70. ADVN DDAN DIAC PDMN VSTA
  66. return ((pos2 == 28) || (pos2 == 19) || (pos2 == 23) || (pos2 == 8) || (pos2 == 12));
  67. case 71: // 71. ADVN DDAN FIXN PDMN
  68. return ((pos2 == 28) || (pos2 == 19) || (pos2 == 42) || (pos2 == 8));
  69. case 72: // 72. ADVN DDAN NCMN
  70. return ((pos2 == 28) || (pos2 == 19) || (pos2 == 5));
  71. case 73: // 73. ADVN DDAQ
  72. return ((pos2 == 28) || (pos2 == 22));
  73. case 74: // 74. ADVN DDBQ
  74. return ((pos2 == 28) || (pos2 == 21));
  75. case 75: // 75. ADVN DDBQ RPRE VATT
  76. return ((pos2 == 28) || (pos2 == 21) || (pos2 == 40) || (pos2 == 13));
  77. case 76: // 76. ADVN DDBQ VATT VSTA XVAE *
  78. return ((pos2 == 28) || (pos2 == 21) || (pos2 == 13) || (pos2 == 12));
  79. case 77: // 77. ADVN DIAC
  80. return ((pos2 == 28) || (pos2 == 21));
  81. case 78: // 78. ADVN DIAC PDMN
  82. return ((pos2 == 28) || (pos2 == 21) || (pos2 == 8));
  83. case 79: // 79. ADVN DIBQ
  84. return ((pos2 == 28) || (pos2 == 24));
  85. case 80: // 80. ADVN DIBQ NCMN
  86. return ((pos2 == 28) || (pos2 == 24) || (pos2 == 5));
  87. case 81: // 81. ADVN DIBQ VACT VSTA
  88. return ((pos2 == 28) || (pos2 == 24) || (pos2 == 11) || (pos2 == 12));
  89. case 82: // 82. ADVN DIBQ VATT
  90. return ((pos2 == 28) || (pos2 == 24) || (pos2 == 13));
  91. case 83: // 83. ADVN DONM JCMP
  92. return ((pos2 == 28) || (pos2 == 27) || (pos2 == 38));
  93. case 84: // 84. ADVN DONM JSBR NCMN RPRE VATT XVAE *
  94. return ((pos2 == 28) || (pos2 == 27) || (pos2 == 39) || (pos2 == 5));
  95. case 85: // 85. ADVN EITT PNTR
  96. return ((pos2 == 28) || (pos2 == 45) || (pos2 == 9));
  97. case 86: // 86. ADVN FIXN
  98. return ((pos2 == 28) || (pos2 == 42));
  99. case 87: // 87. ADVN JCMP
  100. return ((pos2 == 28) || (pos2 == 38));
  101. case 88: // 88. ADVN JCRG
  102. return ((pos2 == 28) || (pos2 == 37));
  103. case 89: // 89. ADVN JCRG JSBR
  104. return ((pos2 == 28) || (pos2 == 37) || (pos2 == 39));
  105. case 90: // 90. ADVN JCRG JSBR XVBM XVMM
  106. return ((pos2 == 28) || (pos2 == 37) || (pos2 == 39) || (pos2 == 14) || (pos2 == 16));
  107. case 91: // 91. ADVN JCRG RPRE VACT VSTA XVAE *
  108. return ((pos2 == 28) || (pos2 == 37) || (pos2 == 40) || (pos2 == 11));
  109. case 92: // 92. ADVN JSBR
  110. return ((pos2 == 28) || (pos2 == 39));
  111. case 93: // 93. ADVN JSBR NCMN
  112. return ((pos2 == 28) || (pos2 == 39) || (pos2 == 5));
  113. case 94: // 94. ADVN JSBR RPRE VATT
  114. return ((pos2 == 28) || (pos2 == 39) || (pos2 == 40) || (pos2 == 13));
  115. case 95: // 95. ADVN JSBR RPRE XVAE
  116. return ((pos2 == 28) || (pos2 == 39) || (pos2 == 40) || (pos2 == 18));
  117. case 96: // 96. ADVN JSBR VSTA
  118. return ((pos2 == 28) || (pos2 == 39) || (pos2 == 12));
  119. case 97: // 97. ADVN JSBR XVAE XVBM
  120. return ((pos2 == 28) || (pos2 == 39) || (pos2 == 18) || (pos2 == 14));
  121. case 98: // 98. ADVN NCMN
  122. return ((pos2 == 28) || (pos2 == 5));
  123. case 99: // 99. ADVN NCMN RPRE VACT VATT VSTA
  124. return ((pos2 == 28) || (pos2 == 5) || (pos2 == 40) || (pos2 == 11) || (pos2 == 12));
  125. case 100: // 100. ADVN NCMN RPRE VACT XVAE
  126. return ((pos2 == 28) || (pos2 == 5) || (pos2 == 40) || (pos2 == 18));
  127. case 101: // 101. ADVN NCMN RPRE VATT
  128. return ((pos2 == 28) || (pos2 == 5) || (pos2 == 40) || (pos2 == 13));
  129. case 102: // 102. ADVN NCMN VACT VATT VSTA
  130. return ((pos2 == 28) || (pos2 == 5) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12));
  131. case 103: // 103. ADVN NCMN VACT VSTA",
  132. return ((pos2 == 28) || (pos2 == 5) || (pos2 == 11) || (pos2 == 12));
  133. case 104: // 104. ADVN NCMN VATT
  134. return ((pos2 == 28) || (pos2 == 5) || (pos2 == 13));
  135. case 105: // 105. ADVN NCMN VATT VSTA
  136. return ((pos2 == 28) || (pos2 == 5) || (pos2 == 13) || (pos2 == 12));
  137. case 106: // 106. ADVN NEG
  138. return ((pos2 == 28) || (pos2 == 46));
  139. case 107: // 107. ADVN NPRP VATT
  140. return ((pos2 == 28) || (pos2 == 1) || (pos2 == 13));
  141. case 108: // 108. ADVN PDMN VACT
  142. return ((pos2 == 28) || (pos2 == 8) || (pos2 == 11));
  143. case 109: // 109. ADVN PNTR",
  144. return ((pos2 == 28) || (pos2 == 9));
  145. case 110: // 110. ADVN RPRE",
  146. return ((pos2 == 28) || (pos2 == 40));
  147. case 111: // 111. ADVN RPRE VACT VATT XVAE",
  148. return ((pos2 == 28) || (pos2 == 40) || (pos2 == 11) || (pos2 == 13));
  149. case 112: // 112. ADVN RPRE VACT XVAM XVBM
  150. return ((pos2 == 28) || (pos2 == 40) || (pos2 == 11) || (pos2 == 15) || (pos2 == 14));
  151. case 113: // 113. ADVN RPRE VATT VSTA
  152. return ((pos2 == 28) || (pos2 == 40) || (pos2 == 13) || (pos2 == 12));
  153. case 114: // 114. ADVN RPRE VSTA
  154. return ((pos2 == 28) || (pos2 == 40) || (pos2 == 12));
  155. case 115: // 115. ADVN VACT
  156. return ((pos2 == 28) || (pos2 == 11));
  157. case 116: // 116. ADVN VACT VATT
  158. return ((pos2 == 28) || (pos2 == 11) || (pos2 == 13));
  159. case 117: // 117. ADVN VACT VATT VSTA
  160. return ((pos2 == 28) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12));
  161. case 118: // 118. ADVN VACT VATT VSTA XVAM XVBM
  162. return ((pos2 == 28) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12) || (pos2 == 15) || (pos2 == 14));
  163. case 119: // 119. ADVN VACT VSTA
  164. return ((pos2 == 28) || (pos2 == 11) || (pos2 == 12));
  165. case 120: // 120. ADVN VACT VSTA XVAE
  166. return ((pos2 == 28) || (pos2 == 11) || (pos2 == 12) || (pos2 == 18));
  167. case 121: // 121. ADVN VACT XVAE
  168. return ((pos2 == 28) || (pos2 == 11) || (pos2 == 18));
  169. case 122: // 122. ADVN VATT
  170. return ((pos2 == 28) || (pos2 == 13));
  171. case 123: // 123. ADVN VATT VSTA
  172. return ((pos2 == 28) || (pos2 == 13) || (pos2 == 12));
  173. case 124: // 124. ADVN VATT VSTA XVAM XVBM XVMM
  174. return ((pos2 == 28) || (pos2 == 13) || (pos2 == 12) || (pos2 == 15) || (pos2 == 14));
  175. case 125: // 125. ADVN VATT XVBM
  176. return ((pos2 == 28) || (pos2 == 13) || (pos2 == 14));
  177. case 126: // 126. ADVN VSTA
  178. return ((pos2 == 28) || (pos2 == 12));
  179. case 127: // 127. ADVN VSTA XVAE
  180. return ((pos2 == 28) || (pos2 == 12) || (pos2 == 18));
  181. case 128: // 128. ADVN VSTA XVBM",
  182. return ((pos2 == 28) || (pos2 == 12) || (pos2 == 14));
  183. case 129: // 129. ADVN XVAE
  184. return ((pos2 == 28) || (pos2 == 18));
  185. case 130: // 130. ADVN XVAM
  186. return ((pos2 == 28) || (pos2 == 15));
  187. case 131: // 131. ADVN XVBM XVMM
  188. return ((pos2 == 28) || (pos2 == 14) || (pos2 == 16));
  189. case 132: // 132. ADVP JSBR RPRE VATT
  190. return ((pos2 == 30) || (pos2 == 39) || (pos2 == 40) || (pos2 == 13));
  191. case 133: // 133. ADVP VATT
  192. return ((pos2 == 30) || (pos2 == 13));
  193. case 134: // 134. ADVS DDAC JCRG
  194. return ((pos2 == 31) || (pos2 == 20) || (pos2 == 37));
  195. case 135: // 135. ADVS DDAC JSBR
  196. return ((pos2 == 31) || (pos2 == 20) || (pos2 == 39));
  197. case 136: // 136. ADVS DDAN VSTA
  198. return ((pos2 == 31) || (pos2 == 19) || (pos2 == 12));
  199. case 137: // 137. ADVS DIAC
  200. return ((pos2 == 31) || (pos2 == 23));
  201. case 138: // 138. ADVS DONM
  202. return ((pos2 == 31) || (pos2 == 27));
  203. case 139: // 139. ADVS JCRG JSBR
  204. return ((pos2 == 31) || (pos2 == 37) || (pos2 == 39));
  205. case 140: // 140. ADVS JCRG JSBR RPRE
  206. return ((pos2 == 31) || (pos2 == 37) || (pos2 == 39) || (pos2 == 40));
  207. case 141: // 141. ADVS JSBR
  208. return ((pos2 == 31) || (pos2 == 39));
  209. case 142: // 142. ADVS JSBR RPRE
  210. return ((pos2 == 31) || (pos2 == 39) || (pos2 == 40));
  211. case 143: // 143. ADVS NCMN
  212. return ((pos2 == 31) || (pos2 == 5));
  213. case 144: // 144. ADVS VATT
  214. return ((pos2 == 31) || (pos2 == 13));
  215. case 145: // 145. CFQC CLTV CNIT DCNM JCRG JSBR NCMN RPRE XVBM
  216. return ((pos2 == 35) || (pos2 == 33) || (pos2 == 32));
  217. case 146: // 146. CFQC CNIT PREL
  218. return ((pos2 == 35) || (pos2 == 32) || (pos2 == 10));
  219. case 147: // 147. CFQC NCMN
  220. return ((pos2 == 35) || (pos2 == 5));
  221. case 148: // 148. CLTV CNIT NCMN
  222. return ((pos2 == 33) || (pos2 == 32) || (pos2 == 5));
  223. case 149: // 149. CLTV CNIT NCMN RPRE
  224. return ((pos2 == 33) || (pos2 == 32) || (pos2 == 5) || (pos2 == 40));
  225. case 150: // 150. CLTV CNIT NCMN VSTA
  226. return ((pos2 == 33) || (pos2 == 32) || (pos2 == 5) || (pos2 == 12));
  227. case 151: // 151. CLTV NCMN
  228. return ((pos2 == 33) || (pos2 == 5));
  229. case 152: // 152. CLTV NCMN VACT VATT
  230. return ((pos2 == 33) || (pos2 == 5) || (pos2 == 11) || (pos2 == 13));
  231. case 153: // 153. CLTV NCMN VATT
  232. return ((pos2 == 33) || (pos2 == 5) || (pos2 == 13));
  233. case 154: // 154. CMTR CNIT NCMN
  234. return ((pos2 == 34) || (pos2 == 32) || (pos2 == 5));
  235. case 155: // 155. CMTR NCMN
  236. return ((pos2 == 34) || (pos2 == 5));
  237. case 156: // 156. CMTR NCMN VATT VSTA
  238. return ((pos2 == 34) || (pos2 == 5) || (pos2 == 13) || (pos2 == 12));
  239. case 157: // 157. CNIT DDAC NCMN VATT
  240. return ((pos2 == 32) || (pos2 == 20) || (pos2 == 5) || (pos2 == 13));
  241. case 158: // 158. CNIT DONM NCMN RPRE VATT
  242. return ((pos2 == 32) || (pos2 == 27) || (pos2 == 5) || (pos2 == 40) || (pos2 == 13));
  243. case 159: // 159. CNIT FIXN FIXV JSBR NCMN
  244. return ((pos2 == 32) || (pos2 == 42) || (pos2 == 43) || (pos2 == 39) || (pos2 == 5));
  245. case 160: // 160. CNIT JCRG JSBR NCMN PREL RPRE VATT
  246. return ((pos2 == 32) || (pos2 == 37) || (pos2 == 39) || (pos2 == 5) || (pos2 == 40));
  247. case 161: // 161. CNIT JSBR RPRE
  248. return ((pos2 == 32) || (pos2 == 39) || (pos2 == 40));
  249. case 162: // 162. CNIT NCMN
  250. return ((pos2 == 32) || (pos2 == 5));
  251. case 163: // 163. CNIT NCMN RPRE
  252. return ((pos2 == 32) || (pos2 == 5) || (pos2 == 40));
  253. case 164: // 164. CNIT NCMN RPRE VATT
  254. return ((pos2 == 32) || (pos2 == 5) || (pos2 == 40) || (pos2 == 13));
  255. case 165: // 165. CNIT NCMN VACT
  256. return ((pos2 == 32) || (pos2 == 5) || (pos2 == 11));
  257. case 166: // 166. CNIT NCMN VSTA
  258. return ((pos2 == 32) || (pos2 == 5) || (pos2 == 12));
  259. case 167: // 167. CNIT NCNM
  260. return ((pos2 == 32) || (pos2 == 5));
  261. case 168: // 168. CNIT PPRS
  262. return ((pos2 == 32) || (pos2 == 7));
  263. case 169: // 169. DCNM DDAC DIAC DONM VATT VSTA *
  264. return ((pos2 == 26) || (pos2 == 20) || (pos2 == 23));
  265. case 170: // 170. DCNM DDAN DIAC
  266. return ((pos2 == 26) || (pos2 == 19) || (pos2 == 23));
  267. case 171: // 171. DCNM DIAC NCMN NCNM
  268. return ((pos2 == 26) || (pos2 == 23) || (pos2 == 5) || (pos2 == 2));
  269. case 172: // 172. DCNM DIBQ NCMN
  270. return ((pos2 == 26) || (pos2 == 24) || (pos2 == 5));
  271. case 173: // 173. DCNM DONM
  272. return ((pos2 == 26) || (pos2 == 27));
  273. case 174: // 174. DCNM NCMN
  274. return ((pos2 == 26) || (pos2 == 2));
  275. case 175: // 175. DCNM NCNM
  276. return ((pos2 == 26) || (pos2 == 5));
  277. case 176: // 176. DCNM NCNM VACT
  278. return ((pos2 == 26) || (pos2 == 5) || (pos2 == 11));
  279. case 177: // 177. DCNM VATT
  280. return ((pos2 == 26) || (pos2 == 13));
  281. case 178: // 178. DDAC DDAN
  282. return ((pos2 == 20) || (pos2 == 19));
  283. case 179: // 179. DDAC DDAN DIAC NCMN
  284. return ((pos2 == 20) || (pos2 == 19) || (pos2 ==23) || (pos2 ==5));
  285. case 180: // 180. DDAC DDAN DIAC VATT
  286. return ((pos2 == 20) || (pos2 == 19) || (pos2 ==23) || (pos2 ==13));
  287. case 181: // 181. DDAC DDAN EAFF PDMN
  288. return ((pos2 == 20) || (pos2 == 19) || (pos2 ==44) || (pos2 ==8));
  289. case 182: // 182. DDAC DDAN PDMN
  290. return ((pos2 == 20) || (pos2 == 19) || (pos2 ==8));
  291. case 183: // 183. DDAC DIAC VSTA
  292. return ((pos2 == 20) || (pos2 == 23) || (pos2 ==12));
  293. case 184: // 184. DDAC NCMN
  294. return ((pos2 == 20) || (pos2 == 5));
  295. case 185: // 185. DDAN DDBQ
  296. return ((pos2 == 20) || (pos2 == 21));
  297. case 186: // 186. DDAN DIAC PNTR
  298. return ((pos2 == 20) || (pos2 == 23) || (pos2 == 9));
  299. case 187: // 187. DDAN NCMN
  300. return ((pos2 == 20) || (pos2 == 5));
  301. case 188: // 188. DDAN NCMN RPRE VATT
  302. return ((pos2 == 20) || (pos2 == 5) || (pos2 == 40) || (pos2 == 13));
  303. case 189: // 189. DDAN PDMN
  304. return ((pos2 == 20) || (pos2 == 8));
  305. case 190: // 190. DDAN RPRE
  306. return ((pos2 == 20) || (pos2 == 40));
  307. case 191: // 191. VATT
  308. return (pos2 == 13);
  309. case 192: // 192. DDAQ VATT
  310. return ((pos2 == 22) || (pos2 == 13));
  311. case 193: // 193. DDBQ DIBQ
  312. return ((pos2 == 21) || (pos2 == 24));
  313. case 194: // 194. DDBQ JCRG JSBR
  314. return ((pos2 == 21) || (pos2 == 37) || (pos2 == 39));
  315. case 195: // 195. DDBQ JCRG NCMN
  316. return ((pos2 == 21) || (pos2 == 37) || (pos2 == 5));
  317. case 196: // 196. DIAC PDMN
  318. return ((pos2 == 23) || (pos2 == 8));
  319. case 197: // 197. DIBQ JSBR RPRE VSTA
  320. return ((pos2 == 24) || (pos2 == 39) || (pos2 == 40) || (pos2 == 12));
  321. case 198: // 198. DIBQ NCMN
  322. return ((pos2 == 24) || (pos2 == 5));
  323. case 199: // 199. DIBQ VATT
  324. return ((pos2 == 24) || (pos2 == 13));
  325. case 200: // 200. DIBQ VATT VSTA
  326. return ((pos2 == 24) || (pos2 == 13) || (pos2 == 12));
  327. case 201: // 201. DIBQ XVBM
  328. return ((pos2 == 24) || (pos2 == 14));
  329. case 202: // 202. DONM NCMN RPRE
  330. return ((pos2 == 27) || (pos2 == 5) || (pos2 == 40));
  331. case 203: // 203. DONM VACT VATT VSTA
  332. return ((pos2 == 27) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12));
  333. case 204: // 204. DONM VATT
  334. return ((pos2 == 27) || (pos2 == 13));
  335. case 205: // 205. EAFF XVAE XVAM XVBM
  336. return ((pos2 == 44) || (pos2 == 18) || (pos2 == 15) || (pos2 == 14));
  337. case 206: // 206. EITT JCRG
  338. return ((pos2 == 45) || (pos2 == 37));
  339. case 207: // 207. FIXN FIXV NCMN
  340. return ((pos2 == 42) || (pos2 == 43) || (pos2 == 5));
  341. case 208: // 208. FIXN FIXV RPRE VSTA
  342. return ((pos2 == 42) || (pos2 == 43) || (pos2 == 40) || (pos2 == 12));
  343. case 209: // 209. FIXN JSBR NCMN PREL RPRE VSTA XVBM *
  344. return ((pos2 == 42) || (pos2 == 39) || (pos2 == 5) || (pos2 == 10));
  345. case 210: // 210. FIXN NCMN
  346. return ((pos2 == 42) || (pos2 == 5));
  347. case 211: // 211. FIXN VACT",
  348. return ((pos2 == 42) || (pos2 == 11));
  349. case 212: // 212. FIXN VACT VSTA",
  350. return ((pos2 == 42) || (pos2 == 11) || (pos2 == 12));
  351. case 213: // 213. FIXV JSBR RPRE",
  352. return ((pos2 == 42) || (pos2 == 39) || (pos2 == 40));
  353. case 214: // 214. JCMP JSBR",
  354. return ((pos2 == 38) || (pos2 == 39));
  355. case 215: // 215. JCMP RPRE VSTA",
  356. return ((pos2 == 38) || (pos2 == 40) || (pos2 == 12));
  357. case 216: // 216. JCMP VATT VSTA",
  358. return ((pos2 == 38) || (pos2 == 13) || (pos2 == 12));
  359. case 217: // 217. JCMP VSTA",
  360. return ((pos2 == 38) || (pos2 == 12));
  361. case 218: // 218. JCRG JSBR",
  362. return ((pos2 == 37) || (pos2 == 39));
  363. case 219: // 219. JCRG JSBR NCMN RPRE
  364. return ((pos2 == 37) || (pos2 == 39) || (pos2 == 5) || (pos2 == 40));
  365. case 220: // 220. JCRG JSBR RPRE",
  366. return ((pos2 == 37) || (pos2 == 39) || (pos2 == 40));
  367. case 221: // 221. JCRG RPRE
  368. return ((pos2 == 37) || (pos2 == 40));
  369. case 222: // 222. JCRG RPRE VATT VSTA
  370. return ((pos2 == 37) || (pos2 == 40)|| (pos2 == 13)|| (pos2 == 12));
  371. case 223: // 223. JCRG VSTA
  372. return ((pos2 == 37) || (pos2 == 12));
  373. case 224: // 224. JSBR NCMN
  374. return ((pos2 == 39) || (pos2 == 5));
  375. case 225: // 225. JSBR NCMN XVAE
  376. return ((pos2 == 39) || (pos2 == 5) || (pos2 == 18));
  377. case 226: // 226. JSBR NCMN XVAM XVBM XVMM
  378. return ((pos2 == 39) || (pos2 == 5) || (pos2 == 15) || (pos2 == 14) || (pos2 ==16));
  379. case 227: // 227. JSBR PREL
  380. return ((pos2 == 39) || (pos2 == 10));
  381. case 228: // 228. JSBR PREL RPRE
  382. return ((pos2 == 39) || (pos2 == 10) || (pos2 == 40));
  383. case 229: // 229. JSBR PREL XVBM
  384. return ((pos2 == 39) || (pos2 == 10) || (pos2 == 14));
  385. case 230: // 230. JSBR RPRE
  386. return ((pos2 == 39) || (pos2 == 40));
  387. case 231: // 231. JSBR RPRE VACT
  388. return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 11));
  389. case 232: // 232. JSBR RPRE VACT VSTA
  390. return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 11)|| (pos2 == 12));
  391. case 233: // 233. JSBR RPRE VACT XVAE XVAM
  392. return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 11)|| (pos2 == 18)|| (pos2 == 15));
  393. case 234: // 234. JSBR RPRE VATT
  394. return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 13));
  395. case 235: // 235. JSBR RPRE VSTA
  396. return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 12));
  397. case 236: // 236. JSBR RPRE XVAM
  398. return ((pos2 == 39) || (pos2 == 40)|| (pos2 == 15));
  399. case 237: // 237. JSBR VACT
  400. return ((pos2 == 39) || (pos2 == 11));
  401. case 238: // 238. JSBR VACT VSTA
  402. return ((pos2 == 39) || (pos2 == 11) || (pos2 == 12));
  403. case 239: // 239. JSBR VATT XVBM XVMM
  404. return ((pos2 == 39) || (pos2 == 13) || (pos2 == 14) || (pos2 == 16));
  405. case 240: // 240. JSBR VSTA
  406. return ((pos2 == 39) || (pos2 == 12));
  407. case 241: // 241. JSBR XVBM
  408. return ((pos2 == 39) || (pos2 == 14));
  409. case 242: // 242. NCMN NCNM
  410. return ((pos2 == 5) || (pos2 == 2));
  411. case 243: // 243. NCMN NCNM NPRP
  412. return ((pos2 == 5) || (pos2 == 2) || (pos2 == 1));
  413. case 244: // 244. NCMN NLBL NPRP
  414. return ((pos2 == 5) || (pos2 == 4) || (pos2 == 1));
  415. case 245: // 245. NCMN NPRP
  416. return ((pos2 == 5) || (pos2 == 1));
  417. case 246: // 246. NCMN NPRP RPRE
  418. return ((pos2 == 5) || (pos2 == 1) || (pos2 == 40));
  419. case 247: // 247. NCMN NTTL
  420. return ((pos2 == 5) || (pos2 == 6));
  421. case 248: // 248. NCMN PDMN PPRS
  422. return ((pos2 == 5) || (pos2 == 8) || (pos2 == 7));
  423. case 249: // 249. NCMN PDMN VATT
  424. return ((pos2 == 5) || (pos2 == 8) || (pos2 == 13));
  425. case 250: // 250. NCMN PNTR
  426. return ((pos2 == 5) || (pos2 == 9));
  427. case 251: // 251. NCMN PPRS PREL VACT
  428. return ((pos2 == 5) || (pos2 == 7) || (pos2 == 10) || (pos2 == 11));
  429. case 252: // 252. NCMN RPRE
  430. return ((pos2 == 5) || (pos2 == 40));
  431. case 253: // 253. NCMN RPRE VACT VATT
  432. return ((pos2 == 5) || (pos2 == 40) || (pos2 == 11) || (pos2 == 13));
  433. case 254: // 254. NCMN RPRE VATT
  434. return ((pos2 == 5) || (pos2 == 40) || (pos2 == 13));
  435. case 255: // 255. NCMN VACT
  436. return ((pos2 == 5) || (pos2 == 11));
  437. case 256: // 256. NCMN VACT VATT
  438. return ((pos2 == 5) || (pos2 == 11) || (pos2 == 13));
  439. case 257: // 257. NCMN VACT VATT VSTA XVAE
  440. return ((pos2 == 5) || (pos2 == 11) || (pos2 == 13) || (pos2 == 12) || (pos2 == 18));
  441. case 258: // 258. NCMN VACT VSTA
  442. return ((pos2 == 5) || (pos2 == 11) || (pos2 == 12));
  443. case 259: // 259. NCMN VACT VSTA XVAM
  444. return ((pos2 == 5) || (pos2 == 11) || (pos2 == 12) || (pos2 == 15));
  445. case 260: // 260. NCMN VACT VSTA XVBB
  446. return ((pos2 == 5) || (pos2 == 11) || (pos2 == 12) || (pos2 == 17));
  447. case 261: // 261. NCMN VATT
  448. return ((pos2 == 5) || (pos2 == 13));
  449. case 262: // 262. NCMN VATT VSTA
  450. return ((pos2 == 5) || (pos2 == 13) || (pos2 == 12));
  451. case 263: // 263. NCMN VATT XVAM
  452. return ((pos2 == 5) || (pos2 == 13) || (pos2 == 15));
  453. case 264: // 264. NCMN VSTA
  454. return ((pos2 == 5) || (pos2 == 12));
  455. case 265: // 265. NCMN XVBM
  456. return ((pos2 == 5) || (pos2 == 14));
  457. case 266: // 266. NPRP RPRE
  458. return ((pos2 == 1) || (pos2 == 40));
  459. case 267: // 267. NPRP VATT
  460. return ((pos2 == 1) || (pos2 == 13));
  461. case 268: // 268. NTTL PPRS
  462. return ((pos2 == 6) || (pos2 == 7));
  463. case 269: // 269. PDMN PPRS
  464. return ((pos2 == 8) || (pos2 == 7));
  465. case 270: // 270. PDMN VATT
  466. return ((pos2 == 8) || (pos2 == 13));
  467. case 271: // 271. PDMN VATT VSTA
  468. return ((pos2 == 8) || (pos2 == 13) || (pos2 == 12));
  469. case 272: // 272. PPRS PREL
  470. return ((pos2 == 7) || (pos2 == 10));
  471. case 273: // 273. PPRS VATT
  472. return ((pos2 == 7) || (pos2 == 13));
  473. case 274: // 274. RPRE VACT
  474. return ((pos2 == 40) || (pos2 == 11));
  475. case 275: // 275. RPRE VACT VATT
  476. return ((pos2 == 40) || (pos2 == 11) || (pos2 == 13));
  477. case 276: // 276. RPRE VACT VSTA
  478. return ((pos2 == 40) || (pos2 == 11) || (pos2 == 12));
  479. case 277: // 277. RPRE VACT VSTA XVAE
  480. return ((pos2 == 40) || (pos2 == 11) || (pos2 == 12) || (pos2 == 18));
  481. case 278: // 278. RPRE VACT XVAE
  482. return ((pos2 == 40) || (pos2 == 11) || (pos2 == 18));
  483. case 279: // 279. RPRE VATT
  484. return ((pos2 == 40) || (pos2 == 13));
  485. case 280: // 280. RPRE VATT VSTA
  486. return ((pos2 == 40) || (pos2 == 13) || (pos2 == 12));
  487. case 281: // 281. RPRE VSTA
  488. return ((pos2 == 40) || (pos2 == 12));
  489. case 282: // 282. VACT VATT
  490. return ((pos2 == 11) || (pos2 == 13));
  491. case 283: // 283. VACT VATT VSTA
  492. return ((pos2 == 11) || (pos2 == 13) || (pos2 == 12));
  493. case 284: // 284. VACT VATT XVAE XVAM XVBM
  494. return ((pos2 == 11) || (pos2 == 13) || (pos2 == 18) || (pos2 == 15) || (pos2 == 14));
  495. case 285: // 285. VACT VSTA
  496. return ((pos2 == 11) || (pos2 == 12));
  497. case 286: // 286. VACT VSTA XVAE
  498. return ((pos2 == 11) || (pos2 == 12) || (pos2 == 18));
  499. case 287: // 287. VACT VSTA XVAE XVAM
  500. return ((pos2 == 11) || (pos2 == 12) || (pos2 == 18) || (pos2 == 15));
  501. case 288: // 288. VACT VSTA XVAE XVAM XVMM",
  502. return ((pos2 == 11) || (pos2 == 12) || (pos2 == 18) || (pos2 == 15) || (pos2 == 16));
  503. case 289: // 289. VACT VSTA XVAM",
  504. return ((pos2 == 11) || (pos2 == 12) || (pos2 == 15));
  505. case 290: // 290. VACT VSTA XVAM XVMM",
  506. return ((pos2 == 11) || (pos2 == 12) || (pos2 == 15) || (pos2 == 16));
  507. case 291: // 291. VACT XVAE",
  508. return ((pos2 == 11) || (pos2 == 18));
  509. case 292: // 292. VACT XVAM",
  510. return ((pos2 == 11) || (pos2 == 15));
  511. case 293: // 293. VACT XVAM XVMM",
  512. return ((pos2 == 11) || (pos2 == 15) || (pos2 == 16));
  513. case 294: // 294. VACT XVMM",
  514. return ((pos2 == 11) || (pos2 == 16));
  515. case 295: // 295. VATT VSTA",
  516. return ((pos2 == 13) || (pos2 == 12));
  517. case 296: // 296. VSTA XVAE",
  518. return ((pos2 == 12) || (pos2 == 18));
  519. case 297: // 297. VSTA XVAM",
  520. return ((pos2 == 12) || (pos2 == 15));
  521. case 298: // 298. VSTA XVAM XVMM",
  522. return ((pos2 == 12) || (pos2 == 15) || (pos2 == 16));
  523. case 299: // 299. VSTA XVBM",
  524. return ((pos2 == 12) || (pos2 ==14));
  525. case 300: // 300. XVAM XVBM",
  526. return ((pos2 == 15) || (pos2 == 14));
  527. case 301: // 301. XVAM XVBM XVMM",
  528. return ((pos2 == 15) || (pos2 == 14) || (pos2 == 16));
  529. case 302: // 302. XVAM XVMM",
  530. return ((pos2 == 15) || (pos2 == 16));
  531. default:
  532. return false;
  533. }
  534. }
  535. }
  536. //+---------------------------------------------------------------------------
  537. //
  538. // Class: CThaiTrigramTrieIter
  539. //
  540. // Synoposis: Constructor:
  541. //
  542. // Arguments:
  543. //
  544. // Modifies:
  545. //
  546. // History: created 8/99 aarayas
  547. //
  548. // Notes:
  549. //
  550. //----------------------------------------------------------------------------
  551. CThaiTrigramTrieIter::CThaiTrigramTrieIter() : pTrieScanArray(NULL)
  552. {
  553. pTrieScanArray = new TRIESCAN[50];
  554. }
  555. //+---------------------------------------------------------------------------
  556. //
  557. // Class: CThaiTrigramTrieIter
  558. //
  559. // Synoposis: Destructor
  560. //
  561. // Arguments:
  562. //
  563. // Modifies:
  564. //
  565. // History: created 8/99 aarayas
  566. //
  567. // Notes:
  568. //
  569. //----------------------------------------------------------------------------
  570. CThaiTrigramTrieIter::~CThaiTrigramTrieIter()
  571. {
  572. if (pTrieScanArray)
  573. delete pTrieScanArray;
  574. }
  575. //+---------------------------------------------------------------------------
  576. //
  577. // Class: CThaiTrigramTrieIter
  578. //
  579. // Synopsis: Initialize variables.
  580. //
  581. // Arguments:
  582. //
  583. // Modifies:
  584. //
  585. // History: created 8/99 aarayas
  586. //
  587. // Notes:
  588. //
  589. //----------------------------------------------------------------------------
  590. void CThaiTrigramTrieIter::Init(CTrie* ctrie)
  591. {
  592. // Declare varialbes.
  593. WCHAR pos;
  594. // Initialize parent.
  595. CTrieIter::Init(ctrie);
  596. pos1Cache = 0;
  597. pos2Cache = 0;
  598. // Initialize Hash table.
  599. for (pos = 1; pos <= 47; pos++)
  600. GetScanFirstChar(pos,&pTrieScanArray[pos]);
  601. }
  602. //+---------------------------------------------------------------------------
  603. //
  604. // Class: CThaiTrigramTrieIter
  605. //
  606. // Synopsis: Initialize variables.
  607. //
  608. // Arguments:
  609. //
  610. // Modifies:
  611. //
  612. // History: created 8/99 aarayas
  613. //
  614. // Notes:
  615. //
  616. //----------------------------------------------------------------------------
  617. bool CThaiTrigramTrieIter::GetScanFirstChar(WCHAR wc, TRIESCAN* pTrieScan)
  618. {
  619. // Reset the trie scan.
  620. memset(&trieScan, 0, sizeof(TRIESCAN));
  621. // Encrypt
  622. wc += 0x0100;
  623. if (!TrieGetNextState(pTrieCtrl, &trieScan))
  624. return false;
  625. while (wc != trieScan.wch)
  626. {
  627. // Keep moving the the right of the trie.
  628. if (!TrieGetNextNode(pTrieCtrl, &trieScan))
  629. {
  630. memset(pTrieScan, 0, sizeof(TRIESCAN));
  631. return false;
  632. }
  633. }
  634. memcpy(pTrieScan, &trieScan, sizeof(TRIESCAN));
  635. return true;
  636. }
  637. //+---------------------------------------------------------------------------
  638. //
  639. // Class: CThaiTrigramTrieIter
  640. //
  641. // Synopsis: Bring interation index to the first node.
  642. //
  643. // Arguments:
  644. //
  645. // Modifies:
  646. //
  647. // History: created 8/99 aarayas
  648. //
  649. // Notes:
  650. //
  651. //----------------------------------------------------------------------------
  652. void CThaiTrigramTrieIter::GetNode()
  653. {
  654. pos = (WCHAR) trieScan.wch - 0x0100;
  655. /*
  656. fWordEnd = (trieScan.wFlags & TRIE_NODE_VALID) &&
  657. (!(trieScan.wFlags & TRIE_NODE_TAGGED) ||
  658. (trieScan.aTags[0].dwData & iDialectMask));
  659. */
  660. fWordEnd = (trieScan.wFlags & TRIE_NODE_VALID);
  661. if (fWordEnd)
  662. {
  663. dwTag = (DWORD) (trieScan.wFlags & TRIE_NODE_TAGGED ?
  664. trieScan.aTags[0].dwData :
  665. 0);
  666. }
  667. }
  668. //+---------------------------------------------------------------------------
  669. //
  670. // Class: CThaiTrigramTrieIter
  671. //
  672. // Synopsis:
  673. //
  674. // Arguments:
  675. //
  676. // Modifies:
  677. //
  678. // History: created 8/99 aarayas
  679. //
  680. // Notes:
  681. //
  682. //----------------------------------------------------------------------------
  683. DWORD CThaiTrigramTrieIter::GetProb(WCHAR pos1, WCHAR pos2, WCHAR pos3)
  684. {
  685. // Declare and initialize all local variables.
  686. int i = 0;
  687. if (pos1 == pos1Cache && pos2 == pos2Cache)
  688. {
  689. memcpy(&trieScan,&trieScanCache, sizeof(TRIESCAN));
  690. if (!Down()) return 0;
  691. while (true)
  692. {
  693. GetNode();
  694. if (IsTagEqual(pos3,pos) && fWordEnd)
  695. {
  696. return dwTag;
  697. }
  698. else if (!Right()) break;
  699. }
  700. return 0;
  701. }
  702. if (pos1 >= 1 && pos1 <= 47)
  703. memcpy(&trieScan,&pTrieScanArray[pos1], sizeof(TRIESCAN));
  704. Reset();
  705. if (!Down())
  706. return false;
  707. while (true)
  708. {
  709. GetNode();
  710. if (IsTagEqual(pos1,pos))
  711. {
  712. if (!Down()) break;
  713. while (true)
  714. {
  715. GetNode();
  716. if (IsTagEqual(pos2,pos))
  717. {
  718. pos1Cache = pos1;
  719. pos2Cache = pos2;
  720. memcpy(&trieScanCache,&trieScan, sizeof(TRIESCAN));
  721. if (!Down()) break;
  722. while (true)
  723. {
  724. GetNode();
  725. if (IsTagEqual(pos3,pos) && fWordEnd)
  726. {
  727. return dwTag;
  728. }
  729. else if (!Right()) break;
  730. }
  731. return 0;
  732. }
  733. else if (!Right()) break;
  734. }
  735. return 0;
  736. }
  737. // Move right of the Trie Branch
  738. else if (!Right()) break;
  739. }
  740. return 0;
  741. }
  742. DWORD CThaiTrigramTrieIter::GetProb(WCHAR* posArray)
  743. {
  744. // Declare and initialize all local variables.
  745. int i = 0;
  746. Reset();
  747. if (!Down())
  748. return 0;
  749. while (TRUE)
  750. {
  751. GetNode();
  752. if (pos == posArray[i])
  753. {
  754. i++;
  755. if (fWordEnd && posArray[i] == '\0')
  756. {
  757. return dwTag;
  758. }
  759. // Move down the Trie Branch.
  760. else if (!Down()) break;
  761. }
  762. // Move right of the Trie Branch
  763. else if (!Right()) break;
  764. }
  765. return 0;
  766. }