Leaked source code of windows server 2003
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.

2029 lines
81 KiB

  1. /****************************************************************************
  2. HAUTO.CPP
  3. Owner: cslim
  4. Copyright (c) 1997-1999 Microsoft Corporation
  5. Hangul composition state machine class
  6. History:
  7. 14-JUL-1999 cslim Copied from IME98 source tree
  8. *****************************************************************************/
  9. #include "precomp.h"
  10. #include "hauto.h"
  11. #include "debug.h"
  12. // Code conversion table from Chosung to Jongsung.
  13. const
  14. BYTE CHangulAutomata::Cho2Jong[NUM_OF_CHOSUNG+1] = //(+ 1 means including fill code at 0)
  15. { 0,
  16. 1, 2, 4, 7, 0, 8, 16, 17, 0, 19,
  17. 20, 21, 22, 0, 23, 24, 25, 26, 27
  18. };
  19. // Code conversion table from Jongsung to Chosung.
  20. const
  21. BYTE CHangulAutomata::Jong2Cho[NUM_OF_JONGSUNG] = // Jongsung has inherent fill code
  22. { 0,
  23. 1, 2, 0, 3, 0, 0, 4, 6, 0, 0,
  24. 0, 0, 0, 0, 0, 7, 8, 0, 10, 11,
  25. 12, 13, 15, 16, 17, 18, 19
  26. };
  27. // Combination table for double jongsung.
  28. BYTE CHangulAutomata2::rgbDJongTbl[NUM_OF_DOUBLE_JONGSUNG_2BEOL+1][3] =
  29. {
  30. { 1, 19, 3 }, { 4, 22, 5 },
  31. { 4, 27, 6 }, { 8, 1, 9 },
  32. { 8, 16, 10 }, { 8, 17, 11 },
  33. { 8, 19, 12 }, { 8, 25, 13 },
  34. { 8, 26, 14 }, { 8, 27, 15 },
  35. { 17, 19, 18 },
  36. { 0, 0, 0 }
  37. };
  38. BYTE CHangulAutomata3::rgbDJongTbl[NUM_OF_DOUBLE_JONGSUNG_3BEOL+1][3] =
  39. {
  40. // 3Beolsik has two more Double Jongsung conditions.
  41. { 1, 1, 2 }, // KiYeok+KiYeok = Double KiYeok
  42. { 1, 19, 3 }, { 4, 22, 5 },
  43. { 4, 27, 6 }, { 8, 1, 9 },
  44. { 8, 16, 10 }, { 8, 17, 11 },
  45. { 8, 19, 12 }, { 8, 25, 13 },
  46. { 8, 26, 14 }, { 8, 27, 15 },
  47. { 17, 19, 18 },
  48. { 19, 19, 20 }, // Sios+Sios = Double Sios
  49. { 0, 0, 0 }
  50. };
  51. #if (NOT_USED)
  52. static
  53. WORD CHangulAutomata::DblJong2Cho(WORD DblJong)
  54. {
  55. BYTE (*pDbl)[3] = rgbDJongTbl;
  56. int i = NUM_OF_DOUBLE_JONGSUNG;
  57. for (; i>0; i--, pDbl--)
  58. if ( (*pDbl)[2] == DblJong )
  59. return Jong2Cho[(*pDbl)[1]];
  60. return 0;
  61. }
  62. #endif
  63. ///////////////////////////////////////////////////////////////////////////////
  64. // 2 beolsik input state category
  65. const WORD CHangulAutomata2::H_CONSONANT = 0x0000 | H_HANGUL; // Consonant
  66. const WORD CHangulAutomata2::H_VOWEL = 0x0100 | H_HANGUL; // Vowel
  67. const WORD CHangulAutomata2::H_DOUBLE = 0x0200 | H_HANGUL; // Double combination possible
  68. const WORD CHangulAutomata2::H_ONLYCHO = 0x0400 | H_HANGUL; // Chosung only
  69. // 3 beolsik input state category
  70. const WORD CHangulAutomata3::H_CHOSUNG = 0x0000 | H_HANGUL; // ChoSung
  71. const WORD CHangulAutomata3::H_JUNGSUNG = 0x0200 | H_HANGUL; // JungSung
  72. const WORD CHangulAutomata3::H_JONGSUNG = 0x0400 | H_HANGUL; // JongSung
  73. const WORD CHangulAutomata3::H_DOUBLE = 0x0100 | H_HANGUL; // Double combination possible
  74. ///////////////////////////////////////////////////////////////////////////////
  75. // bHTable[] structure
  76. //
  77. // 2 Beolsik
  78. // H I G H B Y T E L O W B Y T E
  79. // 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
  80. // +-+-------+-----+---------------+
  81. // | | | | |
  82. // +-+-------+-----+---------------+
  83. // High 8 : Hangul or English
  84. // High 2-0 : used for input state category field.
  85. // Low 4-0 : Hangul component code (internal code)
  86. //
  87. // ====-- SHARED SECTION START --====
  88. #pragma data_seg(".MSIMESHR")
  89. WORD CHangulAutomata2::wHTable[256][2] =
  90. {
  91. // { Hangul normal, Hangul shift, English normal, English shift }
  92. // 2 BeolSik
  93. { 0x00, 0x00 }, // 0, 0x00:
  94. { 0x00, 0x00 }, // 1, 0x01: VK_LBUTTON
  95. { 0x00, 0x00 }, // 2, 0x02: VK_RBUTTON
  96. { 0x00, 0x00 }, // 3, 0x03: VK_CANCEL
  97. { 0x00, 0x00 }, // 4, 0x04: VK_MBUTTON
  98. { 0x00, 0x00 }, // 5, 0x05:
  99. { 0x00, 0x00 }, // 6, 0x06:
  100. { 0x00, 0x00 }, // 7, 0x07:
  101. { 0x00, 0x00 }, // 8, 0x08: VK_BACK
  102. { 0x00, 0x00 }, // 9, 0x09: VK_TAB
  103. { 0x00, 0x00 }, // 10, 0x0A:
  104. { 0x00, 0x00 }, // 11, 0x0B:
  105. { 0x00, 0x00 }, // 12, 0x0C: VK_CLEAR
  106. { 0x00, 0x00 }, // 13, 0x0D: VK_RETURN
  107. { 0x00, 0x00 }, // 14, 0x0E:
  108. { 0x00, 0x00 }, // 15, 0x0F:
  109. { 0x00, 0x00 }, // 16, 0x10: VK_SHIFT
  110. { 0x00, 0x00 }, // 17, 0x11: VK_CONTROL
  111. { 0x00, 0x00 }, // 18, 0x12: VK_MENU
  112. { 0x00, 0x00 }, // 19, 0x13: VK_PAUSE
  113. { 0x00, 0x00 }, // 20, 0x14: VK_CAPITAL
  114. { 0x00, 0x00 }, // 21, 0x15: VK_HANGUL
  115. { 0x00, 0x00 }, // 22, 0x16:
  116. { 0x00, 0x00 }, // 23, 0x17: VK_JUNJA
  117. { 0x00, 0x00 }, // 24, 0x18:
  118. { 0x00, 0x00 }, // 25, 0x19: VK_HANJA
  119. { 0x00, 0x00 }, // 26, 0x1A:
  120. { 0x00, 0x00 }, // 27, 0x1B: VK_ESCAPE
  121. { 0x00, 0x00 }, // 28, 0x1C:
  122. { 0x00, 0x00 }, // 29, 0x1D:
  123. { 0x00, 0x00 }, // 30, 0x1E:
  124. { 0x00, 0x00 }, // 31, 0x1F:
  125. { 0x20, 0x20 }, // 32, 0x20: VK_SPACE
  126. { 0x00, 0x00 }, // 33, 0x21: VK_PRIOR
  127. { 0x00, 0x00 }, // 34, 0x22: VK_NEXT
  128. { 0x00, 0x00 }, // 35, 0x23: VK_END
  129. { 0x00, 0x00 }, // 36, 0x24: VK_HOME
  130. { 0x00, 0x00 }, // 37, 0x25: VK_LEFT
  131. { 0x00, 0x00 }, // 38, 0x26: VK_UP
  132. { 0x00, 0x00 }, // 39, 0x27: VK_RIGHT
  133. { 0x00, 0x00 }, // 40, 0x28: VK_DOWN
  134. { 0x00, 0x00 }, // 41, 0x29: VK_SELECT
  135. { 0x00, 0x00 }, // 42, 0x2A: VK_PRINT
  136. { 0x00, 0x00 }, // 43, 0x2B: VK_EXECUTE
  137. { 0x00, 0x00 }, // 44, 0x2C: VK_SNAPSHOT
  138. { 0x00, 0x00 }, // 45, 0x2D: VK_INSERT
  139. { 0x00, 0x00 }, // 46, 0x2E: VK_DELETE
  140. { 0x00, 0x00 }, // 47, 0x2F: VK_HELP
  141. { 0x30, 0x29 }, // 48, 0x30: VK_0
  142. { 0x31, 0x21 }, // 49, 0x31: VK_1
  143. { 0x32, 0x40 }, // 50, 0x32: VK_2
  144. { 0x33, 0x23 }, // 51, 0x33: VK_3
  145. { 0x34, 0x24 }, // 52, 0x34: VK_4
  146. { 0x35, 0x25 }, // 53, 0x35: VK_5
  147. { 0x36, 0x5E }, // 54, 0x36: VK_6
  148. { 0x37, 0x26 }, // 55, 0x37: VK_7
  149. { 0x38, 0x2A }, // 56, 0x38: VK_8
  150. { 0x39, 0x28 }, // 57, 0x39: VK_9
  151. { 0x00, 0x00 }, // 58, 0x3A:
  152. { 0x00, 0x00 }, // 59, 0x3B:
  153. { 0x00, 0x00 }, // 60, 0x3C:
  154. { 0x00, 0x00 }, // 61, 0x3D:
  155. { 0x00, 0x00 }, // 62, 0x3E:
  156. { 0x00, 0x00 }, // 63, 0x3F:
  157. { 0x00, 0x00 }, // 64, 0x40:
  158. { 7 | H_CONSONANT, 7 | H_CONSONANT }, // 65, 0x41: VK_A �� ��
  159. { 18 | H_VOWEL, 18 | H_VOWEL }, // 66, 0x42: VK_B �� ��
  160. { 15 | H_CONSONANT, 15 | H_CONSONANT }, // 67, 0x43: VK_C �� ��
  161. { 12 | H_CONSONANT, 12 | H_CONSONANT }, // 68, 0x44: VK_D �� ��
  162. { 4 | H_CONSONANT, 5 | H_ONLYCHO}, // 69, 0x45: VK_E �� ��
  163. { 6 | H_CONSONANT | H_DOUBLE, 6 | H_CONSONANT | H_DOUBLE }, // 70, 0x46: VK_F �� ��
  164. { 19 | H_CONSONANT, 19 | H_CONSONANT }, // 71, 0x47: VK_G �� ��
  165. { 9 | H_VOWEL | H_DOUBLE, 9 | H_VOWEL | H_DOUBLE }, // 72, 0x48: VK_H �� ��
  166. { 3 | H_VOWEL, 3 | H_VOWEL }, // 73, 0x49: VK_I �� ��
  167. { 5 | H_VOWEL, 5 | H_VOWEL }, // 74, 0x4A: VK_J �� ��
  168. { 1 | H_VOWEL, 1 | H_VOWEL }, // 75, 0x4B: VK_K �� ��
  169. { 21 | H_VOWEL, 21 | H_VOWEL }, // 76, 0x4C: VK_L �� ��
  170. { 19 | H_VOWEL | H_DOUBLE, 19 | H_VOWEL | H_DOUBLE }, // 77, 0x4D: VK_M �� ��
  171. { 14 | H_VOWEL | H_DOUBLE, 14 | H_VOWEL | H_DOUBLE }, // 78, 0x4E: VK_N �� ��
  172. { 2 | H_VOWEL, 4 | H_VOWEL }, // 79, 0x4F: VK_O �� ��
  173. { 6 | H_VOWEL, 8 | H_VOWEL }, // 80, 0x50: VK_P �� ��
  174. { 8 | H_CONSONANT | H_DOUBLE, 9 | H_ONLYCHO }, // 81, 0x51: VK_Q �� ��
  175. { 1 | H_CONSONANT | H_DOUBLE, 2 | H_CONSONANT }, // 82, 0x52: VK_R �� ��
  176. { 3 | H_CONSONANT | H_DOUBLE, 3 | H_CONSONANT | H_DOUBLE }, // 83, 0x53: VK_S �� ��
  177. { 10 | H_CONSONANT, 11 | H_CONSONANT }, // 84, 0x54: VK_T �� ��
  178. { 7 | H_VOWEL, 7 | H_VOWEL }, // 85, 0x55: VK_U �� ��
  179. { 18 | H_CONSONANT, 18 | H_CONSONANT }, // 86, 0x56: VK_V �� ��
  180. { 13 | H_CONSONANT, 14 | H_ONLYCHO }, // 87, 0x57: VK_W �� ��
  181. { 17 | H_CONSONANT, 17 | H_CONSONANT }, // 88, 0x58: VK_X �� ��
  182. { 13 | H_VOWEL, 13 | H_VOWEL }, // 89, 0x59: VK_Y �� ��
  183. { 16 | H_CONSONANT, 16 | H_CONSONANT }, // 90, 0x5A: VK_Z �� ��
  184. { 0x00, 0x00 }, // 91, 0x5B:
  185. { 0x00, 0x00 }, // 92, 0x5C:
  186. { 0x00, 0x00 }, // 93, 0x5D:
  187. { 0x00, 0x00 }, // 94, 0x5E:
  188. { 0x00, 0x00 }, // 95, 0x5F:
  189. { 0x30, 0x00 }, // 96, 0x60: VK_NUMPAD0
  190. { 0x31, 0x00 }, // 97, 0x61: VK_NUMPAD1
  191. { 0x32, 0x00 }, // 98, 0x62: VK_NUMPAD2
  192. { 0x33, 0x00 }, // 99, 0x63: VK_NUMPAD3
  193. { 0x34, 0x00 }, // 100, 0x64: VK_NUMPAD4
  194. { 0x35, 0x00 }, // 101, 0x65: VK_NUMPAD5
  195. { 0x36, 0x00 }, // 102, 0x66: VK_NUMPAD6
  196. { 0x37, 0x00 }, // 103, 0x67: VK_NUMPAD7
  197. { 0x38, 0x00 }, // 104, 0x68: VK_NUMPAD8
  198. { 0x39, 0x00 }, // 105, 0x69: VK_NUMPAD9
  199. { 0x2A, 0x2A }, // 106, 0x6A: VK_MULTIPLY
  200. { 0x2B, 0x2B }, // 107, 0x6B: VK_ADD
  201. { 0x00, 0x00 }, // 108, 0x6C: VK_SEPARATOR
  202. { 0x2D, 0x2D }, // 109, 0x6D: VK_SUBTRACT
  203. { 0x2E, 0x00 }, // 110, 0x6E: VK_DECIMAL
  204. { 0x2F, 0x2F }, // 111, 0x6F: VK_DIVIDE
  205. { 0x00, 0x00 }, // 112, 0x70: VK_F1
  206. { 0x00, 0x00 }, // 113, 0x71: VK_F2
  207. { 0x00, 0x00 }, // 114, 0x72: VK_F3
  208. { 0x00, 0x00 }, // 115, 0x73: VK_F4
  209. { 0x00, 0x00 }, // 116, 0x74: VK_F5
  210. { 0x00, 0x00 }, // 117, 0x75: VK_F6
  211. { 0x00, 0x00 }, // 118, 0x76: VK_F7
  212. { 0x00, 0x00 }, // 119, 0x77: VK_F8
  213. { 0x00, 0x00 }, // 120, 0x78: VK_F9
  214. { 0x00, 0x00 }, // 121, 0x79: VK_F10
  215. { 0x00, 0x00 }, // 122, 0x7A: VK_F11
  216. { 0x00, 0x00 }, // 123, 0x7B: VK_F12
  217. { 0x00, 0x00 }, // 124, 0x7C: VK_F13
  218. { 0x00, 0x00 }, // 125, 0x7D: VK_F14
  219. { 0x00, 0x00 }, // 126, 0x7E: VK_F15
  220. { 0x00, 0x00 }, // 127, 0x7F: VK_F16
  221. { 0x00, 0x00 }, // 128, 0x80: VK_F17
  222. { 0x00, 0x00 }, // 129, 0x81: VK_F18
  223. { 0x00, 0x00 }, // 130, 0x82: VK_F19
  224. { 0x00, 0x00 }, // 131, 0x83: VK_F20
  225. { 0x00, 0x00 }, // 132, 0x84: VK_F21
  226. { 0x00, 0x00 }, // 133, 0x85: VK_F22
  227. { 0x00, 0x00 }, // 134, 0x86: VK_F23
  228. { 0x00, 0x00 }, // 135, 0x87: VK_F24
  229. { 0x00, 0x00 }, // 136, 0x88:
  230. { 0x00, 0x00 }, // 137, 0x89:
  231. { 0x00, 0x00 }, // 138, 0x8A:
  232. { 0x00, 0x00 }, // 139, 0x8B:
  233. { 0x00, 0x00 }, // 140, 0x8C:
  234. { 0x00, 0x00 }, // 141, 0x8D:
  235. { 0x00, 0x00 }, // 142, 0x8E:
  236. { 0x00, 0x00 }, // 143, 0x8F:
  237. { 0x00, 0x00 }, // 144, 0x90: VK_NUMLOCK
  238. { 0x00, 0x00 }, // 145, 0x91: VK_SCROLL
  239. { 0x00, 0x00 }, // 146, 0x92:
  240. { 0x00, 0x00 }, // 147, 0x93:
  241. { 0x00, 0x00 }, // 148, 0x94:
  242. { 0x00, 0x00 }, // 149, 0x95:
  243. { 0x00, 0x00 }, // 150, 0x96:
  244. { 0x00, 0x00 }, // 151, 0x97:
  245. { 0x00, 0x00 }, // 152, 0x98:
  246. { 0x00, 0x00 }, // 153, 0x99:
  247. { 0x00, 0x00 }, // 154, 0x9A:
  248. { 0x00, 0x00 }, // 155, 0x9B:
  249. { 0x00, 0x00 }, // 156, 0x9C:
  250. { 0x00, 0x00 }, // 157, 0x9D:
  251. { 0x00, 0x00 }, // 158, 0x9E:
  252. { 0x00, 0x00 }, // 159, 0x9F:
  253. { 0x00, 0x00 }, // 160, 0xA0:
  254. { 0x00, 0x00 }, // 161, 0xA1:
  255. { 0x00, 0x00 }, // 162, 0xA2:
  256. { 0x00, 0x00 }, // 163, 0xA3:
  257. { 0x00, 0x00 }, // 164, 0xA4:
  258. { 0x00, 0x00 }, // 165, 0xA5:
  259. { 0x00, 0x00 }, // 166, 0xA6:
  260. { 0x00, 0x00 }, // 167, 0xA7:
  261. { 0x00, 0x00 }, // 168, 0xA8:
  262. { 0x00, 0x00 }, // 169, 0xA9:
  263. { 0x00, 0x00 }, // 170, 0xAA:
  264. { 0x00, 0x00 }, // 171, 0xAB:
  265. { 0x00, 0x00 }, // 172, 0xAC:
  266. { 0x00, 0x00 }, // 173, 0xAD:
  267. { 0x00, 0x00 }, // 174, 0xAE:
  268. { 0x00, 0x00 }, // 175, 0xAF:
  269. { 0x00, 0x00 }, // 176, 0xB0:
  270. { 0x00, 0x00 }, // 177, 0xB1:
  271. { 0x00, 0x00 }, // 178, 0xB2:
  272. { 0x00, 0x00 }, // 179, 0xB3:
  273. { 0x00, 0x00 }, // 180, 0xB4:
  274. { 0x00, 0x00 }, // 181, 0xB5:
  275. { 0x00, 0x00 }, // 182, 0xB6:
  276. { 0x00, 0x00 }, // 183, 0xB7:
  277. { 0x00, 0x00 }, // 184, 0xB8:
  278. { 0x00, 0x00 }, // 185, 0xB9:
  279. { 0x3B, 0x3A }, // 186, 0xBA: ; :
  280. { 0x3D, 0x2B }, // 187, 0xBB: = +
  281. { 0x2C, 0x3C }, // 188, 0xBC: , <
  282. { 0x2D, 0x5F }, // 189, 0xBD: - _
  283. { 0x2E, 0x3E }, // 190, 0xBE: . >
  284. { 0x2F, 0x3F }, // 191, 0xBF: / ?
  285. { 0x60, 0x7E }, // 192, 0xC0: ` ~
  286. { 0x00, 0x00 }, // 193, 0xC1:
  287. { 0x00, 0x00 }, // 194, 0xC2:
  288. { 0x00, 0x00 }, // 195, 0xC3:
  289. { 0x00, 0x00 }, // 196, 0xC4:
  290. { 0x00, 0x00 }, // 197, 0xC5:
  291. { 0x00, 0x00 }, // 198, 0xC6:
  292. { 0x00, 0x00 }, // 199, 0xC7:
  293. { 0x00, 0x00 }, // 200, 0xC8:
  294. { 0x00, 0x00 }, // 201, 0xC9:
  295. { 0x00, 0x00 }, // 202, 0xCA:
  296. { 0x00, 0x00 }, // 203, 0xCB:
  297. { 0x00, 0x00 }, // 204, 0xCC:
  298. { 0x00, 0x00 }, // 205, 0xCD:
  299. { 0x00, 0x00 }, // 206, 0xCE:
  300. { 0x00, 0x00 }, // 207, 0xCF:
  301. { 0x00, 0x00 }, // 208, 0xD0:
  302. { 0x00, 0x00 }, // 209, 0xD1:
  303. { 0x00, 0x00 }, // 210, 0xD2:
  304. { 0x00, 0x00 }, // 211, 0xD3:
  305. { 0x00, 0x00 }, // 212, 0xD4:
  306. { 0x00, 0x00 }, // 213, 0xD5:
  307. { 0x00, 0x00 }, // 214, 0xD6:
  308. { 0x00, 0x00 }, // 215, 0xD7:
  309. { 0x00, 0x00 }, // 216, 0xD8:
  310. { 0x00, 0x00 }, // 217, 0xD9:
  311. { 0x00, 0x00 }, // 218, 0xDA:
  312. { 0x5B, 0x7B }, // 219, 0xDB: [ {
  313. { 0x5C, 0x7C }, // 220, 0xDC: \ |
  314. { 0x5D, 0x7D }, // 221, 0xDD: ] }
  315. { 0x27, 0x22 }, // 222, 0xDE: ' "
  316. { 0x00, 0x00 }, // 223, 0xDF:
  317. { 0x00, 0x00 }, // 224, 0xE0:
  318. { 0x00, 0x00 }, // 225, 0xE1:
  319. { 0x00, 0x00 }, // 226, 0xE2:
  320. { 0x00, 0x00 }, // 227, 0xE3:
  321. { 0x00, 0x00 }, // 228, 0xE4:
  322. { 0x00, 0x00 }, // 229, 0xE5:
  323. { 0x00, 0x00 }, // 230, 0xE6:
  324. { 0x00, 0x00 }, // 231, 0xE7:
  325. { 0x00, 0x00 }, // 232, 0xE8:
  326. { 0x00, 0x00 }, // 233, 0xE9:
  327. { 0x00, 0x00 }, // 234, 0xEA:
  328. { 0x00, 0x00 }, // 235, 0xEB:
  329. { 0x00, 0x00 }, // 236, 0xEC:
  330. { 0x00, 0x00 }, // 237, 0xED:
  331. { 0x00, 0x00 }, // 238, 0xEE:
  332. { 0x00, 0x00 }, // 239, 0xEF:
  333. { 0x00, 0x00 }, // 240, 0xF0:
  334. { 0x00, 0x00 }, // 241, 0xF1:
  335. { 0x00, 0x00 }, // 242, 0xF2:
  336. { 0x00, 0x00 }, // 243, 0xF3:
  337. { 0x00, 0x00 }, // 244, 0xF4:
  338. { 0x00, 0x00 }, // 245, 0xF5:
  339. { 0x00, 0x00 }, // 246, 0xF6:
  340. { 0x00, 0x00 }, // 247, 0xF7:
  341. { 0x00, 0x00 }, // 248, 0xF8:
  342. { 0x00, 0x00 }, // 249, 0xF9:
  343. { 0x00, 0x00 }, // 250, 0xFA:
  344. { 0x00, 0x00 }, // 251, 0xFB:
  345. { 0x00, 0x00 }, // 252, 0xFC:
  346. { 0x00, 0x00 }, // 253, 0xFD:
  347. { 0x00, 0x00 }, // 254, 0xFE:
  348. { 0x00, 0x00 } // 255, 0xFF:
  349. };
  350. WORD CHangulAutomata3::wHTable[256][2] =
  351. {
  352. // 3 BeolSik
  353. { 0x00, 0x00 }, // 0, 0x00:
  354. { 0x00, 0x00 }, // 1, 0x01: VK_LBUTTON
  355. { 0x00, 0x00 }, // 2, 0x02: VK_RBUTTON
  356. { 0x00, 0x00 }, // 3, 0x03: VK_CANCEL
  357. { 0x00, 0x00 }, // 4, 0x04: VK_MBUTTON
  358. { 0x00, 0x00 }, // 5, 0x05:
  359. { 0x00, 0x00 }, // 6, 0x06:
  360. { 0x00, 0x00 }, // 7, 0x07:
  361. { 0x00, 0x00 }, // 8, 0x08: VK_BACK
  362. { 0x00, 0x00 }, // 9, 0x09: VK_TAB
  363. { 0x00, 0x00 }, // 10, 0x0A:
  364. { 0x00, 0x00 }, // 11, 0x0B:
  365. { 0x00, 0x00 }, // 12, 0x0C: VK_CLEAR
  366. { 0x00, 0x00 }, // 13, 0x0D: VK_RETURN
  367. { 0x00, 0x00 }, // 14, 0x0E:
  368. { 0x00, 0x00 }, // 15, 0x0F:
  369. { 0x00, 0x00 }, // 16, 0x10: VK_SHIFT
  370. { 0x00, 0x00 }, // 17, 0x11: VK_CONTROL
  371. { 0x00, 0x00 }, // 18, 0x12: VK_MENU
  372. { 0x00, 0x00 }, // 19, 0x13: VK_PAUSE
  373. { 0x00, 0x00 }, // 20, 0x14: VK_CAPITAL
  374. { 0x00, 0x00 }, // 21, 0x15: VK_HANGUL
  375. { 0x00, 0x00 }, // 22, 0x16:
  376. { 0x00, 0x00 }, // 23, 0x17: VK_JUNJA
  377. { 0x00, 0x00 }, // 24, 0x18:
  378. { 0x00, 0x00 }, // 25, 0x19: VK_HANJA
  379. { 0x00, 0x00 }, // 26, 0x1A:
  380. { 0x00, 0x00 }, // 27, 0x1B: VK_ESCAPE
  381. { 0x00, 0x00 }, // 28, 0x1C:
  382. { 0x00, 0x00 }, // 29, 0x1D:
  383. { 0x00, 0x00 }, // 30, 0x1E:
  384. { 0x00, 0x00 }, // 31, 0x1F:
  385. { 0x20, 0x20 }, // 32, 0x20: VK_SPACE
  386. { 0x00, 0x00 }, // 33, 0x21: VK_PRIOR
  387. { 0x00, 0x00 }, // 34, 0x22: VK_NEXT
  388. { 0x00, 0x00 }, // 35, 0x23: VK_END
  389. { 0x00, 0x00 }, // 36, 0x24: VK_HOME
  390. { 0x00, 0x00 }, // 37, 0x25: VK_LEFT
  391. { 0x00, 0x00 }, // 38, 0x26: VK_UP
  392. { 0x00, 0x00 }, // 39, 0x27: VK_RIGHT
  393. { 0x00, 0x00 }, // 40, 0x28: VK_DOWN
  394. { 0x00, 0x00 }, // 41, 0x29: VK_SELECT
  395. { 0x00, 0x00 }, // 42, 0x2A: VK_PRINT
  396. { 0x00, 0x00 }, // 43, 0x2B: VK_EXECUTE
  397. { 0x00, 0x00 }, // 44, 0x2C: VK_SNAPSHOT
  398. { 0x00, 0x00 }, // 45, 0x2D: VK_INSERT
  399. { 0x00, 0x00 }, // 46, 0x2E: VK_DELETE
  400. { 0x00, 0x00 }, // 47, 0x2F: VK_HELP
  401. { 16 | H_CHOSUNG, 0x29 }, // 48, 0x30: VK_0 �� )
  402. { 27 | H_JONGSUNG, 22 | H_JONGSUNG }, // 49, 0x31: VK_1 �� ��
  403. { 20 | H_JONGSUNG, 0x40 }, // 50, 0x32: VK_2 �� @
  404. { 17 | H_JONGSUNG | H_DOUBLE, 0x23 }, // 51, 0x33: VK_3 �� #
  405. { 13 | H_JUNGSUNG, 0x24 }, // 52, 0x34: VK_4 �� $
  406. { 18 | H_JUNGSUNG, 0x25 }, // 53, 0x35: VK_5 �� %
  407. { 3 | H_JUNGSUNG, 0x5E }, // 54, 0x36: VK_6 �� ^
  408. { 8 | H_JUNGSUNG, 0x26 }, // 55, 0x37: VK_7 �� &
  409. { 20 | H_JUNGSUNG, 0x2A }, // 56, 0x38: VK_8 �� *
  410. { 14 | H_JUNGSUNG | H_DOUBLE, 0x28 }, // 57, 0x39: VK_9
  411. { 0x00, 0x00 }, // 58, 0x3A:
  412. { 0x00, 0x00 }, // 59, 0x3B:
  413. { 0x00, 0x00 }, // 60, 0x3C:
  414. { 0x00, 0x00 }, // 61, 0x3D:
  415. { 0x00, 0x00 }, // 62, 0x3E:
  416. { 0x00, 0x00 }, // 63, 0x3F:
  417. { 0x00, 0x00 }, // 64, 0x40:
  418. { 21 | H_JONGSUNG, 7 | H_JONGSUNG}, // 65, 0x41: VK_A �� ��
  419. { 14 | H_JUNGSUNG | H_DOUBLE, 0x21 }, // 66, 0x42: VK_B �� !
  420. { 6 | H_JUNGSUNG, 10 | H_JONGSUNG}, // 67, 0x43: VK_C �� ����
  421. { 21 | H_JUNGSUNG, 9 | H_JONGSUNG}, // 68, 0x44: VK_D �� ����
  422. { 7 | H_JUNGSUNG, 24 | H_JONGSUNG}, // 69, 0x45: VK_E �� ��
  423. { 1 | H_JUNGSUNG, 2 | H_JONGSUNG}, // 70, 0x46: VK_F �� ��
  424. { 19 | H_JUNGSUNG | H_DOUBLE, 0x2F }, // 71, 0x47: VK_G �� /
  425. { 3 | H_CHOSUNG, 0x27 }, // 72, 0x48: VK_H �� ,
  426. { 7 | H_CHOSUNG, 0x38 }, // 73, 0x49: VK_I �� 8
  427. { 12 | H_CHOSUNG, 0x34 }, // 74, 0x4A: VK_J �� 4
  428. { 1 | H_CHOSUNG | H_DOUBLE, 0x35 }, // 75, 0x4B: VK_K �� 5
  429. { 13 | H_CHOSUNG | H_DOUBLE, 0x36 }, // 76, 0x4C: VK_L �� 6
  430. { 19 | H_CHOSUNG, 0x31 }, // 77, 0x4D: VK_M �� 1
  431. { 10 | H_CHOSUNG | H_DOUBLE, 0x30 }, // 78, 0x4E: VK_N �� 0
  432. { 15 | H_CHOSUNG, 0x39 }, // 79, 0x4F: VK_O �� 9
  433. { 18 | H_CHOSUNG, 0x3E }, // 80, 0x50: VK_P �� >
  434. { 19 | H_JONGSUNG | H_DOUBLE, 26 | H_JONGSUNG}, // 81, 0x51: VK_Q �� ��
  435. { 2 | H_JUNGSUNG, 4 | H_JUNGSUNG}, // 82, 0x52: VK_R �� ��
  436. { 4 | H_JONGSUNG | H_DOUBLE, 6 | H_JONGSUNG}, // 83, 0x53: VK_S �� ����
  437. { 5 | H_JUNGSUNG, 0x3B }, // 84, 0x54: VK_T �� ;
  438. { 4 | H_CHOSUNG | H_DOUBLE, 0x37 }, // 85, 0x55: VK_U �� 7
  439. { 9 | H_JUNGSUNG | H_DOUBLE, 15 | H_JONGSUNG }, // 86, 0x56: VK_V �� ����
  440. { 8 | H_JONGSUNG | H_DOUBLE, 25 | H_JONGSUNG}, // 87, 0x57: VK_W �� ��
  441. { 1 | H_JONGSUNG | H_DOUBLE, 18 | H_JONGSUNG }, // 88, 0x58: VK_X �� ����
  442. { 6 | H_CHOSUNG, 0x3C }, // 89, 0x59: VK_Y �� <
  443. { 16 | H_JONGSUNG, 23 | H_JONGSUNG }, // 90, 0x5A: VK_Z �� ��
  444. { 0x00, 0x00 }, // 91, 0x5B:
  445. { 0x00, 0x00 }, // 92, 0x5C:
  446. { 0x00, 0x00 }, // 93, 0x5D:
  447. { 0x00, 0x00 }, // 94, 0x5E:
  448. { 0x00, 0x00 }, // 95, 0x5F:
  449. { 0x30, 0x00 }, // 96, 0x60: VK_NUMPAD0
  450. { 0x31, 0x00 }, // 97, 0x61: VK_NUMPAD1
  451. { 0x32, 0x00 }, // 98, 0x62: VK_NUMPAD2
  452. { 0x33, 0x00 }, // 99, 0x63: VK_NUMPAD3
  453. { 0x34, 0x00 }, // 100, 0x64: VK_NUMPAD4
  454. { 0x35, 0x00 }, // 101, 0x65: VK_NUMPAD5
  455. { 0x36, 0x00 }, // 102, 0x66: VK_NUMPAD6
  456. { 0x37, 0x00 }, // 103, 0x67: VK_NUMPAD7
  457. { 0x38, 0x00 }, // 104, 0x68: VK_NUMPAD8
  458. { 0x39, 0x00 }, // 105, 0x69: VK_NUMPAD9
  459. { 0x2A, 0x2A }, // 106, 0x6A: VK_MULTIPLY
  460. { 0x2B, 0x2B }, // 107, 0x6B: VK_ADD
  461. { 0x00, 0x00 }, // 108, 0x6C: VK_SEPARATOR
  462. { 0x2D, 0x2D }, // 109, 0x6D: VK_SUBTRACT
  463. { 0x2E, 0x00 }, // 110, 0x6E: VK_DECIMAL
  464. { 0x2F, 0x2F }, // 111, 0x6F: VK_DIVIDE
  465. { 0x00, 0x00 }, // 112, 0x70: VK_F1
  466. { 0x00, 0x00 }, // 113, 0x71: VK_F2
  467. { 0x00, 0x00 }, // 114, 0x72: VK_F3
  468. { 0x00, 0x00 }, // 115, 0x73: VK_F4
  469. { 0x00, 0x00 }, // 116, 0x74: VK_F5
  470. { 0x00, 0x00 }, // 117, 0x75: VK_F6
  471. { 0x00, 0x00 }, // 118, 0x76: VK_F7
  472. { 0x00, 0x00 }, // 119, 0x77: VK_F8
  473. { 0x00, 0x00 }, // 120, 0x78: VK_F9
  474. { 0x00, 0x00 }, // 121, 0x79: VK_F10
  475. { 0x00, 0x00 }, // 122, 0x7A: VK_F11
  476. { 0x00, 0x00 }, // 123, 0x7B: VK_F12
  477. { 0x00, 0x00 }, // 124, 0x7C: VK_F13
  478. { 0x00, 0x00 }, // 125, 0x7D: VK_F14
  479. { 0x00, 0x00 }, // 126, 0x7E: VK_F15
  480. { 0x00, 0x00 }, // 127, 0x7F: VK_F16
  481. { 0x00, 0x00 }, // 128, 0x80: VK_F17
  482. { 0x00, 0x00 }, // 129, 0x81: VK_F18
  483. { 0x00, 0x00 }, // 130, 0x82: VK_F19
  484. { 0x00, 0x00 }, // 131, 0x83: VK_F20
  485. { 0x00, 0x00 }, // 132, 0x84: VK_F21
  486. { 0x00, 0x00 }, // 133, 0x85: VK_F22
  487. { 0x00, 0x00 }, // 134, 0x86: VK_F23
  488. { 0x00, 0x00 }, // 135, 0x87: VK_F24
  489. { 0x00, 0x00 }, // 136, 0x88:
  490. { 0x00, 0x00 }, // 137, 0x89:
  491. { 0x00, 0x00 }, // 138, 0x8A:
  492. { 0x00, 0x00 }, // 139, 0x8B:
  493. { 0x00, 0x00 }, // 140, 0x8C:
  494. { 0x00, 0x00 }, // 141, 0x8D:
  495. { 0x00, 0x00 }, // 142, 0x8E:
  496. { 0x00, 0x00 }, // 143, 0x8F:
  497. { 0x00, 0x00 }, // 144, 0x90: VK_NUMLOCK
  498. { 0x00, 0x00 }, // 145, 0x91: VK_SCROLL
  499. { 0x00, 0x00 }, // 146, 0x92:
  500. { 0x00, 0x00 }, // 147, 0x93:
  501. { 0x00, 0x00 }, // 148, 0x94:
  502. { 0x00, 0x00 }, // 149, 0x95:
  503. { 0x00, 0x00 }, // 150, 0x96:
  504. { 0x00, 0x00 }, // 151, 0x97:
  505. { 0x00, 0x00 }, // 152, 0x98:
  506. { 0x00, 0x00 }, // 153, 0x99:
  507. { 0x00, 0x00 }, // 154, 0x9A:
  508. { 0x00, 0x00 }, // 155, 0x9B:
  509. { 0x00, 0x00 }, // 156, 0x9C:
  510. { 0x00, 0x00 }, // 157, 0x9D:
  511. { 0x00, 0x00 }, // 158, 0x9E:
  512. { 0x00, 0x00 }, // 159, 0x9F:
  513. { 0x00, 0x00 }, // 160, 0xA0:
  514. { 0x00, 0x00 }, // 161, 0xA1:
  515. { 0x00, 0x00 }, // 162, 0xA2:
  516. { 0x00, 0x00 }, // 163, 0xA3:
  517. { 0x00, 0x00 }, // 164, 0xA4:
  518. { 0x00, 0x00 }, // 165, 0xA5:
  519. { 0x00, 0x00 }, // 166, 0xA6:
  520. { 0x00, 0x00 }, // 167, 0xA7:
  521. { 0x00, 0x00 }, // 168, 0xA8:
  522. { 0x00, 0x00 }, // 169, 0xA9:
  523. { 0x00, 0x00 }, // 170, 0xAA:
  524. { 0x00, 0x00 }, // 171, 0xAB:
  525. { 0x00, 0x00 }, // 172, 0xAC:
  526. { 0x00, 0x00 }, // 173, 0xAD:
  527. { 0x00, 0x00 }, // 174, 0xAE:
  528. { 0x00, 0x00 }, // 175, 0xAF:
  529. { 0x00, 0x00 }, // 176, 0xB0:
  530. { 0x00, 0x00 }, // 177, 0xB1:
  531. { 0x00, 0x00 }, // 178, 0xB2:
  532. { 0x00, 0x00 }, // 179, 0xB3:
  533. { 0x00, 0x00 }, // 180, 0xB4:
  534. { 0x00, 0x00 }, // 181, 0xB5:
  535. { 0x00, 0x00 }, // 182, 0xB6:
  536. { 0x00, 0x00 }, // 183, 0xB7:
  537. { 0x00, 0x00 }, // 184, 0xB8:
  538. { 0x00, 0x00 }, // 185, 0xB9:
  539. { 8 | H_CHOSUNG | H_DOUBLE, 0x3A }, // 186, 0xBA: �� :
  540. { 0x3D, 0x2B }, // 187, 0xBB:
  541. { 0x2C, 0x32 }, // 188, 0xBC: , 2
  542. { 0x2D, 0x5F }, // 189, 0xBD:
  543. { 0x2E, 0x33 }, // 190, 0xBE: . 3
  544. { 9 | H_JUNGSUNG | H_DOUBLE, 0x3F }, // 191, 0xBF: �� ?
  545. { 0x60, 0x7E }, // 192, 0xC0:
  546. { 0x00, 0x00 }, // 193, 0xC1:
  547. { 0x00, 0x00 }, // 194, 0xC2:
  548. { 0x00, 0x00 }, // 195, 0xC3:
  549. { 0x00, 0x00 }, // 196, 0xC4:
  550. { 0x00, 0x00 }, // 197, 0xC5:
  551. { 0x00, 0x00 }, // 198, 0xC6:
  552. { 0x00, 0x00 }, // 199, 0xC7:
  553. { 0x00, 0x00 }, // 200, 0xC8:
  554. { 0x00, 0x00 }, // 201, 0xC9:
  555. { 0x00, 0x00 }, // 202, 0xCA:
  556. { 0x00, 0x00 }, // 203, 0xCB:
  557. { 0x00, 0x00 }, // 204, 0xCC:
  558. { 0x00, 0x00 }, // 205, 0xCD:
  559. { 0x00, 0x00 }, // 206, 0xCE:
  560. { 0x00, 0x00 }, // 207, 0xCF:
  561. { 0x00, 0x00 }, // 208, 0xD0:
  562. { 0x00, 0x00 }, // 209, 0xD1:
  563. { 0x00, 0x00 }, // 210, 0xD2:
  564. { 0x00, 0x00 }, // 211, 0xD3:
  565. { 0x00, 0x00 }, // 212, 0xD4:
  566. { 0x00, 0x00 }, // 213, 0xD5:
  567. { 0x00, 0x00 }, // 214, 0xD6:
  568. { 0x00, 0x00 }, // 215, 0xD7:
  569. { 0x00, 0x00 }, // 216, 0xD8:
  570. { 0x00, 0x00 }, // 217, 0xD9:
  571. { 0x00, 0x00 }, // 218, 0xDA:
  572. { 0x5B, 0x7B }, // 219, 0xDB: [ {
  573. { 0x5C, 0x7C }, // 220, 0xDC: \ |
  574. { 0x5D, 0x7D }, // 221, 0xDD: ] }
  575. { 17 | H_CHOSUNG, 0x22 }, // 222, 0xDE: �� "
  576. { 0x00, 0x00 }, // 223, 0xDF:
  577. { 0x00, 0x00 }, // 224, 0xE0:
  578. { 0x00, 0x00 }, // 225, 0xE1:
  579. { 0x00, 0x00 }, // 226, 0xE2:
  580. { 0x00, 0x00 }, // 227, 0xE3:
  581. { 0x00, 0x00 }, // 228, 0xE4:
  582. { 0x00, 0x00 }, // 229, 0xE5:
  583. { 0x00, 0x00 }, // 230, 0xE6:
  584. { 0x00, 0x00 }, // 231, 0xE7:
  585. { 0x00, 0x00 }, // 232, 0xE8:
  586. { 0x00, 0x00 }, // 233, 0xE9:
  587. { 0x00, 0x00 }, // 234, 0xEA:
  588. { 0x00, 0x00 }, // 235, 0xEB:
  589. { 0x00, 0x00 }, // 236, 0xEC:
  590. { 0x00, 0x00 }, // 237, 0xED:
  591. { 0x00, 0x00 }, // 238, 0xEE:
  592. { 0x00, 0x00 }, // 239, 0xEF:
  593. { 0x00, 0x00 }, // 240, 0xF0:
  594. { 0x00, 0x00 }, // 241, 0xF1:
  595. { 0x00, 0x00 }, // 242, 0xF2:
  596. { 0x00, 0x00 }, // 243, 0xF3:
  597. { 0x00, 0x00 }, // 244, 0xF4:
  598. { 0x00, 0x00 }, // 245, 0xF5:
  599. { 0x00, 0x00 }, // 246, 0xF6:
  600. { 0x00, 0x00 }, // 247, 0xF7:
  601. { 0x00, 0x00 }, // 248, 0xF8:
  602. { 0x00, 0x00 }, // 249, 0xF9:
  603. { 0x00, 0x00 }, // 250, 0xFA:
  604. { 0x00, 0x00 }, // 251, 0xFB:
  605. { 0x00, 0x00 }, // 252, 0xFC:
  606. { 0x00, 0x00 }, // 253, 0xFD:
  607. { 0x00, 0x00 }, // 254, 0xFE:
  608. { 0x00, 0x00 } // 255, 0xFF:
  609. };
  610. WORD CHangulAutomata3Final::wHTable[256][2] =
  611. {
  612. // 3 BeolSik
  613. { 0x00, 0x00 }, // 0, 0x00:
  614. { 0x00, 0x00 }, // 1, 0x01: VK_LBUTTON
  615. { 0x00, 0x00 }, // 2, 0x02: VK_RBUTTON
  616. { 0x00, 0x00 }, // 3, 0x03: VK_CANCEL
  617. { 0x00, 0x00 }, // 4, 0x04: VK_MBUTTON
  618. { 0x00, 0x00 }, // 5, 0x05:
  619. { 0x00, 0x00 }, // 6, 0x06:
  620. { 0x00, 0x00 }, // 7, 0x07:
  621. { 0x00, 0x00 }, // 8, 0x08: VK_BACK
  622. { 0x00, 0x00 }, // 9, 0x09: VK_TAB
  623. { 0x00, 0x00 }, // 10, 0x0A:
  624. { 0x00, 0x00 }, // 11, 0x0B:
  625. { 0x00, 0x00 }, // 12, 0x0C: VK_CLEAR
  626. { 0x00, 0x00 }, // 13, 0x0D: VK_RETURN
  627. { 0x00, 0x00 }, // 14, 0x0E:
  628. { 0x00, 0x00 }, // 15, 0x0F:
  629. { 0x00, 0x00 }, // 16, 0x10: VK_SHIFT
  630. { 0x00, 0x00 }, // 17, 0x11: VK_CONTROL
  631. { 0x00, 0x00 }, // 18, 0x12: VK_MENU
  632. { 0x00, 0x00 }, // 19, 0x13: VK_PAUSE
  633. { 0x00, 0x00 }, // 20, 0x14: VK_CAPITAL
  634. { 0x00, 0x00 }, // 21, 0x15: VK_HANGUL
  635. { 0x00, 0x00 }, // 22, 0x16:
  636. { 0x00, 0x00 }, // 23, 0x17: VK_JUNJA
  637. { 0x00, 0x00 }, // 24, 0x18:
  638. { 0x00, 0x00 }, // 25, 0x19: VK_HANJA
  639. { 0x00, 0x00 }, // 26, 0x1A:
  640. { 0x00, 0x00 }, // 27, 0x1B: VK_ESCAPE
  641. { 0x00, 0x00 }, // 28, 0x1C:
  642. { 0x00, 0x00 }, // 29, 0x1D:
  643. { 0x00, 0x00 }, // 30, 0x1E:
  644. { 0x00, 0x00 }, // 31, 0x1F:
  645. { 0x20, 0x20 }, // 32, 0x20: VK_SPACE
  646. { 0x00, 0x00 }, // 33, 0x21: VK_PRIOR
  647. { 0x00, 0x00 }, // 34, 0x22: VK_NEXT
  648. { 0x00, 0x00 }, // 35, 0x23: VK_END
  649. { 0x00, 0x00 }, // 36, 0x24: VK_HOME
  650. { 0x00, 0x00 }, // 37, 0x25: VK_LEFT
  651. { 0x00, 0x00 }, // 38, 0x26: VK_UP
  652. { 0x00, 0x00 }, // 39, 0x27: VK_RIGHT
  653. { 0x00, 0x00 }, // 40, 0x28: VK_DOWN
  654. { 0x00, 0x00 }, // 41, 0x29: VK_SELECT
  655. { 0x00, 0x00 }, // 42, 0x2A: VK_PRINT
  656. { 0x00, 0x00 }, // 43, 0x2B: VK_EXECUTE
  657. { 0x00, 0x00 }, // 44, 0x2C: VK_SNAPSHOT
  658. { 0x00, 0x00 }, // 45, 0x2D: VK_INSERT
  659. { 0x00, 0x00 }, // 46, 0x2E: VK_DELETE
  660. { 0x00, 0x00 }, // 47, 0x2F: VK_HELP
  661. { 16 | H_CHOSUNG, 0x7E }, // 48, 0x30: VK_0 �� ~
  662. { 27 | H_JONGSUNG, 2 | H_JONGSUNG }, // 49, 0x31: VK_1 �� ��
  663. { 20 | H_JONGSUNG, 9 | H_JONGSUNG }, // 50, 0x32: VK_2 �� ��
  664. { 17 | H_JONGSUNG|H_DOUBLE, 22 | H_JONGSUNG }, // 51, 0x33: VK_3 �� ��
  665. { 13 | H_JUNGSUNG, 14 | H_JONGSUNG }, // 52, 0x34: VK_4 �� ��
  666. { 18 | H_JUNGSUNG, 13 | H_JONGSUNG }, // 53, 0x35: VK_5 �� ��
  667. { 3 | H_JUNGSUNG, 0x3D }, // 54, 0x36: VK_6 �� =
  668. { 8 | H_JUNGSUNG, 0x22 }, // 55, 0x37: VK_7 �� "
  669. { 20 | H_JUNGSUNG, 0x22 }, // 56, 0x38: VK_8 �� "
  670. { 14 | H_JUNGSUNG | H_DOUBLE, 0x27 }, // 57, 0x39: VK_9 �� '
  671. { 0x00, 0x00 }, // 58, 0x3A:
  672. { 0x00, 0x00 }, // 59, 0x3B:
  673. { 0x00, 0x00 }, // 60, 0x3C:
  674. { 0x00, 0x00 }, // 61, 0x3D:
  675. { 0x00, 0x00 }, // 62, 0x3E:
  676. { 0x00, 0x00 }, // 63, 0x3F:
  677. { 0x00, 0x00 }, // 64, 0x40:
  678. { 21 | H_JONGSUNG, 7 | H_JONGSUNG}, // 65, 0x41: VK_A �� ��
  679. { 14 | H_JUNGSUNG | H_DOUBLE, 0x3F }, // 66, 0x42: VK_B �� ?
  680. { 6 | H_JUNGSUNG, 24 | H_JONGSUNG}, // 67, 0x43: VK_C �� ��
  681. { 21 | H_JUNGSUNG, 11 | H_JONGSUNG}, // 68, 0x44: VK_D �� ��
  682. { 7 | H_JUNGSUNG, 5 | H_JONGSUNG}, // 69, 0x45: VK_E �� ��
  683. { 1 | H_JUNGSUNG, 10 | H_JONGSUNG}, // 70, 0x46: VK_F �� ��
  684. { 19 | H_JUNGSUNG | H_DOUBLE, 4 | H_JUNGSUNG }, // 71, 0x47: VK_G �� ��
  685. { 3 | H_CHOSUNG, 0x30 }, // 72, 0x48: VK_H �� 0
  686. { 7 | H_CHOSUNG, 0x37 }, // 73, 0x49: VK_I �� 7
  687. { 12 | H_CHOSUNG, 0x31 }, // 74, 0x4A: VK_J �� 1
  688. { 1 | H_CHOSUNG | H_DOUBLE, 0x32 }, // 75, 0x4B: VK_K �� 2
  689. { 13 | H_CHOSUNG | H_DOUBLE, 0x33 }, // 76, 0x4C: VK_L �� 3
  690. { 19 | H_CHOSUNG, 0x22}, // 77, 0x4D: VK_M �� "
  691. { 10 | H_CHOSUNG | H_DOUBLE, 0x2D }, // 78, 0x4E: VK_N �� -
  692. { 15 | H_CHOSUNG, 0x38 }, // 79, 0x4F: VK_O �� 8
  693. { 18 | H_CHOSUNG, 0x39 }, // 80, 0x50: VK_P �� 9
  694. { 19 | H_JONGSUNG | H_DOUBLE, 26 | H_JONGSUNG}, // 81, 0x51: VK_Q �� ��
  695. { 2 | H_JUNGSUNG, 15 | H_JONGSUNG}, // 82, 0x52: VK_R �� ��
  696. { 4 | H_JONGSUNG | H_DOUBLE, 6 | H_JONGSUNG}, // 83, 0x53: VK_S �� ����
  697. { 5 | H_JUNGSUNG, 12 | H_JONGSUNG }, // 84, 0x54: VK_T �� ��
  698. { 4 | H_CHOSUNG | H_DOUBLE, 0x36 }, // 85, 0x55: VK_U �� 6
  699. { 9 | H_JUNGSUNG | H_DOUBLE, 3 | H_JONGSUNG }, // 86, 0x56: VK_V �� ��
  700. { 8 | H_JONGSUNG | H_DOUBLE, 25 | H_JONGSUNG}, // 87, 0x57: VK_W �� ��
  701. { 1 | H_JONGSUNG | H_DOUBLE, 18 | H_JONGSUNG }, // 88, 0x58: VK_X �� ����
  702. { 6 | H_CHOSUNG, 0x35 }, // 89, 0x59: VK_Y �� 5
  703. { 16 | H_JONGSUNG, 23 | H_JONGSUNG }, // 90, 0x5A: VK_Z �� ��
  704. { 0x00, 0x00 }, // 91, 0x5B:
  705. { 0x00, 0x00 }, // 92, 0x5C:
  706. { 0x00, 0x00 }, // 93, 0x5D:
  707. { 0x00, 0x00 }, // 94, 0x5E:
  708. { 0x00, 0x00 }, // 95, 0x5F:
  709. { 0x30, 0x00 }, // 96, 0x60: VK_NUMPAD0
  710. { 0x31, 0x00 }, // 97, 0x61: VK_NUMPAD1
  711. { 0x32, 0x00 }, // 98, 0x62: VK_NUMPAD2
  712. { 0x33, 0x00 }, // 99, 0x63: VK_NUMPAD3
  713. { 0x34, 0x00 }, // 100, 0x64: VK_NUMPAD4
  714. { 0x35, 0x00 }, // 101, 0x65: VK_NUMPAD5
  715. { 0x36, 0x00 }, // 102, 0x66: VK_NUMPAD6
  716. { 0x37, 0x00 }, // 103, 0x67: VK_NUMPAD7
  717. { 0x38, 0x00 }, // 104, 0x68: VK_NUMPAD8
  718. { 0x39, 0x00 }, // 105, 0x69: VK_NUMPAD9
  719. { 0x2A, 0x2A }, // 106, 0x6A: VK_MULTIPLY
  720. { 0x2B, 0x2B }, // 107, 0x6B: VK_ADD
  721. { 0x00, 0x00 }, // 108, 0x6C: VK_SEPARATOR
  722. { 0x2D, 0x2D }, // 109, 0x6D: VK_SUBTRACT
  723. { 0x2E, 0x00 }, // 110, 0x6E: VK_DECIMAL
  724. { 0x2F, 0x2F }, // 111, 0x6F: VK_DIVIDE
  725. { 0x00, 0x00 }, // 112, 0x70: VK_F1
  726. { 0x00, 0x00 }, // 113, 0x71: VK_F2
  727. { 0x00, 0x00 }, // 114, 0x72: VK_F3
  728. { 0x00, 0x00 }, // 115, 0x73: VK_F4
  729. { 0x00, 0x00 }, // 116, 0x74: VK_F5
  730. { 0x00, 0x00 }, // 117, 0x75: VK_F6
  731. { 0x00, 0x00 }, // 118, 0x76: VK_F7
  732. { 0x00, 0x00 }, // 119, 0x77: VK_F8
  733. { 0x00, 0x00 }, // 120, 0x78: VK_F9
  734. { 0x00, 0x00 }, // 121, 0x79: VK_F10
  735. { 0x00, 0x00 }, // 122, 0x7A: VK_F11
  736. { 0x00, 0x00 }, // 123, 0x7B: VK_F12
  737. { 0x00, 0x00 }, // 124, 0x7C: VK_F13
  738. { 0x00, 0x00 }, // 125, 0x7D: VK_F14
  739. { 0x00, 0x00 }, // 126, 0x7E: VK_F15
  740. { 0x00, 0x00 }, // 127, 0x7F: VK_F16
  741. { 0x00, 0x00 }, // 128, 0x80: VK_F17
  742. { 0x00, 0x00 }, // 129, 0x81: VK_F18
  743. { 0x00, 0x00 }, // 130, 0x82: VK_F19
  744. { 0x00, 0x00 }, // 131, 0x83: VK_F20
  745. { 0x00, 0x00 }, // 132, 0x84: VK_F21
  746. { 0x00, 0x00 }, // 133, 0x85: VK_F22
  747. { 0x00, 0x00 }, // 134, 0x86: VK_F23
  748. { 0x00, 0x00 }, // 135, 0x87: VK_F24
  749. { 0x00, 0x00 }, // 136, 0x88:
  750. { 0x00, 0x00 }, // 137, 0x89:
  751. { 0x00, 0x00 }, // 138, 0x8A:
  752. { 0x00, 0x00 }, // 139, 0x8B:
  753. { 0x00, 0x00 }, // 140, 0x8C:
  754. { 0x00, 0x00 }, // 141, 0x8D:
  755. { 0x00, 0x00 }, // 142, 0x8E:
  756. { 0x00, 0x00 }, // 143, 0x8F:
  757. { 0x00, 0x00 }, // 144, 0x90: VK_NUMLOCK
  758. { 0x00, 0x00 }, // 145, 0x91: VK_SCROLL
  759. { 0x00, 0x00 }, // 146, 0x92:
  760. { 0x00, 0x00 }, // 147, 0x93:
  761. { 0x00, 0x00 }, // 148, 0x94:
  762. { 0x00, 0x00 }, // 149, 0x95:
  763. { 0x00, 0x00 }, // 150, 0x96:
  764. { 0x00, 0x00 }, // 151, 0x97:
  765. { 0x00, 0x00 }, // 152, 0x98:
  766. { 0x00, 0x00 }, // 153, 0x99:
  767. { 0x00, 0x00 }, // 154, 0x9A:
  768. { 0x00, 0x00 }, // 155, 0x9B:
  769. { 0x00, 0x00 }, // 156, 0x9C:
  770. { 0x00, 0x00 }, // 157, 0x9D:
  771. { 0x00, 0x00 }, // 158, 0x9E:
  772. { 0x00, 0x00 }, // 159, 0x9F:
  773. { 0x00, 0x00 }, // 160, 0xA0:
  774. { 0x00, 0x00 }, // 161, 0xA1:
  775. { 0x00, 0x00 }, // 162, 0xA2:
  776. { 0x00, 0x00 }, // 163, 0xA3:
  777. { 0x00, 0x00 }, // 164, 0xA4:
  778. { 0x00, 0x00 }, // 165, 0xA5:
  779. { 0x00, 0x00 }, // 166, 0xA6:
  780. { 0x00, 0x00 }, // 167, 0xA7:
  781. { 0x00, 0x00 }, // 168, 0xA8:
  782. { 0x00, 0x00 }, // 169, 0xA9:
  783. { 0x00, 0x00 }, // 170, 0xAA:
  784. { 0x00, 0x00 }, // 171, 0xAB:
  785. { 0x00, 0x00 }, // 172, 0xAC:
  786. { 0x00, 0x00 }, // 173, 0xAD:
  787. { 0x00, 0x00 }, // 174, 0xAE:
  788. { 0x00, 0x00 }, // 175, 0xAF:
  789. { 0x00, 0x00 }, // 176, 0xB0:
  790. { 0x00, 0x00 }, // 177, 0xB1:
  791. { 0x00, 0x00 }, // 178, 0xB2:
  792. { 0x00, 0x00 }, // 179, 0xB3:
  793. { 0x00, 0x00 }, // 180, 0xB4:
  794. { 0x00, 0x00 }, // 181, 0xB5:
  795. { 0x00, 0x00 }, // 182, 0xB6:
  796. { 0x00, 0x00 }, // 183, 0xB7:
  797. { 0x00, 0x00 }, // 184, 0xB8:
  798. { 0x00, 0x00 }, // 185, 0xB9:
  799. { 8 | H_CHOSUNG | H_DOUBLE, 0x34 }, // 186, 0xBA: �� 4
  800. { 0x3E, 0x2B }, // 187, 0xBB: > +
  801. { 0x2C, 0x2C }, // 188, 0xBC: , ,
  802. { 0x29, 0x3B }, // 189, 0xBD: ) ;
  803. { 0x2E, 0x2E }, // 190, 0xBE: . .
  804. { 9 | H_JUNGSUNG | H_DOUBLE, 0x21 }, // 191, 0xBF: �� !
  805. { 0x60, 0x7E }, // 192, 0xC0:
  806. { 0x00, 0x00 }, // 193, 0xC1:
  807. { 0x00, 0x00 }, // 194, 0xC2:
  808. { 0x00, 0x00 }, // 195, 0xC3:
  809. { 0x00, 0x00 }, // 196, 0xC4:
  810. { 0x00, 0x00 }, // 197, 0xC5:
  811. { 0x00, 0x00 }, // 198, 0xC6:
  812. { 0x00, 0x00 }, // 199, 0xC7:
  813. { 0x00, 0x00 }, // 200, 0xC8:
  814. { 0x00, 0x00 }, // 201, 0xC9:
  815. { 0x00, 0x00 }, // 202, 0xCA:
  816. { 0x00, 0x00 }, // 203, 0xCB:
  817. { 0x00, 0x00 }, // 204, 0xCC:
  818. { 0x00, 0x00 }, // 205, 0xCD:
  819. { 0x00, 0x00 }, // 206, 0xCE:
  820. { 0x00, 0x00 }, // 207, 0xCF:
  821. { 0x00, 0x00 }, // 208, 0xD0:
  822. { 0x00, 0x00 }, // 209, 0xD1:
  823. { 0x00, 0x00 }, // 210, 0xD2:
  824. { 0x00, 0x00 }, // 211, 0xD3:
  825. { 0x00, 0x00 }, // 212, 0xD4:
  826. { 0x00, 0x00 }, // 213, 0xD5:
  827. { 0x00, 0x00 }, // 214, 0xD6:
  828. { 0x00, 0x00 }, // 215, 0xD7:
  829. { 0x00, 0x00 }, // 216, 0xD8:
  830. { 0x00, 0x00 }, // 217, 0xD9:
  831. { 0x00, 0x00 }, // 218, 0xDA:
  832. { 0x28, 0x25 }, // 219, 0xDB: ( %
  833. { 0x3A, 0x5C }, // 220, 0xDC: : '\'
  834. { 0x3C, 0x2F }, // 221, 0xDD: < /
  835. { 17 | H_CHOSUNG, 0x00 }, // 222, 0xDE: ��
  836. { 0x00, 0x00 }, // 223, 0xDF:
  837. { 0x00, 0x00 }, // 224, 0xE0:
  838. { 0x00, 0x00 }, // 225, 0xE1:
  839. { 0x00, 0x00 }, // 226, 0xE2:
  840. { 0x00, 0x00 }, // 227, 0xE3:
  841. { 0x00, 0x00 }, // 228, 0xE4:
  842. { 0x00, 0x00 }, // 229, 0xE5:
  843. { 0x00, 0x00 }, // 230, 0xE6:
  844. { 0x00, 0x00 }, // 231, 0xE7:
  845. { 0x00, 0x00 }, // 232, 0xE8:
  846. { 0x00, 0x00 }, // 233, 0xE9:
  847. { 0x00, 0x00 }, // 234, 0xEA:
  848. { 0x00, 0x00 }, // 235, 0xEB:
  849. { 0x00, 0x00 }, // 236, 0xEC:
  850. { 0x00, 0x00 }, // 237, 0xED:
  851. { 0x00, 0x00 }, // 238, 0xEE:
  852. { 0x00, 0x00 }, // 239, 0xEF:
  853. { 0x00, 0x00 }, // 240, 0xF0:
  854. { 0x00, 0x00 }, // 241, 0xF1:
  855. { 0x00, 0x00 }, // 242, 0xF2:
  856. { 0x00, 0x00 }, // 243, 0xF3:
  857. { 0x00, 0x00 }, // 244, 0xF4:
  858. { 0x00, 0x00 }, // 245, 0xF5:
  859. { 0x00, 0x00 }, // 246, 0xF6:
  860. { 0x00, 0x00 }, // 247, 0xF7:
  861. { 0x00, 0x00 }, // 248, 0xF8:
  862. { 0x00, 0x00 }, // 249, 0xF9:
  863. { 0x00, 0x00 }, // 250, 0xFA:
  864. { 0x00, 0x00 }, // 251, 0xFB:
  865. { 0x00, 0x00 }, // 252, 0xFC:
  866. { 0x00, 0x00 }, // 253, 0xFD:
  867. { 0x00, 0x00 }, // 254, 0xFE:
  868. { 0x00, 0x00 } // 255, 0xFF:
  869. };
  870. const
  871. BYTE CHangulAutomata::bETable[256][2] =
  872. {
  873. // English normal, English shift for Junja(Full shape) mode
  874. { 0x00, 0x00 }, // 0, 0x00:
  875. { 0x00, 0x00 }, // 1, 0x01: VK_LBUTTON
  876. { 0x00, 0x00 }, // 2, 0x02: VK_RBUTTON
  877. { 0x00, 0x00 }, // 3, 0x03: VK_CANCEL
  878. { 0x00, 0x00 }, // 4, 0x04: VK_MBUTTON
  879. { 0x00, 0x00 }, // 5, 0x05:
  880. { 0x00, 0x00 }, // 6, 0x06:
  881. { 0x00, 0x00 }, // 7, 0x07:
  882. { 0x00, 0x00 }, // 8, 0x08: VK_BACK
  883. { 0x00, 0x00 }, // 9, 0x09: VK_TAB
  884. { 0x00, 0x00 }, // 10, 0x0A:
  885. { 0x00, 0x00 }, // 11, 0x0B:
  886. { 0x00, 0x00 }, // 12, 0x0C: VK_CLEAR
  887. { 0x00, 0x00 }, // 13, 0x0D: VK_RETURN
  888. { 0x00, 0x00 }, // 14, 0x0E:
  889. { 0x00, 0x00 }, // 15, 0x0F:
  890. { 0x00, 0x00 }, // 16, 0x10: VK_SHIFT
  891. { 0x00, 0x00 }, // 17, 0x11: VK_CONTROL
  892. { 0x00, 0x00 }, // 18, 0x12: VK_MENU
  893. { 0x00, 0x00 }, // 19, 0x13: VK_PAUSE
  894. { 0x00, 0x00 }, // 20, 0x14: VK_CAPITAL
  895. { 0x00, 0x00 }, // 21, 0x15: VK_HANGUL
  896. { 0x00, 0x00 }, // 22, 0x16:
  897. { 0x00, 0x00 }, // 23, 0x17: VK_JUNJA
  898. { 0x00, 0x00 }, // 24, 0x18:
  899. { 0x00, 0x00 }, // 25, 0x19: VK_HANJA
  900. { 0x00, 0x00 }, // 26, 0x1A:
  901. { 0x00, 0x00 }, // 27, 0x1B: VK_ESCAPE
  902. { 0x00, 0x00 }, // 28, 0x1C:
  903. { 0x00, 0x00 }, // 29, 0x1D:
  904. { 0x00, 0x00 }, // 30, 0x1E:
  905. { 0x00, 0x00 }, // 31, 0x1F:
  906. { 0x20, 0x20 }, // 32, 0x20: VK_SPACE
  907. { 0x00, 0x00 }, // 33, 0x21: VK_PRIOR
  908. { 0x00, 0x00 }, // 34, 0x22: VK_NEXT
  909. { 0x00, 0x00 }, // 35, 0x23: VK_END
  910. { 0x00, 0x00 }, // 36, 0x24: VK_HOME
  911. { 0x00, 0x00 }, // 37, 0x25: VK_LEFT
  912. { 0x00, 0x00 }, // 38, 0x26: VK_UP
  913. { 0x00, 0x00 }, // 39, 0x27: VK_RIGHT
  914. { 0x00, 0x00 }, // 40, 0x28: VK_DOWN
  915. { 0x00, 0x00 }, // 41, 0x29: VK_SELECT
  916. { 0x00, 0x00 }, // 42, 0x2A: VK_PRINT
  917. { 0x00, 0x00 }, // 43, 0x2B: VK_EXECUTE
  918. { 0x00, 0x00 }, // 44, 0x2C: VK_SNAPSHOT
  919. { 0x00, 0x00 }, // 45, 0x2D: VK_INSERT
  920. { 0x00, 0x00 }, // 46, 0x2E: VK_DELETE
  921. { 0x00, 0x00 }, // 47, 0x2F: VK_HELP
  922. { 0x30, 0x29 }, // 48, 0x30: VK_0
  923. { 0x31, 0x21 }, // 49, 0x31: VK_1
  924. { 0x32, 0x40 }, // 50, 0x32: VK_2
  925. { 0x33, 0x23 }, // 51, 0x33: VK_3
  926. { 0x34, 0x24 }, // 52, 0x34: VK_4
  927. { 0x35, 0x25 }, // 53, 0x35: VK_5
  928. { 0x36, 0x5E }, // 54, 0x36: VK_6
  929. { 0x37, 0x26 }, // 55, 0x37: VK_7
  930. { 0x38, 0x2A }, // 56, 0x38: VK_8
  931. { 0x39, 0x28 }, // 57, 0x39: VK_9
  932. { 0x00, 0x00 }, // 58, 0x3A:
  933. { 0x00, 0x00 }, // 59, 0x3B:
  934. { 0x00, 0x00 }, // 60, 0x3C:
  935. { 0x00, 0x00 }, // 61, 0x3D:
  936. { 0x00, 0x00 }, // 62, 0x3E:
  937. { 0x00, 0x00 }, // 63, 0x3F:
  938. { 0x00, 0x00 }, // 64, 0x40:
  939. { 0x61, 0x41 }, // 65, 0x41: VK_A
  940. { 0x62, 0x42 }, // 66, 0x42: VK_B
  941. { 0x63, 0x43 }, // 67, 0x43: VK_C
  942. { 0x64, 0x44 }, // 68, 0x44: VK_D
  943. { 0x65, 0x45 }, // 69, 0x45: VK_E
  944. { 0x66, 0x46 }, // 70, 0x46: VK_F
  945. { 0x67, 0x47 }, // 71, 0x47: VK_G
  946. { 0x68, 0x48 }, // 72, 0x48: VK_H
  947. { 0x69, 0x49 }, // 73, 0x49: VK_I
  948. { 0x6A, 0x4A }, // 74, 0x4A: VK_J
  949. { 0x6B, 0x4B }, // 75, 0x4B: VK_K
  950. { 0x6C, 0x4C }, // 76, 0x4C: VK_L
  951. { 0x6D, 0x4D }, // 77, 0x4D: VK_M
  952. { 0x6E, 0x4E }, // 78, 0x4E: VK_N
  953. { 0x6F, 0x4F }, // 79, 0x4F: VK_O
  954. { 0x70, 0x50 }, // 80, 0x50: VK_P
  955. { 0x71, 0x51 }, // 81, 0x51: VK_Q
  956. { 0x72, 0x52 }, // 82, 0x52: VK_R
  957. { 0x73, 0x53 }, // 83, 0x53: VK_S
  958. { 0x74, 0x54 }, // 84, 0x54: VK_T
  959. { 0x75, 0x55 }, // 85, 0x55: VK_U
  960. { 0x76, 0x56 }, // 86, 0x56: VK_V
  961. { 0x77, 0x57 }, // 87, 0x57: VK_W
  962. { 0x78, 0x58 }, // 88, 0x58: VK_X
  963. { 0x79, 0x59 }, // 89, 0x59: VK_Y
  964. { 0x7A, 0x5A }, // 90, 0x5A: VK_Z
  965. { 0x00, 0x00 }, // 91, 0x5B:
  966. { 0x00, 0x00 }, // 92, 0x5C:
  967. { 0x00, 0x00 }, // 93, 0x5D:
  968. { 0x00, 0x00 }, // 94, 0x5E:
  969. { 0x00, 0x00 }, // 95, 0x5F:
  970. { 0x30, 0x00 }, // 96, 0x60: VK_NUMPAD0
  971. { 0x31, 0x00 }, // 97, 0x61: VK_NUMPAD1
  972. { 0x32, 0x00 }, // 98, 0x62: VK_NUMPAD2
  973. { 0x33, 0x00 }, // 99, 0x63: VK_NUMPAD3
  974. { 0x34, 0x00 }, // 100, 0x64: VK_NUMPAD4
  975. { 0x35, 0x00 }, // 101, 0x65: VK_NUMPAD5
  976. { 0x36, 0x00 }, // 102, 0x66: VK_NUMPAD6
  977. { 0x37, 0x00 }, // 103, 0x67: VK_NUMPAD7
  978. { 0x38, 0x00 }, // 104, 0x68: VK_NUMPAD8
  979. { 0x39, 0x00 }, // 105, 0x69: VK_NUMPAD9
  980. { 0x2A, 0x2A }, // 106, 0x6A: VK_MULTIPLY
  981. { 0x2B, 0x2B }, // 107, 0x6B: VK_ADD
  982. { 0x00, 0x00 }, // 108, 0x6C: VK_SEPARATOR
  983. { 0x2D, 0x2D }, // 109, 0x6D: VK_SUBTRACT
  984. { 0x2E, 0x00 }, // 110, 0x6E: VK_DECIMAL
  985. { 0x2F, 0x2F }, // 111, 0x6F: VK_DIVIDE
  986. { 0x00, 0x00 }, // 112, 0x70: VK_F1
  987. { 0x00, 0x00 }, // 113, 0x71: VK_F2
  988. { 0x00, 0x00 }, // 114, 0x72: VK_F3
  989. { 0x00, 0x00 }, // 115, 0x73: VK_F4
  990. { 0x00, 0x00 }, // 116, 0x74: VK_F5
  991. { 0x00, 0x00 }, // 117, 0x75: VK_F6
  992. { 0x00, 0x00 }, // 118, 0x76: VK_F7
  993. { 0x00, 0x00 }, // 119, 0x77: VK_F8
  994. { 0x00, 0x00 }, // 120, 0x78: VK_F9
  995. { 0x00, 0x00 }, // 121, 0x79: VK_F10
  996. { 0x00, 0x00 }, // 122, 0x7A: VK_F11
  997. { 0x00, 0x00 }, // 123, 0x7B: VK_F12
  998. { 0x00, 0x00 }, // 124, 0x7C: VK_F13
  999. { 0x00, 0x00 }, // 125, 0x7D: VK_F14
  1000. { 0x00, 0x00 }, // 126, 0x7E: VK_F15
  1001. { 0x00, 0x00 }, // 127, 0x7F: VK_F16
  1002. { 0x00, 0x00 }, // 128, 0x80: VK_F17
  1003. { 0x00, 0x00 }, // 129, 0x81: VK_F18
  1004. { 0x00, 0x00 }, // 130, 0x82: VK_F19
  1005. { 0x00, 0x00 }, // 131, 0x83: VK_F20
  1006. { 0x00, 0x00 }, // 132, 0x84: VK_F21
  1007. { 0x00, 0x00 }, // 133, 0x85: VK_F22
  1008. { 0x00, 0x00 }, // 134, 0x86: VK_F23
  1009. { 0x00, 0x00 }, // 135, 0x87: VK_F24
  1010. { 0x00, 0x00 }, // 136, 0x88:
  1011. { 0x00, 0x00 }, // 137, 0x89:
  1012. { 0x00, 0x00 }, // 138, 0x8A:
  1013. { 0x00, 0x00 }, // 139, 0x8B:
  1014. { 0x00, 0x00 }, // 140, 0x8C:
  1015. { 0x00, 0x00 }, // 141, 0x8D:
  1016. { 0x00, 0x00 }, // 142, 0x8E:
  1017. { 0x00, 0x00 }, // 143, 0x8F:
  1018. { 0x00, 0x00 }, // 144, 0x90: VK_NUMLOCK
  1019. { 0x00, 0x00 }, // 145, 0x91: VK_SCROLL
  1020. { 0x00, 0x00 }, // 146, 0x92:
  1021. { 0x00, 0x00 }, // 147, 0x93:
  1022. { 0x00, 0x00 }, // 148, 0x94:
  1023. { 0x00, 0x00 }, // 149, 0x95:
  1024. { 0x00, 0x00 }, // 150, 0x96:
  1025. { 0x00, 0x00 }, // 151, 0x97:
  1026. { 0x00, 0x00 }, // 152, 0x98:
  1027. { 0x00, 0x00 }, // 153, 0x99:
  1028. { 0x00, 0x00 }, // 154, 0x9A:
  1029. { 0x00, 0x00 }, // 155, 0x9B:
  1030. { 0x00, 0x00 }, // 156, 0x9C:
  1031. { 0x00, 0x00 }, // 157, 0x9D:
  1032. { 0x00, 0x00 }, // 158, 0x9E:
  1033. { 0x00, 0x00 }, // 159, 0x9F:
  1034. { 0x00, 0x00 }, // 160, 0xA0:
  1035. { 0x00, 0x00 }, // 161, 0xA1:
  1036. { 0x00, 0x00 }, // 162, 0xA2:
  1037. { 0x00, 0x00 }, // 163, 0xA3:
  1038. { 0x00, 0x00 }, // 164, 0xA4:
  1039. { 0x00, 0x00 }, // 165, 0xA5:
  1040. { 0x00, 0x00 }, // 166, 0xA6:
  1041. { 0x00, 0x00 }, // 167, 0xA7:
  1042. { 0x00, 0x00 }, // 168, 0xA8:
  1043. { 0x00, 0x00 }, // 169, 0xA9:
  1044. { 0x00, 0x00 }, // 170, 0xAA:
  1045. { 0x00, 0x00 }, // 171, 0xAB:
  1046. { 0x00, 0x00 }, // 172, 0xAC:
  1047. { 0x00, 0x00 }, // 173, 0xAD:
  1048. { 0x00, 0x00 }, // 174, 0xAE:
  1049. { 0x00, 0x00 }, // 175, 0xAF:
  1050. { 0x00, 0x00 }, // 176, 0xB0:
  1051. { 0x00, 0x00 }, // 177, 0xB1:
  1052. { 0x00, 0x00 }, // 178, 0xB2:
  1053. { 0x00, 0x00 }, // 179, 0xB3:
  1054. { 0x00, 0x00 }, // 180, 0xB4:
  1055. { 0x00, 0x00 }, // 181, 0xB5:
  1056. { 0x00, 0x00 }, // 182, 0xB6:
  1057. { 0x00, 0x00 }, // 183, 0xB7:
  1058. { 0x00, 0x00 }, // 184, 0xB8:
  1059. { 0x00, 0x00 }, // 185, 0xB9:
  1060. { 0x3B, 0x3A }, // 186, 0xBA:
  1061. { 0x3D, 0x2B }, // 187, 0xBB:
  1062. { 0x2C, 0x3C }, // 188, 0xBC:
  1063. { 0x2D, 0x5F }, // 189, 0xBD:
  1064. { 0x2E, 0x3E }, // 190, 0xBE:
  1065. { 0x2F, 0x3F }, // 191, 0xBF:
  1066. { 0x60, 0x7E }, // 192, 0xC0:
  1067. { 0x00, 0x00 }, // 193, 0xC1:
  1068. { 0x00, 0x00 }, // 194, 0xC2:
  1069. { 0x00, 0x00 }, // 195, 0xC3:
  1070. { 0x00, 0x00 }, // 196, 0xC4:
  1071. { 0x00, 0x00 }, // 197, 0xC5:
  1072. { 0x00, 0x00 }, // 198, 0xC6:
  1073. { 0x00, 0x00 }, // 199, 0xC7:
  1074. { 0x00, 0x00 }, // 200, 0xC8:
  1075. { 0x00, 0x00 }, // 201, 0xC9:
  1076. { 0x00, 0x00 }, // 202, 0xCA:
  1077. { 0x00, 0x00 }, // 203, 0xCB:
  1078. { 0x00, 0x00 }, // 204, 0xCC:
  1079. { 0x00, 0x00 }, // 205, 0xCD:
  1080. { 0x00, 0x00 }, // 206, 0xCE:
  1081. { 0x00, 0x00 }, // 207, 0xCF:
  1082. { 0x00, 0x00 }, // 208, 0xD0:
  1083. { 0x00, 0x00 }, // 209, 0xD1:
  1084. { 0x00, 0x00 }, // 210, 0xD2:
  1085. { 0x00, 0x00 }, // 211, 0xD3:
  1086. { 0x00, 0x00 }, // 212, 0xD4:
  1087. { 0x00, 0x00 }, // 213, 0xD5:
  1088. { 0x00, 0x00 }, // 214, 0xD6:
  1089. { 0x00, 0x00 }, // 215, 0xD7:
  1090. { 0x00, 0x00 }, // 216, 0xD8:
  1091. { 0x00, 0x00 }, // 217, 0xD9:
  1092. { 0x00, 0x00 }, // 218, 0xDA:
  1093. { 0x5B, 0x7B }, // 219, 0xDB:
  1094. { 0x5C, 0x7C }, // 220, 0xDC:
  1095. { 0x5D, 0x7D }, // 221, 0xDD:
  1096. { 0x27, 0x22 }, // 222, 0xDE:
  1097. { 0x00, 0x00 }, // 223, 0xDF:
  1098. { 0x00, 0x00 }, // 224, 0xE0:
  1099. { 0x00, 0x00 }, // 225, 0xE1:
  1100. { 0x00, 0x00 }, // 226, 0xE2:
  1101. { 0x00, 0x00 }, // 227, 0xE3:
  1102. { 0x00, 0x00 }, // 228, 0xE4:
  1103. { 0x00, 0x00 }, // 229, 0xE5:
  1104. { 0x00, 0x00 }, // 230, 0xE6:
  1105. { 0x00, 0x00 }, // 231, 0xE7:
  1106. { 0x00, 0x00 }, // 232, 0xE8:
  1107. { 0x00, 0x00 }, // 233, 0xE9:
  1108. { 0x00, 0x00 }, // 234, 0xEA:
  1109. { 0x00, 0x00 }, // 235, 0xEB:
  1110. { 0x00, 0x00 }, // 236, 0xEC:
  1111. { 0x00, 0x00 }, // 237, 0xED:
  1112. { 0x00, 0x00 }, // 238, 0xEE:
  1113. { 0x00, 0x00 }, // 239, 0xEF:
  1114. { 0x00, 0x00 }, // 240, 0xF0:
  1115. { 0x00, 0x00 }, // 241, 0xF1:
  1116. { 0x00, 0x00 }, // 242, 0xF2:
  1117. { 0x00, 0x00 }, // 243, 0xF3:
  1118. { 0x00, 0x00 }, // 244, 0xF4:
  1119. { 0x00, 0x00 }, // 245, 0xF5:
  1120. { 0x00, 0x00 }, // 246, 0xF6:
  1121. { 0x00, 0x00 }, // 247, 0xF7:
  1122. { 0x00, 0x00 }, // 248, 0xF8:
  1123. { 0x00, 0x00 }, // 249, 0xF9:
  1124. { 0x00, 0x00 }, // 250, 0xFA:
  1125. { 0x00, 0x00 }, // 251, 0xFB:
  1126. { 0x00, 0x00 }, // 252, 0xFC:
  1127. { 0x00, 0x00 }, // 253, 0xFD:
  1128. { 0x00, 0x00 }, // 254, 0xFE:
  1129. { 0x00, 0x00 } // 255, 0xFF:
  1130. };
  1131. static
  1132. WORD Int2UniCho[NUM_OF_CHOSUNG+1] =
  1133. {
  1134. 0, // fill [0]
  1135. UNICODE_HANGUL_COMP_JAMO_START + 0, // ��
  1136. UNICODE_HANGUL_COMP_JAMO_START + 1, // ��
  1137. UNICODE_HANGUL_COMP_JAMO_START + 3, // ��
  1138. UNICODE_HANGUL_COMP_JAMO_START + 6, // ��
  1139. UNICODE_HANGUL_COMP_JAMO_START + 7, // ��
  1140. UNICODE_HANGUL_COMP_JAMO_START + 8, // ��
  1141. UNICODE_HANGUL_COMP_JAMO_START + 16, // ��
  1142. UNICODE_HANGUL_COMP_JAMO_START + 17, // ��
  1143. UNICODE_HANGUL_COMP_JAMO_START + 18, // ��
  1144. UNICODE_HANGUL_COMP_JAMO_START + 20, // ��
  1145. UNICODE_HANGUL_COMP_JAMO_START + 21, // ��
  1146. UNICODE_HANGUL_COMP_JAMO_START + 22, // ��
  1147. UNICODE_HANGUL_COMP_JAMO_START + 23, // ��
  1148. UNICODE_HANGUL_COMP_JAMO_START + 24, // ��
  1149. UNICODE_HANGUL_COMP_JAMO_START + 25, // ��
  1150. UNICODE_HANGUL_COMP_JAMO_START + 26, // ��
  1151. UNICODE_HANGUL_COMP_JAMO_START + 27, // ��
  1152. UNICODE_HANGUL_COMP_JAMO_START + 28, // ��
  1153. UNICODE_HANGUL_COMP_JAMO_START + 29, // ��
  1154. };
  1155. static
  1156. WORD Int2UniJong[NUM_OF_JONGSUNG] =
  1157. {
  1158. 0, // fill [0]
  1159. UNICODE_HANGUL_COMP_JAMO_START + 0, // ��
  1160. UNICODE_HANGUL_COMP_JAMO_START + 1, // ��
  1161. UNICODE_HANGUL_COMP_JAMO_START + 2, // ����
  1162. UNICODE_HANGUL_COMP_JAMO_START + 3, // ��
  1163. UNICODE_HANGUL_COMP_JAMO_START + 4, // ����
  1164. UNICODE_HANGUL_COMP_JAMO_START + 5, // ����
  1165. UNICODE_HANGUL_COMP_JAMO_START + 6, // ��
  1166. UNICODE_HANGUL_COMP_JAMO_START + 8, // ��
  1167. UNICODE_HANGUL_COMP_JAMO_START + 9, // ����
  1168. UNICODE_HANGUL_COMP_JAMO_START + 10, // ����
  1169. UNICODE_HANGUL_COMP_JAMO_START + 11, // ����
  1170. UNICODE_HANGUL_COMP_JAMO_START + 12, // ����
  1171. UNICODE_HANGUL_COMP_JAMO_START + 13, // ����
  1172. UNICODE_HANGUL_COMP_JAMO_START + 14, // ����
  1173. UNICODE_HANGUL_COMP_JAMO_START + 15, // ����
  1174. UNICODE_HANGUL_COMP_JAMO_START + 16, // ��
  1175. UNICODE_HANGUL_COMP_JAMO_START + 17, // ��
  1176. UNICODE_HANGUL_COMP_JAMO_START + 19, // ����
  1177. UNICODE_HANGUL_COMP_JAMO_START + 20, // ��
  1178. UNICODE_HANGUL_COMP_JAMO_START + 21, // ��
  1179. UNICODE_HANGUL_COMP_JAMO_START + 22, // ��
  1180. UNICODE_HANGUL_COMP_JAMO_START + 23, // ��
  1181. UNICODE_HANGUL_COMP_JAMO_START + 25, // ��
  1182. UNICODE_HANGUL_COMP_JAMO_START + 26, // ��
  1183. UNICODE_HANGUL_COMP_JAMO_START + 27, // ��
  1184. UNICODE_HANGUL_COMP_JAMO_START + 28, // ��
  1185. UNICODE_HANGUL_COMP_JAMO_START + 29, // ��
  1186. };
  1187. // Compatibility Jamo Consonant map
  1188. static
  1189. BYTE CompJamoMapTable[30][2] =
  1190. {
  1191. // Jamo code , Jongsung Flag : Only if it can't be chosung then make it jongsung
  1192. { _KIYEOK_, 0 },
  1193. { _SSANGKIYEOK_, 0 },
  1194. { _JONG_KIYEOK_SIOS, 1 },
  1195. { _NIEUN_, 0 },
  1196. { _JONG_NIEUN_CHIEUCH_, 1 },
  1197. { _JONG_NIEUN_HIEUH_, 1 },
  1198. { _TIKEUT_, 0 },
  1199. { _SSANGTIKEUT_, 0 },
  1200. { _RIEUL_, 0 },
  1201. { _JONG_RIEUL_KIYEOK_, 1 },
  1202. { _JONG_RIEUL_MIUM_, 1 },
  1203. { _JONG_RIEUL_PIEUP_, 1 },
  1204. { _JONG_RIEUL_SIOS_, 1 },
  1205. { _JONG_RIEUL_THIEUTH_, 1 },
  1206. { _JONG_RIEUL_PHIEUPH_, 1 },
  1207. { _JONG_RIEUL_HIEUH_, 1 },
  1208. { _MIEUM_, 0 },
  1209. { _PIEUP_, 0 },
  1210. { _SSANGPIEUP_, 0 },
  1211. { _JONG_PIEUP_SIOS, 1 },
  1212. { _SIOS_, 0 },
  1213. { _SSANGSIOS_, 0 },
  1214. { _IEUNG_, 0 },
  1215. { _CIEUC_, 0 },
  1216. { _SSANGCIEUC_, 0 },
  1217. { _CHIEUCH_, 0 },
  1218. { _KHIEUKH_, 0 },
  1219. { _THIEUTH_, 0 },
  1220. { _PHIEUPH_, 0 },
  1221. { _HIEUH_, 0 },
  1222. };
  1223. static
  1224. BYTE JongSungSep[NUM_OF_JONGSUNG][2] =
  1225. {
  1226. { 0, 0 },
  1227. { _JONG_KIYEOK_, 0 }, //_JONG_KIYEOK_
  1228. { _JONG_SSANGKIYEOK_, 0 }, //_JONG_SSANGKIYEOK_
  1229. { _JONG_KIYEOK_, _JONG_SIOS_ }, //_JONG_KIYEOK_SIOS
  1230. { _JONG_NIEUN_, 0 }, //_JONG_NIEUN_
  1231. { _JONG_NIEUN_, _JONG_CIEUC_ }, //_JONG_NIEUN_CIEUC_
  1232. { _JONG_NIEUN_, _JONG_HIEUH_ }, //_JONG_NIEUN_HIEUH_
  1233. { _JONG_TIKEUT_, 0 }, //_JONG_TIKEUT_
  1234. { _JONG_RIEUL_, 0 }, //_JONG_RIEUL_
  1235. { _JONG_RIEUL_, _JONG_KIYEOK_ }, //_JONG_RIEUL_KIYEOK_
  1236. { _JONG_RIEUL_, _JONG_MIEUM_ }, //_JONG_RIEUL_MIUM_
  1237. { _JONG_RIEUL_, _JONG_PIEUP_ }, //_JONG_RIEUL_PIEUP_
  1238. { _JONG_RIEUL_, _JONG_SIOS_ }, //_JONG_RIEUL_SIOS_
  1239. { _JONG_RIEUL_, _JONG_THIEUTH_ }, //_JONG_RIEUL_THIEUTH_
  1240. { _JONG_RIEUL_, _JONG_PHIEUPH_ }, //_JONG_RIEUL_PHIEUPH_
  1241. { _JONG_RIEUL_, _JONG_HIEUH_ }, //_JONG_RIEUL_HIEUH_
  1242. { _JONG_MIEUM_, 0 }, //_JONG_MIEUM_
  1243. { _JONG_PIEUP_, 0 }, //_JONG_PIEUP_
  1244. { _JONG_PIEUP_, _JONG_SIOS_ }, //_JONG_PIEUP_SIOS
  1245. { _JONG_SIOS_, 0 }, //_JONG_SIOS_
  1246. { _JONG_SSANGSIOS_, 0 }, //_JONG_SSANGSIOS_
  1247. { _JONG_IEUNG_, 0 }, //_JONG_IEUNG_
  1248. { _JONG_CIEUC_, 0 }, //_JONG_CIEUC_
  1249. { _JONG_CHIEUCH_, 0 }, //_JONG_CHIEUCH_
  1250. { _JONG_KHIEUKH_, 0 }, //_JONG_KHIEUKH_
  1251. { _JONG_THIEUTH_, 0 }, //_JONG_THIEUTH_
  1252. { _JONG_PHIEUPH_, 0 }, //_JONG_PHIEUPH_
  1253. { _JONG_HIEUH_, 0 } //_JONG_HIEUH_
  1254. };
  1255. static
  1256. BYTE JungSungSep[NUM_OF_JUNGSUNG+1][2] =
  1257. {
  1258. { 0, 0 },
  1259. { _A_, 0 }, // _A_,
  1260. { _AE_, 0 }, //_AE_,
  1261. { _YA_, 0 }, //_YA_,
  1262. { _YAE_, 0 }, //_YAE_,
  1263. { _EO_, 0 }, //_EO_,
  1264. { _E_, 0 }, //_E_,
  1265. { _YEO_, 0 }, //_YEO_,
  1266. { _YE_, 0 }, //_YE_,
  1267. { _O_, 0 }, //_O_,
  1268. { _O_, _A_ }, //_WA_,
  1269. { _O_, _AE_ }, //_WAE_,
  1270. { _O_, _I_ }, //_OE_,
  1271. { _YO_, 0 }, //_YO_,
  1272. { _U_, 0 }, //_U_,
  1273. { _U_, _EO_ }, //_WEO_,
  1274. { _U_, _E_ }, //_WE_,
  1275. { _U_, _I_ }, //_WI_,
  1276. { _YU_, 0 }, //_YU_,
  1277. { _EU_, 0 }, //_EU_,
  1278. { _EU_, _I_ }, //_YI_,
  1279. { _I_, 0 } //_I_,
  1280. };
  1281. #pragma data_seg()
  1282. // ====-- SHARED SECTION END --====
  1283. ///////////////////////////////////////////////////////////////////////////////
  1284. // CHangulAutomata class member function
  1285. BOOL CHangulAutomata::MakeComplete()
  1286. {
  1287. if (m_wcComposition)
  1288. {
  1289. m_wcComplete = m_wcComposition;
  1290. // clear composition char
  1291. m_wcComposition = 0;
  1292. // Init interim stack
  1293. InterimStack.Init();
  1294. m_Chosung = m_Jungsung = m_Jongsung = 0;
  1295. // Init state
  1296. m_CurState = 0;
  1297. return fTrue;
  1298. }
  1299. else
  1300. return fFalse;
  1301. }
  1302. // Complete used when takeover occurs
  1303. BOOL CHangulAutomata::MakeComplete(WORD wcComplete)
  1304. {
  1305. if (wcComplete)
  1306. {
  1307. m_wcComplete = wcComplete;
  1308. // clear composition char
  1309. m_wcComposition = 0;
  1310. // Init interim stack
  1311. InterimStack.Init();
  1312. m_Jungsung = m_Jongsung = 0;
  1313. return fTrue;
  1314. }
  1315. else
  1316. return fFalse;
  1317. }
  1318. void CHangulAutomata::MakeComposition()
  1319. {
  1320. DbgAssert(m_Chosung || m_Jungsung || m_Jongsung);
  1321. // if Hangul
  1322. if (m_Chosung && m_Jungsung)
  1323. {
  1324. m_wcComposition = UNICODE_HANGUL_BASE
  1325. + (m_Chosung-1) * NUM_OF_JUNGSUNG * (NUM_OF_JONGSUNG) // +1 : jongsung fill
  1326. + (m_Jungsung-1) * (NUM_OF_JONGSUNG)
  1327. + m_Jongsung;
  1328. }
  1329. else // Hangul jamo
  1330. // Currently map to compatiblity area. This should be changed if jamo glyphs available.
  1331. {
  1332. if (m_Chosung)
  1333. m_wcComposition = Int2UniCho[m_Chosung];
  1334. else
  1335. if (m_Jungsung)
  1336. m_wcComposition = UNICODE_HANGUL_COMP_JAMO_START + 30 + m_Jungsung-1;
  1337. else
  1338. if (m_Jongsung)
  1339. m_wcComposition = Int2UniJong[m_Jongsung];
  1340. }
  1341. // Push to interim stack
  1342. InterimStack.Push(m_wInternalCode, m_CurState, m_Chosung, m_Jungsung, m_Jongsung,
  1343. m_wcComposition);
  1344. Dbg(DBGID_Automata, TEXT("CHangulAutomata::MakeComposition(), m_CurState=%d, m_Chosung=%d, m_Jungsung=%d, m_Jongsung=%d, m_wcComposition = 0x%04X"), m_CurState, m_Chosung, m_Jungsung, m_Jongsung, m_wcComposition);
  1345. //
  1346. }
  1347. WORD CHangulAutomata::FindChosungComb(WORD wPrevCode)
  1348. {
  1349. // Combination table for double chosung. (only for 3beolsik)
  1350. static BYTE rgbDChoTbl[NUM_OF_DOUBLE_CHOSUNG][3] =
  1351. {
  1352. { 1, 1, 2 }, { 4, 4, 5 }, // �� �� -> ��, �� �� -> ��
  1353. { 8, 8, 9 }, { 10, 10, 11 }, // �� �� -> ��, �� �� -> ��
  1354. { 13, 13, 14 } // �� �� -> ��
  1355. };
  1356. BYTE (*pDbl)[3] = rgbDChoTbl; // pointer a little bit faster than array access.
  1357. int i = NUM_OF_DOUBLE_CHOSUNG;
  1358. WORD wCurCode = m_wInternalCode & 0xFF;
  1359. for (; i>0; i--, pDbl++)
  1360. {
  1361. if ( ((*pDbl)[0] == wPrevCode) && ((*pDbl)[1] == wCurCode) )
  1362. return (*pDbl)[2];
  1363. }
  1364. return 0;
  1365. }
  1366. WORD CHangulAutomata::FindJunsungComb(WORD wPrevCode)
  1367. {
  1368. // Combination table for double jungsung.
  1369. static BYTE rgbDJungTbl[NUM_OF_DOUBLE_JUNGSUNG][3] =
  1370. {
  1371. { 9, 1, 10 }, { 9, 2, 11 }, // �� �� -> ��, �� �� -> ��
  1372. { 9, 21, 12 }, { 14, 5, 15 }, // �� �� -> ��, �� �� -> ��
  1373. { 14, 6, 16 }, { 14, 21, 17 }, // �� �� -> ��, �� �� -> ��
  1374. { 19, 21, 20 } // �� �� -> ��
  1375. };
  1376. BYTE (*pDbl)[3] = rgbDJungTbl;
  1377. int i = NUM_OF_DOUBLE_JUNGSUNG;
  1378. WORD wCurCode = m_wInternalCode & 0xFF;
  1379. for (; i>0; i--, pDbl++)
  1380. {
  1381. if ( ((*pDbl)[0] == wPrevCode) && ((*pDbl)[1] == wCurCode) )
  1382. return (*pDbl)[2];
  1383. }
  1384. return 0;
  1385. }
  1386. WORD CHangulAutomata2::FindJonsungComb(WORD wPrevCode)
  1387. {
  1388. BYTE (*pDbl)[3] = rgbDJongTbl;
  1389. wPrevCode = Cho2Jong[wPrevCode];
  1390. WORD wCurCode = Cho2Jong[m_wInternalCode & 0xFF];
  1391. for (; (*pDbl)[0]; pDbl++)
  1392. {
  1393. if ( ((*pDbl)[0] == wPrevCode) && ((*pDbl)[1] == wCurCode) )
  1394. return (*pDbl)[2];
  1395. }
  1396. return 0;
  1397. }
  1398. WORD CHangulAutomata3::FindJonsungComb(WORD wPrevCode)
  1399. {
  1400. BYTE (*pDbl)[3] = rgbDJongTbl;
  1401. // 3BeolSik internal code have Jongsung code
  1402. WORD wCurCode = m_wInternalCode & 0xFF;
  1403. for (; (*pDbl)[0]; pDbl++)
  1404. {
  1405. if ( ((*pDbl)[0] == wPrevCode) && ((*pDbl)[1] == wCurCode) )
  1406. return (*pDbl)[2];
  1407. }
  1408. return 0;
  1409. }
  1410. BOOL CHangulAutomata::BackSpace()
  1411. {
  1412. InterimStackEntry* pInterimEntry;
  1413. if (InterimStack.IsEmpty())
  1414. return fFalse;
  1415. else
  1416. {
  1417. InterimStack.Pop();
  1418. if (!InterimStack.IsEmpty())
  1419. {
  1420. pInterimEntry = InterimStack.GetTop();
  1421. m_wcComposition = pInterimEntry->m_wcCode;
  1422. m_CurState = pInterimEntry->m_CurState;
  1423. m_Chosung = pInterimEntry->m_Chosung;
  1424. m_Jungsung = pInterimEntry->m_Jungsung;
  1425. m_Jongsung = pInterimEntry->m_Jongsung;
  1426. }
  1427. else
  1428. InitState();
  1429. return fTrue;
  1430. }
  1431. }
  1432. void CHangulAutomata::SeparateDJung(LPWORD pJungSung)
  1433. {
  1434. WORD wJungSung = pJungSung[0];
  1435. pJungSung[0] = JungSungSep[wJungSung][0];
  1436. pJungSung[1] = JungSungSep[wJungSung][1];
  1437. }
  1438. void CHangulAutomata::SeparateDJong(LPWORD pJongSung)
  1439. {
  1440. WORD wJongSung = pJongSung[0];
  1441. pJongSung[0] = JongSungSep[wJongSung][0];
  1442. pJongSung[1] = JongSungSep[wJongSung][1];
  1443. }
  1444. ///////////////////////////////////////////////////////////////////////////////
  1445. //
  1446. // Assume : Input wcComp has valid Unicode Hangul value
  1447. // (wcComp>0x3130 && wcComp<0x3164) || (wcComp>=0xAC00 && wcComp<0xD7A4))
  1448. //
  1449. BOOL CHangulAutomata2::SetCompositionChar(WCHAR wcComp)
  1450. {
  1451. WORD wUnicodeHangulOffset;
  1452. WORD wChosung;
  1453. WORD wJungsung[2], wJongsung[2];
  1454. Dbg(DBGID_SetComp, TEXT("CHangulAutomata2::SetCompositionChar: wcComp = %c(0x%X)"), wcComp, wcComp),
  1455. InitState();
  1456. wChosung = wJungsung[0] = wJungsung[1] = wJongsung[0] = wJongsung[1] = 0;
  1457. if (wcComp <= UNICODE_HANGUL_COMP_JAMO_END && wcComp >= UNICODE_HANGUL_COMP_JAMO_START)
  1458. {
  1459. Dbg(DBGID_SetComp, TEXT("COMP_JAMO"));
  1460. // Consonant or vowel ?
  1461. if (wcComp < UNICODE_HANGUL_COMP_JAMO_VOWEL_START)
  1462. {
  1463. wUnicodeHangulOffset = (wcComp-UNICODE_HANGUL_COMP_JAMO_START);
  1464. // Jongsung or Chosung ?
  1465. if (CompJamoMapTable[wUnicodeHangulOffset][1])
  1466. {
  1467. wJongsung[0] = CompJamoMapTable[wUnicodeHangulOffset][0];
  1468. SeparateDJong(wJongsung);
  1469. Dbg(DBGID_Automata, TEXT("SetCompositionChar() : wJongsung[0]=%04x, wJongsung[1]=%04x"), wJongsung[0], wJongsung[1]);
  1470. }
  1471. else
  1472. wChosung = CompJamoMapTable[wUnicodeHangulOffset][0];
  1473. }
  1474. else
  1475. {
  1476. wJungsung[0] = wcComp - UNICODE_HANGUL_COMP_JAMO_VOWEL_START + 1;
  1477. SeparateDJung(wJungsung);
  1478. }
  1479. }
  1480. else
  1481. {
  1482. wUnicodeHangulOffset = (wcComp-UNICODE_HANGUL_BASE);
  1483. wChosung = (WORD)( wUnicodeHangulOffset /
  1484. (NUM_OF_JONGSUNG*NUM_OF_JUNGSUNG)) + 1; // +1 to skip fill code
  1485. wJungsung[0] = (WORD)(wUnicodeHangulOffset / NUM_OF_JONGSUNG
  1486. % NUM_OF_JUNGSUNG) + 1;
  1487. SeparateDJung(wJungsung);
  1488. wJongsung[0] = (WORD)(wUnicodeHangulOffset % NUM_OF_JONGSUNG); // jongsung already has fill code
  1489. SeparateDJong(wJongsung);
  1490. }
  1491. ///////////////////////////////////////////////////////////////////////////
  1492. // Push process
  1493. if (wChosung)
  1494. {
  1495. m_Chosung = m_wInternalCode = wChosung;
  1496. m_CurState = 1; // Chosung state
  1497. MakeComposition();
  1498. }
  1499. if (wJungsung[0])
  1500. {
  1501. m_Jungsung = m_wInternalCode = wJungsung[0];
  1502. if (m_Jungsung == _O_ || m_Jungsung == _U_ || m_Jungsung == _EU_)
  1503. m_CurState = 3; // Double Jungsung possible state
  1504. else
  1505. m_CurState = 2; // Single Jungsung state
  1506. MakeComposition();
  1507. }
  1508. if (wJungsung[1])
  1509. {
  1510. DbgAssert(wJungsung[0] == _O_ || wJungsung[0] == _U_ || wJungsung[0] == _EU_);
  1511. m_wInternalCode = wJungsung[1];
  1512. m_Jungsung = FindJunsungComb(wJungsung[0]);
  1513. DbgAssert(m_Jungsung);
  1514. m_CurState = 2; // Jungsung state
  1515. MakeComposition();
  1516. }
  1517. //
  1518. if (wJongsung[0])
  1519. {
  1520. m_wInternalCode = Jong2Cho[wJongsung[0]];
  1521. m_Jongsung = wJongsung[0];
  1522. // KiYeok, Nieun, Rieul and Pieup: Double jongsong possible chars.
  1523. if (m_Jongsung == _JONG_KIYEOK_ || m_Jongsung == _JONG_NIEUN_
  1524. || m_Jongsung == _JONG_RIEUL_ || m_Jongsung == _JONG_PIEUP_)
  1525. m_CurState = 5; // Double Jongsung possible state
  1526. else
  1527. m_CurState = 4; // Single Jongsung state
  1528. MakeComposition();
  1529. }
  1530. if (wJongsung[1])
  1531. {
  1532. DbgAssert(m_Jongsung == _JONG_KIYEOK_ || m_Jongsung == _JONG_NIEUN_
  1533. || m_Jongsung == _JONG_RIEUL_ || m_Jongsung == _JONG_PIEUP_);
  1534. m_wInternalCode = Jong2Cho[wJongsung[1]];
  1535. m_Jongsung = FindJonsungComb(Jong2Cho[wJongsung[0]]);
  1536. DbgAssert(m_Jongsung);
  1537. m_CurState = 4; // Jongsung state
  1538. MakeComposition();
  1539. }
  1540. return fTrue;
  1541. }
  1542. ///////////////////////////////////////////////////////////////////////////////
  1543. // Transition table of 2beolsik hangul automata
  1544. const WORD CHangulAutomata2::m_NextStateTbl[8][5] =
  1545. {
  1546. /////////////////////////////////////////////////////
  1547. // Sa Va Sb Vb Sc State
  1548. { 1, 6, 1, 7, 1 }, // 0 : Start
  1549. { FIND, 2, FIND, 3, FINAL }, // 1 : Chosung
  1550. { 4, FINAL, 5, FINAL, FINAL }, // 2 : Single Jungsung
  1551. { 4, FIND, 5, FINAL, FINAL }, // 3 : Double Jungsung possible
  1552. { FINAL, TAKEOVER, FINAL, TAKEOVER, FINAL }, // 4 : Single Jongsung
  1553. { FIND, TAKEOVER, FIND, TAKEOVER, FINAL }, // 5 : Double Jongsung possible
  1554. { FINAL, FINAL, FINAL, FINAL, FINAL }, // 6 : Single Jungsung(without chosung)
  1555. { FINAL, FIND, FINAL, FINAL, FINAL } // 7 : Double Jungsung possible(without chosung)
  1556. };
  1557. ///////////////////////////////////////////////////////////////////////////////
  1558. HAutomataReturnState CHangulAutomata2::Input(WORD InternalCode)
  1559. {
  1560. WORD wSymbol, wFind;
  1561. InterimStackEntry* pPrevInterim;
  1562. // Check if hangul key
  1563. if ( !(InternalCode & H_HANGUL) )
  1564. return HAUTO_NONHANGULKEY; // This keycode need not handled in automata.
  1565. // Calling function should handle it properly.
  1566. // Copy internal code to member data
  1567. m_wInternalCode = InternalCode;
  1568. wSymbol = (m_wInternalCode >> 8) & 0x7F;
  1569. m_NextState = m_NextStateTbl[m_CurState][wSymbol];
  1570. switch (m_NextState)
  1571. {
  1572. // Chosung
  1573. case 1 : m_Chosung = m_wInternalCode & 0xFF;
  1574. m_CurState = m_NextState;
  1575. MakeComposition();
  1576. return HAUTO_COMPOSITION;
  1577. break;
  1578. // Jungsung
  1579. case 2 : case 3 : case 6 : case 7 :
  1580. m_Jungsung = m_wInternalCode & 0xFF;
  1581. m_CurState = m_NextState;
  1582. MakeComposition();
  1583. return HAUTO_COMPOSITION;
  1584. break;
  1585. // Jongsung
  1586. case 4 : case 5 :
  1587. m_Jongsung = Cho2Jong[m_wInternalCode & 0xFF];
  1588. m_CurState = m_NextState;
  1589. MakeComposition();
  1590. return HAUTO_COMPOSITION;
  1591. break;
  1592. case FINAL :
  1593. MakeComplete();
  1594. Input(m_wInternalCode);
  1595. return HAUTO_COMPLETE;
  1596. break;
  1597. case TAKEOVER :
  1598. pPrevInterim = InterimStack.Pop();
  1599. m_Chosung = pPrevInterim->m_wInternalCode & 0xFF;
  1600. pPrevInterim = InterimStack.Pop();
  1601. MakeComplete(pPrevInterim->m_wcCode);
  1602. m_CurState = 1;
  1603. // FIXED : should call MakeComposition() to push interim state
  1604. MakeComposition();
  1605. Input(m_wInternalCode);
  1606. return HAUTO_COMPLETE;
  1607. break;
  1608. case FIND :
  1609. switch (m_CurState)
  1610. {
  1611. case 7 :
  1612. pPrevInterim = InterimStack.GetTop();
  1613. if (wFind = FindJunsungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1614. {
  1615. m_Jungsung = wFind;
  1616. m_CurState = 6;
  1617. MakeComposition();
  1618. return HAUTO_COMPOSITION;
  1619. }
  1620. else
  1621. {
  1622. MakeComplete();
  1623. Input(m_wInternalCode);
  1624. return HAUTO_COMPLETE;
  1625. }
  1626. break;
  1627. case 3 :
  1628. pPrevInterim = InterimStack.GetTop();
  1629. if (wFind = FindJunsungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1630. {
  1631. m_Jungsung = wFind;
  1632. m_CurState = 2;
  1633. MakeComposition();
  1634. return HAUTO_COMPOSITION;
  1635. }
  1636. else
  1637. {
  1638. MakeComplete();
  1639. Input(m_wInternalCode);
  1640. return HAUTO_COMPLETE;
  1641. }
  1642. break;
  1643. case 5 :
  1644. pPrevInterim = InterimStack.GetTop();
  1645. if (wFind = FindJonsungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1646. {
  1647. m_Jongsung = wFind;
  1648. m_CurState = 4;
  1649. MakeComposition();
  1650. return HAUTO_COMPOSITION;
  1651. }
  1652. else
  1653. {
  1654. MakeComplete();
  1655. Input(m_wInternalCode);
  1656. return HAUTO_COMPLETE;
  1657. }
  1658. break;
  1659. // Only DJongsung case. same as case 5 except clearing chosung
  1660. case 1:
  1661. pPrevInterim = InterimStack.GetTop();
  1662. if (wFind = FindJonsungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1663. {
  1664. m_Chosung = 0;
  1665. m_Jongsung = wFind;
  1666. m_CurState = 4;
  1667. MakeComposition();
  1668. return HAUTO_COMPOSITION;
  1669. }
  1670. else
  1671. {
  1672. MakeComplete();
  1673. Input(m_wInternalCode);
  1674. return HAUTO_COMPLETE;
  1675. }
  1676. break;
  1677. }
  1678. }
  1679. // impossible
  1680. DbgAssert(0);
  1681. return HAUTO_IMPOSSIBLE;
  1682. }
  1683. ///////////////////////////////////////////////////////////////////////////////
  1684. // Transition table of 3 beolsik 390 hangul automata
  1685. const WORD CHangulAutomata3::m_NextStateTbl[11][6] =
  1686. {
  1687. ////////////////////////////////////////////////////////////
  1688. // Sa Sb Va Vb Sc Sd State
  1689. { 1, 2, 7, 8, 9, 10 }, // 0 : Start
  1690. { FINAL, FINAL, 3, 4, FINAL, FINAL }, // 1 : Chosung
  1691. { FINAL, FIND, 3, 4, FINAL, FINAL }, // 2 : Double Chosung possible
  1692. { FINAL, FINAL, FINAL, FINAL, 5, 6 }, // 3 : Jungsung
  1693. { FINAL, FINAL, FIND, FINAL, 5, 6 }, // 4 : Double Jungsung possible
  1694. { FINAL, FINAL, FINAL, FINAL, FINAL, FINAL }, // 5 : Jongsung
  1695. { FINAL, FINAL, FINAL, FINAL, FIND, FIND }, // 6 : Double Jongsung possible
  1696. { FINAL, FINAL, FINAL, FINAL, FINAL, FINAL }, // 7 : Single Jungsung (without chosung)
  1697. { FINAL, FINAL, FIND, FINAL, FINAL, FINAL }, // 8 : Double Jungsung possible(without chosung)
  1698. { FINAL, FINAL, FINAL, FINAL, FINAL, FINAL }, // 9 : Single Jongsung(without chosung)
  1699. { FINAL, FINAL, FINAL, FINAL, FIND, FIND } // 10 : Double Jongsung possible(without chosung)
  1700. };
  1701. ///////////////////////////////////////////////////////////////////////////////
  1702. HAutomataReturnState CHangulAutomata3::Input(WORD InternalCode)
  1703. {
  1704. WORD wSymbol, wFind;
  1705. InterimStackEntry* pPrevInterim;
  1706. // Check if hangul key
  1707. if (!(InternalCode & H_HANGUL))
  1708. return HAUTO_NONHANGULKEY; // This keycode need not handled in automata.
  1709. // Calling function should handle it properly.
  1710. // Get internal code from keycode
  1711. m_wInternalCode = InternalCode;
  1712. wSymbol = (m_wInternalCode >> 8) & 0x7F;
  1713. m_NextState = m_NextStateTbl[m_CurState][wSymbol];
  1714. switch (m_NextState)
  1715. {
  1716. // Chosung
  1717. case 1 : case 2 :
  1718. m_Chosung = m_wInternalCode & 0xFF;
  1719. m_CurState = m_NextState;
  1720. MakeComposition();
  1721. return HAUTO_COMPOSITION;
  1722. break;
  1723. // Jungsung
  1724. case 3 : case 4 : case 7 : case 8 :
  1725. m_Jungsung = m_wInternalCode & 0xFF;
  1726. m_CurState = m_NextState;
  1727. MakeComposition();
  1728. return HAUTO_COMPOSITION;
  1729. break;
  1730. // Jongsung
  1731. case 5 : case 6 : case 9 : case 10 :
  1732. m_Jongsung = m_wInternalCode & 0xFF;
  1733. m_CurState = m_NextState;
  1734. MakeComposition();
  1735. return HAUTO_COMPOSITION;
  1736. break;
  1737. case FINAL :
  1738. MakeComplete();
  1739. Input(m_wInternalCode);
  1740. return HAUTO_COMPLETE;
  1741. break;
  1742. case FIND :
  1743. switch (m_CurState)
  1744. {
  1745. case 8 :
  1746. pPrevInterim = InterimStack.GetTop();
  1747. if (wFind = FindJunsungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1748. {
  1749. m_Jungsung = wFind;
  1750. m_CurState = 7;
  1751. MakeComposition();
  1752. return HAUTO_COMPOSITION;
  1753. }
  1754. else
  1755. {
  1756. MakeComplete();
  1757. Input(m_wInternalCode);
  1758. return HAUTO_COMPLETE;
  1759. }
  1760. break;
  1761. case 4 :
  1762. pPrevInterim = InterimStack.GetTop();
  1763. if (wFind = FindJunsungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1764. {
  1765. m_Jungsung = wFind;
  1766. m_CurState = 3;
  1767. MakeComposition();
  1768. return HAUTO_COMPOSITION;
  1769. }
  1770. else
  1771. {
  1772. MakeComplete();
  1773. Input(m_wInternalCode);
  1774. return HAUTO_COMPLETE;
  1775. }
  1776. break;
  1777. case 6 :
  1778. pPrevInterim = InterimStack.GetTop();
  1779. if (wFind = FindJonsungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1780. {
  1781. m_Jongsung = wFind;
  1782. m_CurState = 5;
  1783. MakeComposition();
  1784. return HAUTO_COMPOSITION;
  1785. }
  1786. else
  1787. {
  1788. MakeComplete();
  1789. Input(m_wInternalCode);
  1790. return HAUTO_COMPLETE;
  1791. }
  1792. break;
  1793. case 10 :
  1794. pPrevInterim = InterimStack.GetTop();
  1795. if (wFind = FindJonsungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1796. {
  1797. m_Jongsung = wFind;
  1798. m_CurState = 7;
  1799. MakeComposition();
  1800. return HAUTO_COMPOSITION;
  1801. }
  1802. else
  1803. {
  1804. MakeComplete();
  1805. Input(m_wInternalCode);
  1806. return HAUTO_COMPLETE;
  1807. }
  1808. break;
  1809. case 2 :
  1810. pPrevInterim = InterimStack.GetTop();
  1811. if (wFind = FindChosungComb(pPrevInterim->m_wInternalCode & 0xFF))
  1812. {
  1813. m_Chosung = wFind;
  1814. m_CurState = 1;
  1815. MakeComposition();
  1816. return HAUTO_COMPOSITION;
  1817. }
  1818. else
  1819. {
  1820. MakeComplete();
  1821. Input(m_wInternalCode);
  1822. return HAUTO_COMPLETE;
  1823. }
  1824. break;
  1825. }
  1826. }
  1827. // impossible
  1828. DbgAssert(0);
  1829. return HAUTO_IMPOSSIBLE;
  1830. }
  1831. ///////////////////////////////////////////////////////////////////////////////
  1832. //
  1833. // Assume : Input wcComp has valid Unicode Hangul value
  1834. // (wcComp>0x3130 && wcComp<0x3164) || (wcComp>=0xAC00 && wcComp<0xD7A4))
  1835. //
  1836. BOOL CHangulAutomata3::SetCompositionChar(WCHAR wcComp)
  1837. {
  1838. WORD wUnicodeHangulOffset;
  1839. WORD wChosung;
  1840. WORD wJungsung[2], wJongsung[2];
  1841. wChosung = wJungsung[0] = wJungsung[1] = wJongsung[0] = wJongsung[1] = 0;
  1842. InitState();
  1843. if (wcComp <= UNICODE_HANGUL_COMP_JAMO_END && wcComp >= UNICODE_HANGUL_COMP_JAMO_START)
  1844. {
  1845. wUnicodeHangulOffset = (wcComp-UNICODE_HANGUL_COMP_JAMO_START);
  1846. // Consonant or vowel ?
  1847. if (wcComp < UNICODE_HANGUL_COMP_JAMO_VOWEL_START)
  1848. {
  1849. // Jongsung or Chosung ?
  1850. if (CompJamoMapTable[wUnicodeHangulOffset][1])
  1851. {
  1852. wJongsung[0] = CompJamoMapTable[wUnicodeHangulOffset][0];
  1853. SeparateDJong(wJongsung);
  1854. }
  1855. else
  1856. wChosung = CompJamoMapTable[wUnicodeHangulOffset][0];
  1857. }
  1858. else
  1859. {
  1860. wJungsung[0] = wcComp - UNICODE_HANGUL_COMP_JAMO_VOWEL_START + 1;
  1861. SeparateDJung(wJungsung);
  1862. }
  1863. }
  1864. else
  1865. {
  1866. wUnicodeHangulOffset = (wcComp-UNICODE_HANGUL_BASE);
  1867. wChosung = (WORD)( wUnicodeHangulOffset /
  1868. (NUM_OF_JONGSUNG*NUM_OF_JUNGSUNG)) + 1;
  1869. wJungsung[0] = (WORD)(wUnicodeHangulOffset / NUM_OF_JONGSUNG
  1870. % NUM_OF_JUNGSUNG) + 1;
  1871. SeparateDJung(wJungsung);
  1872. wJongsung[0] = (WORD)(wUnicodeHangulOffset % NUM_OF_JONGSUNG);
  1873. SeparateDJong(wJongsung);
  1874. }
  1875. ///////////////////////////////////////////////////////////////////////////
  1876. // Push process
  1877. if (wChosung)
  1878. {
  1879. m_Chosung = m_wInternalCode = wChosung;
  1880. // KiYeok, TiKeut, Pieup, Sios, Cieuc
  1881. if (m_Chosung == _KIYEOK_ || m_Chosung == _TIKEUT_
  1882. || m_Chosung == _PIEUP_|| m_Chosung == _SIOS_ || m_Chosung == _CIEUC_)
  1883. m_CurState = 2; // Double Chosung possible state
  1884. else
  1885. m_CurState = 1; // Chosung state
  1886. MakeComposition();
  1887. }
  1888. if (wJungsung[0])
  1889. {
  1890. m_Jungsung = m_wInternalCode = wJungsung[0];
  1891. if (m_Jungsung == _O_ || m_Jungsung == _U_ || m_Jungsung == _EU_)
  1892. m_CurState = 4; // Double Jungsung possible state
  1893. else
  1894. m_CurState = 3; // Single Jungsung state
  1895. MakeComposition();
  1896. }
  1897. if (wJungsung[1])
  1898. {
  1899. DbgAssert(wJungsung[0] == _O_|| wJungsung[0] == _U_ || wJungsung[0] == _EU_);
  1900. m_wInternalCode = wJungsung[1];
  1901. m_Jungsung = FindJunsungComb(wJungsung[0]);
  1902. DbgAssert(m_Jungsung);
  1903. m_CurState = 3; // Jungsung state
  1904. MakeComposition();
  1905. }
  1906. //
  1907. if (wJongsung[0])
  1908. {
  1909. m_wInternalCode = wJongsung[0];
  1910. m_Jongsung = wJongsung[0];
  1911. // KiYeok, Nieun, Rieul, Pieup and Sios: Double jongsong possible chars.
  1912. if (m_Jongsung == _JONG_KIYEOK_ || m_Jongsung == _JONG_NIEUN_
  1913. || m_Jongsung == _JONG_RIEUL_ || m_Jongsung == _JONG_PIEUP_ || m_Jongsung == _JONG_SIOS_)
  1914. m_CurState = 6; // Double Jongsung possible state
  1915. else
  1916. m_CurState = 5; // Single Jongsung state
  1917. MakeComposition();
  1918. }
  1919. if (wJongsung[1])
  1920. {
  1921. DbgAssert(m_Jongsung == _JONG_KIYEOK_ || m_Jongsung == _JONG_NIEUN_
  1922. || m_Jongsung == _JONG_RIEUL_ || m_Jongsung == _JONG_PIEUP_ || m_Jongsung == _JONG_SIOS_);
  1923. m_wInternalCode = wJongsung[1];
  1924. m_Jongsung = FindJonsungComb(wJongsung[0]);
  1925. DbgAssert(m_Jongsung);
  1926. m_CurState = 5; // Jongsung state
  1927. MakeComposition();
  1928. }
  1929. return fTrue;
  1930. }