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.

2023 lines
81 KiB

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