|
|
///////////////////////////////////////////////////////////////////////////////
// Hangul automata Class definition
//
// Author: [email protected]
//
// Copyright 1997 Microsoft Corporation.
#include "private.h"
#include "HAuto.h"
// Code conversion table from Chosung to Jongsung.
const BYTE CHangulAutomata::Cho2Jong[NUM_OF_CHOSUNG+1] = //(+ 1 means including fill code at 0)
{ 0, 1, 2, 4, 7, 0, 8, 16, 17, 0, 19, 20, 21, 22, 0, 23, 24, 25, 26, 27 };
// Code conversion table from Jongsung to Chosung.
const BYTE CHangulAutomata::Jong2Cho[NUM_OF_JONGSUNG] = // Jongsung has inherent fill code
{ 0, 1, 2, 0, 3, 0, 0, 4, 6, 0, 0, 0, 0, 0, 0, 0, 7, 8, 0, 10, 11, 12, 13, 15, 16, 17, 18, 19 };
// Combination table for double jongsung.
BYTE CHangulAutomata2::rgbDJongTbl[NUM_OF_DOUBLE_JONGSUNG_2BEOL+1][3] = { { 1, 19, 3 }, { 4, 22, 5 }, { 4, 27, 6 }, { 8, 1, 9 }, { 8, 16, 10 }, { 8, 17, 11 }, { 8, 19, 12 }, { 8, 25, 13 }, { 8, 26, 14 }, { 8, 27, 15 }, { 17, 19, 18 }, { 0, 0, 0 } };
BYTE CHangulAutomata3::rgbDJongTbl[NUM_OF_DOUBLE_JONGSUNG_3BEOL+1][3] = { // 3Beolsik has two more Double Jongsung conditions.
{ 1, 1, 2 }, // KiYeok+KiYeok = Double KiYeok
{ 1, 19, 3 }, { 4, 22, 5 }, { 4, 27, 6 }, { 8, 1, 9 }, { 8, 16, 10 }, { 8, 17, 11 }, { 8, 19, 12 }, { 8, 25, 13 }, { 8, 26, 14 }, { 8, 27, 15 }, { 17, 19, 18 }, { 19, 19, 20 }, // Sios+Sios = Double Sios
{ 0, 0, 0 } };
#if (NOT_USED)
static WORD CHangulAutomata::DblJong2Cho(WORD DblJong) { BYTE (*pDbl)[3] = rgbDJongTbl; int i = NUM_OF_DOUBLE_JONGSUNG; for (; i>0; i--, pDbl--) if ( (*pDbl)[2] == DblJong ) return Jong2Cho[(*pDbl)[1]];
return 0; } #endif
///////////////////////////////////////////////////////////////////////////////
// 2 beolsik input state category
const WORD CHangulAutomata2::H_CONSONANT = 0x0000 | H_HANGUL; // Consonant
const WORD CHangulAutomata2::H_VOWEL = 0x0100 | H_HANGUL; // Vowel
const WORD CHangulAutomata2::H_DOUBLE = 0x0200 | H_HANGUL; // Double combination possible
const WORD CHangulAutomata2::H_ONLYCHO = 0x0400 | H_HANGUL; // Chosung only
// 3 beolsik input state category
const WORD CHangulAutomata3::H_CHOSUNG = 0x0000 | H_HANGUL; // ChoSung
const WORD CHangulAutomata3::H_JUNGSUNG = 0x0200 | H_HANGUL; // JungSung
const WORD CHangulAutomata3::H_JONGSUNG = 0x0400 | H_HANGUL; // JongSung
const WORD CHangulAutomata3::H_DOUBLE = 0x0100 | H_HANGUL; // Double combination possible
///////////////////////////////////////////////////////////////////////////////
// bHTable[] structure
//
// 2 Beolsik
// H I G H B Y T E L O W B Y T E
// 7 6 5 4 3 2 1 0 7 6 5 4 3 2 1 0
// +-+-------+-----+---------------+
// | | | | |
// +-+-------+-----+---------------+
// High 8 : Hangul or English
// High 2-0 : used for input state category field.
// Low 4-0 : Hangul component code (internal code)
//
// ====-- SHARED SECTION START --====
#pragma data_seg(".MSIMESHR")
WORD CHangulAutomata2::wHTable[256][2] = { // { Hangul normal, Hangul shift, English normal, English shift }
// 2 BeolSik
{ 0x00, 0x00 }, // 0, 0x00:
{ 0x00, 0x00 }, // 1, 0x01: VK_LBUTTON
{ 0x00, 0x00 }, // 2, 0x02: VK_RBUTTON
{ 0x00, 0x00 }, // 3, 0x03: VK_CANCEL
{ 0x00, 0x00 }, // 4, 0x04: VK_MBUTTON
{ 0x00, 0x00 }, // 5, 0x05:
{ 0x00, 0x00 }, // 6, 0x06:
{ 0x00, 0x00 }, // 7, 0x07:
{ 0x00, 0x00 }, // 8, 0x08: VK_BACK
{ 0x00, 0x00 }, // 9, 0x09: VK_TAB
{ 0x00, 0x00 }, // 10, 0x0A:
{ 0x00, 0x00 }, // 11, 0x0B:
{ 0x00, 0x00 }, // 12, 0x0C: VK_CLEAR
{ 0x00, 0x00 }, // 13, 0x0D: VK_RETURN
{ 0x00, 0x00 }, // 14, 0x0E:
{ 0x00, 0x00 }, // 15, 0x0F:
{ 0x00, 0x00 }, // 16, 0x10: VK_SHIFT
{ 0x00, 0x00 }, // 17, 0x11: VK_CONTROL
{ 0x00, 0x00 }, // 18, 0x12: VK_MENU
{ 0x00, 0x00 }, // 19, 0x13: VK_PAUSE
{ 0x00, 0x00 }, // 20, 0x14: VK_CAPITAL
{ 0x00, 0x00 }, // 21, 0x15: VK_HANGUL
{ 0x00, 0x00 }, // 22, 0x16:
{ 0x00, 0x00 }, // 23, 0x17: VK_JUNJA
{ 0x00, 0x00 }, // 24, 0x18:
{ 0x00, 0x00 }, // 25, 0x19: VK_HANJA
{ 0x00, 0x00 }, // 26, 0x1A:
{ 0x00, 0x00 }, // 27, 0x1B: VK_ESCAPE
{ 0x00, 0x00 }, // 28, 0x1C:
{ 0x00, 0x00 }, // 29, 0x1D:
{ 0x00, 0x00 }, // 30, 0x1E:
{ 0x00, 0x00 }, // 31, 0x1F:
{ 0x20, 0x20 }, // 32, 0x20: VK_SPACE
{ 0x00, 0x00 }, // 33, 0x21: VK_PRIOR
{ 0x00, 0x00 }, // 34, 0x22: VK_NEXT
{ 0x00, 0x00 }, // 35, 0x23: VK_END
{ 0x00, 0x00 }, // 36, 0x24: VK_HOME
{ 0x00, 0x00 }, // 37, 0x25: VK_LEFT
{ 0x00, 0x00 }, // 38, 0x26: VK_UP
{ 0x00, 0x00 }, // 39, 0x27: VK_RIGHT
{ 0x00, 0x00 }, // 40, 0x28: VK_DOWN
{ 0x00, 0x00 }, // 41, 0x29: VK_SELECT
{ 0x00, 0x00 }, // 42, 0x2A: VK_PRINT
{ 0x00, 0x00 }, // 43, 0x2B: VK_EXECUTE
{ 0x00, 0x00 }, // 44, 0x2C: VK_SNAPSHOT
{ 0x00, 0x00 }, // 45, 0x2D: VK_INSERT
{ 0x00, 0x00 }, // 46, 0x2E: VK_DELETE
{ 0x00, 0x00 }, // 47, 0x2F: VK_HELP
{ 0x30, 0x29 }, // 48, 0x30: VK_0
{ 0x31, 0x21 }, // 49, 0x31: VK_1
{ 0x32, 0x40 }, // 50, 0x32: VK_2
{ 0x33, 0x23 }, // 51, 0x33: VK_3
{ 0x34, 0x24 }, // 52, 0x34: VK_4
{ 0x35, 0x25 }, // 53, 0x35: VK_5
{ 0x36, 0x5E }, // 54, 0x36: VK_6
{ 0x37, 0x26 }, // 55, 0x37: VK_7
{ 0x38, 0x2A }, // 56, 0x38: VK_8
{ 0x39, 0x28 }, // 57, 0x39: VK_9
{ 0x00, 0x00 }, // 58, 0x3A:
{ 0x00, 0x00 }, // 59, 0x3B:
{ 0x00, 0x00 }, // 60, 0x3C:
{ 0x00, 0x00 }, // 61, 0x3D:
{ 0x00, 0x00 }, // 62, 0x3E:
{ 0x00, 0x00 }, // 63, 0x3F:
{ 0x00, 0x00 }, // 64, 0x40:
{ 7 | H_CONSONANT, 7 | H_CONSONANT }, // 65, 0x41: VK_A �� ��
{ 18 | H_VOWEL, 18 | H_VOWEL }, // 66, 0x42: VK_B �� ��
{ 15 | H_CONSONANT, 15 | H_CONSONANT }, // 67, 0x43: VK_C �� ��
{ 12 | H_CONSONANT, 12 | H_CONSONANT }, // 68, 0x44: VK_D �� ��
{ 4 | H_CONSONANT, 5 | H_ONLYCHO}, // 69, 0x45: VK_E �� ��
{ 6 | H_CONSONANT | H_DOUBLE, 6 | H_CONSONANT | H_DOUBLE }, // 70, 0x46: VK_F �� ��
{ 19 | H_CONSONANT, 19 | H_CONSONANT }, // 71, 0x47: VK_G �� ��
{ 9 | H_VOWEL | H_DOUBLE, 9 | H_VOWEL | H_DOUBLE }, // 72, 0x48: VK_H �� ��
{ 3 | H_VOWEL, 3 | H_VOWEL }, // 73, 0x49: VK_I �� ��
{ 5 | H_VOWEL, 5 | H_VOWEL }, // 74, 0x4A: VK_J �� ��
{ 1 | H_VOWEL, 1 | H_VOWEL }, // 75, 0x4B: VK_K �� ��
{ 21 | H_VOWEL, 21 | H_VOWEL }, // 76, 0x4C: VK_L �� ��
{ 19 | H_VOWEL | H_DOUBLE, 19 | H_VOWEL | H_DOUBLE }, // 77, 0x4D: VK_M �� ��
{ 14 | H_VOWEL | H_DOUBLE, 14 | H_VOWEL | H_DOUBLE }, // 78, 0x4E: VK_N �� ��
{ 2 | H_VOWEL, 4 | H_VOWEL }, // 79, 0x4F: VK_O �� ��
{ 6 | H_VOWEL, 8 | H_VOWEL }, // 80, 0x50: VK_P �� ��
{ 8 | H_CONSONANT | H_DOUBLE, 9 | H_ONLYCHO }, // 81, 0x51: VK_Q �� ��
{ 1 | H_CONSONANT | H_DOUBLE, 2 | H_CONSONANT }, // 82, 0x52: VK_R �� ��
{ 3 | H_CONSONANT | H_DOUBLE, 3 | H_CONSONANT | H_DOUBLE }, // 83, 0x53: VK_S �� ��
{ 10 | H_CONSONANT, 11 | H_CONSONANT }, // 84, 0x54: VK_T �� ��
{ 7 | H_VOWEL, 7 | H_VOWEL }, // 85, 0x55: VK_U �� ��
{ 18 | H_CONSONANT, 18 | H_CONSONANT }, // 86, 0x56: VK_V �� ��
{ 13 | H_CONSONANT, 14 | H_ONLYCHO }, // 87, 0x57: VK_W �� ��
{ 17 | H_CONSONANT, 17 | H_CONSONANT }, // 88, 0x58: VK_X �� ��
{ 13 | H_VOWEL, 13 | H_VOWEL }, // 89, 0x59: VK_Y �� ��
{ 16 | H_CONSONANT, 16 | H_CONSONANT }, // 90, 0x5A: VK_Z �� ��
{ 0x00, 0x00 }, // 91, 0x5B:
{ 0x00, 0x00 }, // 92, 0x5C:
{ 0x00, 0x00 }, // 93, 0x5D:
{ 0x00, 0x00 }, // 94, 0x5E:
{ 0x00, 0x00 }, // 95, 0x5F:
{ 0x30, 0x00 }, // 96, 0x60: VK_NUMPAD0
{ 0x31, 0x00 }, // 97, 0x61: VK_NUMPAD1
{ 0x32, 0x00 }, // 98, 0x62: VK_NUMPAD2
{ 0x33, 0x00 }, // 99, 0x63: VK_NUMPAD3
{ 0x34, 0x00 }, // 100, 0x64: VK_NUMPAD4
{ 0x35, 0x00 }, // 101, 0x65: VK_NUMPAD5
{ 0x36, 0x00 }, // 102, 0x66: VK_NUMPAD6
{ 0x37, 0x00 }, // 103, 0x67: VK_NUMPAD7
{ 0x38, 0x00 }, // 104, 0x68: VK_NUMPAD8
{ 0x39, 0x00 }, // 105, 0x69: VK_NUMPAD9
{ 0x2A, 0x2A }, // 106, 0x6A: VK_MULTIPLY
{ 0x2B, 0x2B }, // 107, 0x6B: VK_ADD
{ 0x00, 0x00 }, // 108, 0x6C: VK_SEPARATOR
{ 0x2D, 0x2D }, // 109, 0x6D: VK_SUBTRACT
{ 0x2E, 0x00 }, // 110, 0x6E: VK_DECIMAL
{ 0x2F, 0x2F }, // 111, 0x6F: VK_DIVIDE
{ 0x00, 0x00 }, // 112, 0x70: VK_F1
{ 0x00, 0x00 }, // 113, 0x71: VK_F2
{ 0x00, 0x00 }, // 114, 0x72: VK_F3
{ 0x00, 0x00 }, // 115, 0x73: VK_F4
{ 0x00, 0x00 }, // 116, 0x74: VK_F5
{ 0x00, 0x00 }, // 117, 0x75: VK_F6
{ 0x00, 0x00 }, // 118, 0x76: VK_F7
{ 0x00, 0x00 }, // 119, 0x77: VK_F8
{ 0x00, 0x00 }, // 120, 0x78: VK_F9
{ 0x00, 0x00 }, // 121, 0x79: VK_F10
{ 0x00, 0x00 }, // 122, 0x7A: VK_F11
{ 0x00, 0x00 }, // 123, 0x7B: VK_F12
{ 0x00, 0x00 }, // 124, 0x7C: VK_F13
{ 0x00, 0x00 }, // 125, 0x7D: VK_F14
{ 0x00, 0x00 }, // 126, 0x7E: VK_F15
{ 0x00, 0x00 }, // 127, 0x7F: VK_F16
{ 0x00, 0x00 }, // 128, 0x80: VK_F17
{ 0x00, 0x00 }, // 129, 0x81: VK_F18
{ 0x00, 0x00 }, // 130, 0x82: VK_F19
{ 0x00, 0x00 }, // 131, 0x83: VK_F20
{ 0x00, 0x00 }, // 132, 0x84: VK_F21
{ 0x00, 0x00 }, // 133, 0x85: VK_F22
{ 0x00, 0x00 }, // 134, 0x86: VK_F23
{ 0x00, 0x00 }, // 135, 0x87: VK_F24
{ 0x00, 0x00 }, // 136, 0x88:
{ 0x00, 0x00 }, // 137, 0x89:
{ 0x00, 0x00 }, // 138, 0x8A:
{ 0x00, 0x00 }, // 139, 0x8B:
{ 0x00, 0x00 }, // 140, 0x8C:
{ 0x00, 0x00 }, // 141, 0x8D:
{ 0x00, 0x00 }, // 142, 0x8E:
{ 0x00, 0x00 }, // 143, 0x8F:
{ 0x00, 0x00 }, // 144, 0x90: VK_NUMLOCK
{ 0x00, 0x00 }, // 145, 0x91: VK_SCROLL
{ 0x00, 0x00 }, // 146, 0x92:
{ 0x00, 0x00 }, // 147, 0x93:
{ 0x00, 0x00 }, // 148, 0x94:
{ 0x00, 0x00 }, // 149, 0x95:
{ 0x00, 0x00 }, // 150, 0x96:
{ 0x00, 0x00 }, // 151, 0x97:
{ 0x00, 0x00 }, // 152, 0x98:
{ 0x00, 0x00 }, // 153, 0x99:
{ 0x00, 0x00 }, // 154, 0x9A:
{ 0x00, 0x00 }, // 155, 0x9B:
{ 0x00, 0x00 }, // 156, 0x9C:
{ 0x00, 0x00 }, // 157, 0x9D:
{ 0x00, 0x00 }, // 158, 0x9E:
{ 0x00, 0x00 }, // 159, 0x9F:
{ 0x00, 0x00 }, // 160, 0xA0:
{ 0x00, 0x00 }, // 161, 0xA1:
{ 0x00, 0x00 }, // 162, 0xA2:
{ 0x00, 0x00 }, // 163, 0xA3:
{ 0x00, 0x00 }, // 164, 0xA4:
{ 0x00, 0x00 }, // 165, 0xA5:
{ 0x00, 0x00 }, // 166, 0xA6:
{ 0x00, 0x00 }, // 167, 0xA7:
{ 0x00, 0x00 }, // 168, 0xA8:
{ 0x00, 0x00 }, // 169, 0xA9:
{ 0x00, 0x00 }, // 170, 0xAA:
{ 0x00, 0x00 }, // 171, 0xAB:
{ 0x00, 0x00 }, // 172, 0xAC:
{ 0x00, 0x00 }, // 173, 0xAD:
{ 0x00, 0x00 }, // 174, 0xAE:
{ 0x00, 0x00 }, // 175, 0xAF:
{ 0x00, 0x00 }, // 176, 0xB0:
{ 0x00, 0x00 }, // 177, 0xB1:
{ 0x00, 0x00 }, // 178, 0xB2:
{ 0x00, 0x00 }, // 179, 0xB3:
{ 0x00, 0x00 }, // 180, 0xB4:
{ 0x00, 0x00 }, // 181, 0xB5:
{ 0x00, 0x00 }, // 182, 0xB6:
{ 0x00, 0x00 }, // 183, 0xB7:
{ 0x00, 0x00 }, // 184, 0xB8:
{ 0x00, 0x00 }, // 185, 0xB9:
{ 0x3B, 0x3A }, // 186, 0xBA: ; :
{ 0x3D, 0x2B }, // 187, 0xBB: = +
{ 0x2C, 0x3C }, // 188, 0xBC: , <
{ 0x2D, 0x5F }, // 189, 0xBD: - _
{ 0x2E, 0x3E }, // 190, 0xBE: . >
{ 0x2F, 0x3F }, // 191, 0xBF: / ?
{ 0x60, 0x7E }, // 192, 0xC0: ` ~
{ 0x00, 0x00 }, // 193, 0xC1:
{ 0x00, 0x00 }, // 194, 0xC2:
{ 0x00, 0x00 }, // 195, 0xC3:
{ 0x00, 0x00 }, // 196, 0xC4:
{ 0x00, 0x00 }, // 197, 0xC5:
{ 0x00, 0x00 }, // 198, 0xC6:
{ 0x00, 0x00 }, // 199, 0xC7:
{ 0x00, 0x00 }, // 200, 0xC8:
{ 0x00, 0x00 }, // 201, 0xC9:
{ 0x00, 0x00 }, // 202, 0xCA:
{ 0x00, 0x00 }, // 203, 0xCB:
{ 0x00, 0x00 }, // 204, 0xCC:
{ 0x00, 0x00 }, // 205, 0xCD:
{ 0x00, 0x00 }, // 206, 0xCE:
{ 0x00, 0x00 }, // 207, 0xCF:
{ 0x00, 0x00 }, // 208, 0xD0:
{ 0x00, 0x00 }, // 209, 0xD1:
{ 0x00, 0x00 }, // 210, 0xD2:
{ 0x00, 0x00 }, // 211, 0xD3:
{ 0x00, 0x00 }, // 212, 0xD4:
{ 0x00, 0x00 }, // 213, 0xD5:
{ 0x00, 0x00 }, // 214, 0xD6:
{ 0x00, 0x00 }, // 215, 0xD7:
{ 0x00, 0x00 }, // 216, 0xD8:
{ 0x00, 0x00 }, // 217, 0xD9:
{ 0x00, 0x00 }, // 218, 0xDA:
{ 0x5B, 0x7B }, // 219, 0xDB: [ {
{ 0x5C, 0x7C }, // 220, 0xDC: \ |
{ 0x5D, 0x7D }, // 221, 0xDD: ] }
{ 0x27, 0x22 }, // 222, 0xDE: ' "
{ 0x00, 0x00 }, // 223, 0xDF:
{ 0x00, 0x00 }, // 224, 0xE0:
{ 0x00, 0x00 }, // 225, 0xE1:
{ 0x00, 0x00 }, // 226, 0xE2:
{ 0x00, 0x00 }, // 227, 0xE3:
{ 0x00, 0x00 }, // 228, 0xE4:
{ 0x00, 0x00 }, // 229, 0xE5:
{ 0x00, 0x00 }, // 230, 0xE6:
{ 0x00, 0x00 }, // 231, 0xE7:
{ 0x00, 0x00 }, // 232, 0xE8:
{ 0x00, 0x00 }, // 233, 0xE9:
{ 0x00, 0x00 }, // 234, 0xEA:
{ 0x00, 0x00 }, // 235, 0xEB:
{ 0x00, 0x00 }, // 236, 0xEC:
{ 0x00, 0x00 }, // 237, 0xED:
{ 0x00, 0x00 }, // 238, 0xEE:
{ 0x00, 0x00 }, // 239, 0xEF:
{ 0x00, 0x00 }, // 240, 0xF0:
{ 0x00, 0x00 }, // 241, 0xF1:
{ 0x00, 0x00 }, // 242, 0xF2:
{ 0x00, 0x00 }, // 243, 0xF3:
{ 0x00, 0x00 }, // 244, 0xF4:
{ 0x00, 0x00 }, // 245, 0xF5:
{ 0x00, 0x00 }, // 246, 0xF6:
{ 0x00, 0x00 }, // 247, 0xF7:
{ 0x00, 0x00 }, // 248, 0xF8:
{ 0x00, 0x00 }, // 249, 0xF9:
{ 0x00, 0x00 }, // 250, 0xFA:
{ 0x00, 0x00 }, // 251, 0xFB:
{ 0x00, 0x00 }, // 252, 0xFC:
{ 0x00, 0x00 }, // 253, 0xFD:
{ 0x00, 0x00 }, // 254, 0xFE:
{ 0x00, 0x00 } // 255, 0xFF:
};
WORD CHangulAutomata3::wHTable[256][2] = { // 3 BeolSik
{ 0x00, 0x00 }, // 0, 0x00:
{ 0x00, 0x00 }, // 1, 0x01: VK_LBUTTON
{ 0x00, 0x00 }, // 2, 0x02: VK_RBUTTON
{ 0x00, 0x00 }, // 3, 0x03: VK_CANCEL
{ 0x00, 0x00 }, // 4, 0x04: VK_MBUTTON
{ 0x00, 0x00 }, // 5, 0x05:
{ 0x00, 0x00 }, // 6, 0x06:
{ 0x00, 0x00 }, // 7, 0x07:
{ 0x00, 0x00 }, // 8, 0x08: VK_BACK
{ 0x00, 0x00 }, // 9, 0x09: VK_TAB
{ 0x00, 0x00 }, // 10, 0x0A:
{ 0x00, 0x00 }, // 11, 0x0B:
{ 0x00, 0x00 }, // 12, 0x0C: VK_CLEAR
{ 0x00, 0x00 }, // 13, 0x0D: VK_RETURN
{ 0x00, 0x00 }, // 14, 0x0E:
{ 0x00, 0x00 }, // 15, 0x0F:
{ 0x00, 0x00 }, // 16, 0x10: VK_SHIFT
{ 0x00, 0x00 }, // 17, 0x11: VK_CONTROL
{ 0x00, 0x00 }, // 18, 0x12: VK_MENU
{ 0x00, 0x00 }, // 19, 0x13: VK_PAUSE
{ 0x00, 0x00 }, // 20, 0x14: VK_CAPITAL
{ 0x00, 0x00 }, // 21, 0x15: VK_HANGUL
{ 0x00, 0x00 }, // 22, 0x16:
{ 0x00, 0x00 }, // 23, 0x17: VK_JUNJA
{ 0x00, 0x00 }, // 24, 0x18:
{ 0x00, 0x00 }, // 25, 0x19: VK_HANJA
{ 0x00, 0x00 }, // 26, 0x1A:
{ 0x00, 0x00 }, // 27, 0x1B: VK_ESCAPE
{ 0x00, 0x00 }, // 28, 0x1C:
{ 0x00, 0x00 }, // 29, 0x1D:
{ 0x00, 0x00 }, // 30, 0x1E:
{ 0x00, 0x00 }, // 31, 0x1F:
{ 0x20, 0x20 }, // 32, 0x20: VK_SPACE
{ 0x00, 0x00 }, // 33, 0x21: VK_PRIOR
{ 0x00, 0x00 }, // 34, 0x22: VK_NEXT
{ 0x00, 0x00 }, // 35, 0x23: VK_END
{ 0x00, 0x00 }, // 36, 0x24: VK_HOME
{ 0x00, 0x00 }, // 37, 0x25: VK_LEFT
{ 0x00, 0x00 }, // 38, 0x26: VK_UP
{ 0x00, 0x00 }, // 39, 0x27: VK_RIGHT
{ 0x00, 0x00 }, // 40, 0x28: VK_DOWN
{ 0x00, 0x00 }, // 41, 0x29: VK_SELECT
{ 0x00, 0x00 }, // 42, 0x2A: VK_PRINT
{ 0x00, 0x00 }, // 43, 0x2B: VK_EXECUTE
{ 0x00, 0x00 }, // 44, 0x2C: VK_SNAPSHOT
{ 0x00, 0x00 }, // 45, 0x2D: VK_INSERT
{ 0x00, 0x00 }, // 46, 0x2E: VK_DELETE
{ 0x00, 0x00 }, // 47, 0x2F: VK_HELP
{ 16 | H_CHOSUNG, 0x29 }, // 48, 0x30: VK_0 �� )
{ 27 | H_JONGSUNG, 22 | H_JONGSUNG }, // 49, 0x31: VK_1 �� ��
{ 20 | H_JONGSUNG, 0x40 }, // 50, 0x32: VK_2 �� @
{ 17 | H_JONGSUNG | H_DOUBLE, 0x23 }, // 51, 0x33: VK_3 �� #
{ 13 | H_JUNGSUNG, 0x24 }, // 52, 0x34: VK_4 �� $
{ 18 | H_JUNGSUNG, 0x25 }, // 53, 0x35: VK_5 �� %
{ 3 | H_JUNGSUNG, 0x5E }, // 54, 0x36: VK_6 �� ^
{ 8 | H_JUNGSUNG, 0x26 }, // 55, 0x37: VK_7 �� &
{ 20 | H_JUNGSUNG, 0x2A }, // 56, 0x38: VK_8 �� *
{ 14 | H_JUNGSUNG | H_DOUBLE, 0x28 }, // 57, 0x39: VK_9
{ 0x00, 0x00 }, // 58, 0x3A:
{ 0x00, 0x00 }, // 59, 0x3B:
{ 0x00, 0x00 }, // 60, 0x3C:
{ 0x00, 0x00 }, // 61, 0x3D:
{ 0x00, 0x00 }, // 62, 0x3E:
{ 0x00, 0x00 }, // 63, 0x3F:
{ 0x00, 0x00 }, // 64, 0x40:
{ 21 | H_JONGSUNG, 7 | H_JONGSUNG}, // 65, 0x41: VK_A �� ��
{ 14 | H_JUNGSUNG | H_DOUBLE, 0x21 }, // 66, 0x42: VK_B �� !
{ 6 | H_JUNGSUNG, 10 | H_JONGSUNG}, // 67, 0x43: VK_C �� ����
{ 21 | H_JUNGSUNG, 9 | H_JONGSUNG}, // 68, 0x44: VK_D �� ����
{ 7 | H_JUNGSUNG, 24 | H_JONGSUNG}, // 69, 0x45: VK_E �� ��
{ 1 | H_JUNGSUNG, 2 | H_JONGSUNG}, // 70, 0x46: VK_F �� ��
{ 19 | H_JUNGSUNG | H_DOUBLE, 0x2F }, // 71, 0x47: VK_G �� /
{ 3 | H_CHOSUNG, 0x27 }, // 72, 0x48: VK_H �� ,
{ 7 | H_CHOSUNG, 0x38 }, // 73, 0x49: VK_I �� 8
{ 12 | H_CHOSUNG, 0x34 }, // 74, 0x4A: VK_J �� 4
{ 1 | H_CHOSUNG | H_DOUBLE, 0x35 }, // 75, 0x4B: VK_K �� 5
{ 13 | H_CHOSUNG | H_DOUBLE, 0x36 }, // 76, 0x4C: VK_L �� 6
{ 19 | H_CHOSUNG, 0x31 }, // 77, 0x4D: VK_M �� 1
{ 10 | H_CHOSUNG | H_DOUBLE, 0x30 }, // 78, 0x4E: VK_N �� 0
{ 15 | H_CHOSUNG, 0x39 }, // 79, 0x4F: VK_O �� 9
{ 18 | H_CHOSUNG, 0x3E }, // 80, 0x50: VK_P �� >
{ 19 | H_JONGSUNG | H_DOUBLE, 26 | H_JONGSUNG}, // 81, 0x51: VK_Q �� ��
{ 2 | H_JUNGSUNG, 4 | H_JUNGSUNG}, // 82, 0x52: VK_R �� ��
{ 4 | H_JONGSUNG | H_DOUBLE, 6 | H_JONGSUNG}, // 83, 0x53: VK_S �� ����
{ 5 | H_JUNGSUNG, 0x3B }, // 84, 0x54: VK_T �� ;
{ 4 | H_CHOSUNG | H_DOUBLE, 0x37 }, // 85, 0x55: VK_U �� 7
{ 9 | H_JUNGSUNG | H_DOUBLE, 15 | H_JONGSUNG }, // 86, 0x56: VK_V �� ����
{ 8 | H_JONGSUNG | H_DOUBLE, 25 | H_JONGSUNG}, // 87, 0x57: VK_W �� ��
{ 1 | H_JONGSUNG | H_DOUBLE, 18 | H_JONGSUNG }, // 88, 0x58: VK_X �� ����
{ 6 | H_CHOSUNG, 0x3C }, // 89, 0x59: VK_Y �� <
{ 16 | H_JONGSUNG, 23 | H_JONGSUNG }, // 90, 0x5A: VK_Z �� ��
{ 0x00, 0x00 }, // 91, 0x5B:
{ 0x00, 0x00 }, // 92, 0x5C:
{ 0x00, 0x00 }, // 93, 0x5D:
{ 0x00, 0x00 }, // 94, 0x5E:
{ 0x00, 0x00 }, // 95, 0x5F:
{ 0x30, 0x00 }, // 96, 0x60: VK_NUMPAD0
{ 0x31, 0x00 }, // 97, 0x61: VK_NUMPAD1
{ 0x32, 0x00 }, // 98, 0x62: VK_NUMPAD2
{ 0x33, 0x00 }, // 99, 0x63: VK_NUMPAD3
{ 0x34, 0x00 }, // 100, 0x64: VK_NUMPAD4
{ 0x35, 0x00 }, // 101, 0x65: VK_NUMPAD5
{ 0x36, 0x00 }, // 102, 0x66: VK_NUMPAD6
{ 0x37, 0x00 }, // 103, 0x67: VK_NUMPAD7
{ 0x38, 0x00 }, // 104, 0x68: VK_NUMPAD8
{ 0x39, 0x00 }, // 105, 0x69: VK_NUMPAD9
{ 0x2A, 0x2A }, // 106, 0x6A: VK_MULTIPLY
{ 0x2B, 0x2B }, // 107, 0x6B: VK_ADD
{ 0x00, 0x00 }, // 108, 0x6C: VK_SEPARATOR
{ 0x2D, 0x2D }, // 109, 0x6D: VK_SUBTRACT
{ 0x2E, 0x00 }, // 110, 0x6E: VK_DECIMAL
{ 0x2F, 0x2F }, // 111, 0x6F: VK_DIVIDE
{ 0x00, 0x00 }, // 112, 0x70: VK_F1
{ 0x00, 0x00 }, // 113, 0x71: VK_F2
{ 0x00, 0x00 }, // 114, 0x72: VK_F3
{ 0x00, 0x00 }, // 115, 0x73: VK_F4
{ 0x00, 0x00 }, // 116, 0x74: VK_F5
{ 0x00, 0x00 }, // 117, 0x75: VK_F6
{ 0x00, 0x00 }, // 118, 0x76: VK_F7
{ 0x00, 0x00 }, // 119, 0x77: VK_F8
{ 0x00, 0x00 }, // 120, 0x78: VK_F9
{ 0x00, 0x00 }, // 121, 0x79: VK_F10
{ 0x00, 0x00 }, // 122, 0x7A: VK_F11
{ 0x00, 0x00 }, // 123, 0x7B: VK_F12
{ 0x00, 0x00 }, // 124, 0x7C: VK_F13
{ 0x00, 0x00 }, // 125, 0x7D: VK_F14
{ 0x00, 0x00 }, // 126, 0x7E: VK_F15
{ 0x00, 0x00 }, // 127, 0x7F: VK_F16
{ 0x00, 0x00 }, // 128, 0x80: VK_F17
{ 0x00, 0x00 }, // 129, 0x81: VK_F18
{ 0x00, 0x00 }, // 130, 0x82: VK_F19
{ 0x00, 0x00 }, // 131, 0x83: VK_F20
{ 0x00, 0x00 }, // 132, 0x84: VK_F21
{ 0x00, 0x00 }, // 133, 0x85: VK_F22
{ 0x00, 0x00 }, // 134, 0x86: VK_F23
{ 0x00, 0x00 }, // 135, 0x87: VK_F24
{ 0x00, 0x00 }, // 136, 0x88:
{ 0x00, 0x00 }, // 137, 0x89:
{ 0x00, 0x00 }, // 138, 0x8A:
{ 0x00, 0x00 }, // 139, 0x8B:
{ 0x00, 0x00 }, // 140, 0x8C:
{ 0x00, 0x00 }, // 141, 0x8D:
{ 0x00, 0x00 }, // 142, 0x8E:
{ 0x00, 0x00 }, // 143, 0x8F:
{ 0x00, 0x00 }, // 144, 0x90: VK_NUMLOCK
{ 0x00, 0x00 }, // 145, 0x91: VK_SCROLL
{ 0x00, 0x00 }, // 146, 0x92:
{ 0x00, 0x00 }, // 147, 0x93:
{ 0x00, 0x00 }, // 148, 0x94:
{ 0x00, 0x00 }, // 149, 0x95:
{ 0x00, 0x00 }, // 150, 0x96:
{ 0x00, 0x00 }, // 151, 0x97:
{ 0x00, 0x00 }, // 152, 0x98:
{ 0x00, 0x00 }, // 153, 0x99:
{ 0x00, 0x00 }, // 154, 0x9A:
{ 0x00, 0x00 }, // 155, 0x9B:
{ 0x00, 0x00 }, // 156, 0x9C:
{ 0x00, 0x00 }, // 157, 0x9D:
{ 0x00, 0x00 }, // 158, 0x9E:
{ 0x00, 0x00 }, // 159, 0x9F:
{ 0x00, 0x00 }, // 160, 0xA0:
{ 0x00, 0x00 }, // 161, 0xA1:
{ 0x00, 0x00 }, // 162, 0xA2:
{ 0x00, 0x00 }, // 163, 0xA3:
{ 0x00, 0x00 }, // 164, 0xA4:
{ 0x00, 0x00 }, // 165, 0xA5:
{ 0x00, 0x00 }, // 166, 0xA6:
{ 0x00, 0x00 }, // 167, 0xA7:
{ 0x00, 0x00 }, // 168, 0xA8:
{ 0x00, 0x00 }, // 169, 0xA9:
{ 0x00, 0x00 }, // 170, 0xAA:
{ 0x00, 0x00 }, // 171, 0xAB:
{ 0x00, 0x00 }, // 172, 0xAC:
{ 0x00, 0x00 }, // 173, 0xAD:
{ 0x00, 0x00 }, // 174, 0xAE:
{ 0x00, 0x00 }, // 175, 0xAF:
{ 0x00, 0x00 }, // 176, 0xB0:
{ 0x00, 0x00 }, // 177, 0xB1:
{ 0x00, 0x00 }, // 178, 0xB2:
{ 0x00, 0x00 }, // 179, 0xB3:
{ 0x00, 0x00 }, // 180, 0xB4:
{ 0x00, 0x00 }, // 181, 0xB5:
{ 0x00, 0x00 }, // 182, 0xB6:
{ 0x00, 0x00 }, // 183, 0xB7:
{ 0x00, 0x00 }, // 184, 0xB8:
{ 0x00, 0x00 }, // 185, 0xB9:
{ 8 | H_CHOSUNG | H_DOUBLE, 0x3A }, // 186, 0xBA: �� :
{ 0x3D, 0x2B }, // 187, 0xBB:
{ 0x2C, 0x32 }, // 188, 0xBC: , 2
{ 0x2D, 0x5F }, // 189, 0xBD:
{ 0x2E, 0x33 }, // 190, 0xBE: . 3
{ 9 | H_JUNGSUNG | H_DOUBLE, 0x3F }, // 191, 0xBF: �� ?
{ 0x60, 0x7E }, // 192, 0xC0:
{ 0x00, 0x00 }, // 193, 0xC1:
{ 0x00, 0x00 }, // 194, 0xC2:
{ 0x00, 0x00 }, // 195, 0xC3:
{ 0x00, 0x00 }, // 196, 0xC4:
{ 0x00, 0x00 }, // 197, 0xC5:
{ 0x00, 0x00 }, // 198, 0xC6:
{ 0x00, 0x00 }, // 199, 0xC7:
{ 0x00, 0x00 }, // 200, 0xC8:
{ 0x00, 0x00 }, // 201, 0xC9:
{ 0x00, 0x00 }, // 202, 0xCA:
{ 0x00, 0x00 }, // 203, 0xCB:
{ 0x00, 0x00 }, // 204, 0xCC:
{ 0x00, 0x00 }, // 205, 0xCD:
{ 0x00, 0x00 }, // 206, 0xCE:
{ 0x00, 0x00 }, // 207, 0xCF:
{ 0x00, 0x00 }, // 208, 0xD0:
{ 0x00, 0x00 }, // 209, 0xD1:
{ 0x00, 0x00 }, // 210, 0xD2:
{ 0x00, 0x00 }, // 211, 0xD3:
{ 0x00, 0x00 }, // 212, 0xD4:
{ 0x00, 0x00 }, // 213, 0xD5:
{ 0x00, 0x00 }, // 214, 0xD6:
{ 0x00, 0x00 }, // 215, 0xD7:
{ 0x00, 0x00 }, // 216, 0xD8:
{ 0x00, 0x00 }, // 217, 0xD9:
{ 0x00, 0x00 }, // 218, 0xDA:
{ 0x5B, 0x7B }, // 219, 0xDB: [ {
{ 0x5C, 0x7C }, // 220, 0xDC: \ |
{ 0x5D, 0x7D }, // 221, 0xDD: ] }
{ 17 | H_CHOSUNG, 0x22 }, // 222, 0xDE: �� "
{ 0x00, 0x00 }, // 223, 0xDF:
{ 0x00, 0x00 }, // 224, 0xE0:
{ 0x00, 0x00 }, // 225, 0xE1:
{ 0x00, 0x00 }, // 226, 0xE2:
{ 0x00, 0x00 }, // 227, 0xE3:
{ 0x00, 0x00 }, // 228, 0xE4:
{ 0x00, 0x00 }, // 229, 0xE5:
{ 0x00, 0x00 }, // 230, 0xE6:
{ 0x00, 0x00 }, // 231, 0xE7:
{ 0x00, 0x00 }, // 232, 0xE8:
{ 0x00, 0x00 }, // 233, 0xE9:
{ 0x00, 0x00 }, // 234, 0xEA:
{ 0x00, 0x00 }, // 235, 0xEB:
{ 0x00, 0x00 }, // 236, 0xEC:
{ 0x00, 0x00 }, // 237, 0xED:
{ 0x00, 0x00 }, // 238, 0xEE:
{ 0x00, 0x00 }, // 239, 0xEF:
{ 0x00, 0x00 }, // 240, 0xF0:
{ 0x00, 0x00 }, // 241, 0xF1:
{ 0x00, 0x00 }, // 242, 0xF2:
{ 0x00, 0x00 }, // 243, 0xF3:
{ 0x00, 0x00 }, // 244, 0xF4:
{ 0x00, 0x00 }, // 245, 0xF5:
{ 0x00, 0x00 }, // 246, 0xF6:
{ 0x00, 0x00 }, // 247, 0xF7:
{ 0x00, 0x00 }, // 248, 0xF8:
{ 0x00, 0x00 }, // 249, 0xF9:
{ 0x00, 0x00 }, // 250, 0xFA:
{ 0x00, 0x00 }, // 251, 0xFB:
{ 0x00, 0x00 }, // 252, 0xFC:
{ 0x00, 0x00 }, // 253, 0xFD:
{ 0x00, 0x00 }, // 254, 0xFE:
{ 0x00, 0x00 } // 255, 0xFF:
};
WORD CHangulAutomata3Final::wHTable[256][2] = { // 3 BeolSik
{ 0x00, 0x00 }, // 0, 0x00:
{ 0x00, 0x00 }, // 1, 0x01: VK_LBUTTON
{ 0x00, 0x00 }, // 2, 0x02: VK_RBUTTON
{ 0x00, 0x00 }, // 3, 0x03: VK_CANCEL
{ 0x00, 0x00 }, // 4, 0x04: VK_MBUTTON
{ 0x00, 0x00 }, // 5, 0x05:
{ 0x00, 0x00 }, // 6, 0x06:
{ 0x00, 0x00 }, // 7, 0x07:
{ 0x00, 0x00 }, // 8, 0x08: VK_BACK
{ 0x00, 0x00 }, // 9, 0x09: VK_TAB
{ 0x00, 0x00 }, // 10, 0x0A:
{ 0x00, 0x00 }, // 11, 0x0B:
{ 0x00, 0x00 }, // 12, 0x0C: VK_CLEAR
{ 0x00, 0x00 }, // 13, 0x0D: VK_RETURN
{ 0x00, 0x00 }, // 14, 0x0E:
{ 0x00, 0x00 }, // 15, 0x0F:
{ 0x00, 0x00 }, // 16, 0x10: VK_SHIFT
{ 0x00, 0x00 }, // 17, 0x11: VK_CONTROL
{ 0x00, 0x00 }, // 18, 0x12: VK_MENU
{ 0x00, 0x00 }, // 19, 0x13: VK_PAUSE
{ 0x00, 0x00 }, // 20, 0x14: VK_CAPITAL
{ 0x00, 0x00 }, // 21, 0x15: VK_HANGUL
{ 0x00, 0x00 }, // 22, 0x16:
{ 0x00, 0x00 }, // 23, 0x17: VK_JUNJA
{ 0x00, 0x00 }, // 24, 0x18:
{ 0x00, 0x00 }, // 25, 0x19: VK_HANJA
{ 0x00, 0x00 }, // 26, 0x1A:
{ 0x00, 0x00 }, // 27, 0x1B: VK_ESCAPE
{ 0x00, 0x00 }, // 28, 0x1C:
{ 0x00, 0x00 }, // 29, 0x1D:
{ 0x00, 0x00 }, // 30, 0x1E:
{ 0x00, 0x00 }, // 31, 0x1F:
{ 0x20, 0x20 }, // 32, 0x20: VK_SPACE
{ 0x00, 0x00 }, // 33, 0x21: VK_PRIOR
{ 0x00, 0x00 }, // 34, 0x22: VK_NEXT
{ 0x00, 0x00 }, // 35, 0x23: VK_END
{ 0x00, 0x00 }, // 36, 0x24: VK_HOME
{ 0x00, 0x00 }, // 37, 0x25: VK_LEFT
{ 0x00, 0x00 }, // 38, 0x26: VK_UP
{ 0x00, 0x00 }, // 39, 0x27: VK_RIGHT
{ 0x00, 0x00 }, // 40, 0x28: VK_DOWN
{ 0x00, 0x00 }, // 41, 0x29: VK_SELECT
{ 0x00, 0x00 }, // 42, 0x2A: VK_PRINT
{ 0x00, 0x00 }, // 43, 0x2B: VK_EXECUTE
{ 0x00, 0x00 }, // 44, 0x2C: VK_SNAPSHOT
{ 0x00, 0x00 }, // 45, 0x2D: VK_INSERT
{ 0x00, 0x00 }, // 46, 0x2E: VK_DELETE
{ 0x00, 0x00 }, // 47, 0x2F: VK_HELP
{ 16 | H_CHOSUNG, 0x7E }, // 48, 0x30: VK_0 �� ~
{ 27 | H_JONGSUNG, 2 | H_JONGSUNG }, // 49, 0x31: VK_1 �� ��
{ 20 | H_JONGSUNG, 9 | H_JONGSUNG }, // 50, 0x32: VK_2 �� ��
{ 17 | H_JONGSUNG|H_DOUBLE, 22 | H_JONGSUNG }, // 51, 0x33: VK_3 �� ��
{ 13 | H_JUNGSUNG, 14 | H_JONGSUNG }, // 52, 0x34: VK_4 �� ��
{ 18 | H_JUNGSUNG, 13 | H_JONGSUNG }, // 53, 0x35: VK_5 �� ��
{ 3 | H_JUNGSUNG, 0x3D }, // 54, 0x36: VK_6 �� =
{ 8 | H_JUNGSUNG, 0x22 }, // 55, 0x37: VK_7 �� "
{ 20 | H_JUNGSUNG, 0x22 }, // 56, 0x38: VK_8 �� "
{ 14 | H_JUNGSUNG | H_DOUBLE, 0x27 }, // 57, 0x39: VK_9 �� '
{ 0x00, 0x00 }, // 58, 0x3A:
{ 0x00, 0x00 }, // 59, 0x3B:
{ 0x00, 0x00 }, // 60, 0x3C:
{ 0x00, 0x00 }, // 61, 0x3D:
{ 0x00, 0x00 }, // 62, 0x3E:
{ 0x00, 0x00 }, // 63, 0x3F:
{ 0x00, 0x00 }, // 64, 0x40:
{ 21 | H_JONGSUNG, 7 | H_JONGSUNG}, // 65, 0x41: VK_A �� ��
{ 14 | H_JUNGSUNG | H_DOUBLE, 0x3F }, // 66, 0x42: VK_B �� ?
{ 6 | H_JUNGSUNG, 24 | H_JONGSUNG}, // 67, 0x43: VK_C �� ��
{ 21 | H_JUNGSUNG, 11 | H_JONGSUNG}, // 68, 0x44: VK_D �� ��
{ 7 | H_JUNGSUNG, 5 | H_JONGSUNG}, // 69, 0x45: VK_E �� ��
{ 1 | H_JUNGSUNG, 10 | H_JONGSUNG}, // 70, 0x46: VK_F �� ��
{ 19 | H_JUNGSUNG | H_DOUBLE, 4 | H_JUNGSUNG }, // 71, 0x47: VK_G �� ��
{ 3 | H_CHOSUNG, 0x30 }, // 72, 0x48: VK_H �� 0
{ 7 | H_CHOSUNG, 0x37 }, // 73, 0x49: VK_I �� 7
{ 12 | H_CHOSUNG, 0x31 }, // 74, 0x4A: VK_J �� 1
{ 1 | H_CHOSUNG | H_DOUBLE, 0x32 }, // 75, 0x4B: VK_K �� 2
{ 13 | H_CHOSUNG | H_DOUBLE, 0x33 }, // 76, 0x4C: VK_L �� 3
{ 19 | H_CHOSUNG, 0x22}, // 77, 0x4D: VK_M �� "
{ 10 | H_CHOSUNG | H_DOUBLE, 0x2D }, // 78, 0x4E: VK_N �� -
{ 15 | H_CHOSUNG, 0x38 }, // 79, 0x4F: VK_O �� 8
{ 18 | H_CHOSUNG, 0x39 }, // 80, 0x50: VK_P �� 9
{ 19 | H_JONGSUNG | H_DOUBLE, 26 | H_JONGSUNG}, // 81, 0x51: VK_Q �� ��
{ 2 | H_JUNGSUNG, 15 | H_JONGSUNG}, // 82, 0x52: VK_R �� ��
{ 4 | H_JONGSUNG | H_DOUBLE, 6 | H_JONGSUNG}, // 83, 0x53: VK_S �� ����
{ 5 | H_JUNGSUNG, 12 | H_JONGSUNG }, // 84, 0x54: VK_T �� ��
{ 4 | H_CHOSUNG | H_DOUBLE, 0x36 }, // 85, 0x55: VK_U �� 6
{ 9 | H_JUNGSUNG | H_DOUBLE, 3 | H_JONGSUNG }, // 86, 0x56: VK_V �� ��
{ 8 | H_JONGSUNG | H_DOUBLE, 25 | H_JONGSUNG}, // 87, 0x57: VK_W �� ��
{ 1 | H_JONGSUNG | H_DOUBLE, 18 | H_JONGSUNG }, // 88, 0x58: VK_X �� ����
{ 6 | H_CHOSUNG, 0x35 }, // 89, 0x59: VK_Y �� 5
{ 16 | H_JONGSUNG, 23 | H_JONGSUNG }, // 90, 0x5A: VK_Z �� ��
{ 0x00, 0x00 }, // 91, 0x5B:
{ 0x00, 0x00 }, // 92, 0x5C:
{ 0x00, 0x00 }, // 93, 0x5D:
{ 0x00, 0x00 }, // 94, 0x5E:
{ 0x00, 0x00 }, // 95, 0x5F:
{ 0x30, 0x00 }, // 96, 0x60: VK_NUMPAD0
{ 0x31, 0x00 }, // 97, 0x61: VK_NUMPAD1
{ 0x32, 0x00 }, // 98, 0x62: VK_NUMPAD2
{ 0x33, 0x00 }, // 99, 0x63: VK_NUMPAD3
{ 0x34, 0x00 }, // 100, 0x64: VK_NUMPAD4
{ 0x35, 0x00 }, // 101, 0x65: VK_NUMPAD5
{ 0x36, 0x00 }, // 102, 0x66: VK_NUMPAD6
{ 0x37, 0x00 }, // 103, 0x67: VK_NUMPAD7
{ 0x38, 0x00 }, // 104, 0x68: VK_NUMPAD8
{ 0x39, 0x00 }, // 105, 0x69: VK_NUMPAD9
{ 0x2A, 0x2A }, // 106, 0x6A: VK_MULTIPLY
{ 0x2B, 0x2B }, // 107, 0x6B: VK_ADD
{ 0x00, 0x00 }, // 108, 0x6C: VK_SEPARATOR
{ 0x2D, 0x2D }, // 109, 0x6D: VK_SUBTRACT
{ 0x2E, 0x00 }, // 110, 0x6E: VK_DECIMAL
{ 0x2F, 0x2F }, // 111, 0x6F: VK_DIVIDE
{ 0x00, 0x00 }, // 112, 0x70: VK_F1
{ 0x00, 0x00 }, // 113, 0x71: VK_F2
{ 0x00, 0x00 }, // 114, 0x72: VK_F3
{ 0x00, 0x00 }, // 115, 0x73: VK_F4
{ 0x00, 0x00 }, // 116, 0x74: VK_F5
{ 0x00, 0x00 }, // 117, 0x75: VK_F6
{ 0x00, 0x00 }, // 118, 0x76: VK_F7
{ 0x00, 0x00 }, // 119, 0x77: VK_F8
{ 0x00, 0x00 }, // 120, 0x78: VK_F9
{ 0x00, 0x00 }, // 121, 0x79: VK_F10
{ 0x00, 0x00 }, // 122, 0x7A: VK_F11
{ 0x00, 0x00 }, // 123, 0x7B: VK_F12
{ 0x00, 0x00 }, // 124, 0x7C: VK_F13
{ 0x00, 0x00 }, // 125, 0x7D: VK_F14
{ 0x00, 0x00 }, // 126, 0x7E: VK_F15
{ 0x00, 0x00 }, // 127, 0x7F: VK_F16
{ 0x00, 0x00 }, // 128, 0x80: VK_F17
{ 0x00, 0x00 }, // 129, 0x81: VK_F18
{ 0x00, 0x00 }, // 130, 0x82: VK_F19
{ 0x00, 0x00 }, // 131, 0x83: VK_F20
{ 0x00, 0x00 }, // 132, 0x84: VK_F21
{ 0x00, 0x00 }, // 133, 0x85: VK_F22
{ 0x00, 0x00 }, // 134, 0x86: VK_F23
{ 0x00, 0x00 }, // 135, 0x87: VK_F24
{ 0x00, 0x00 }, // 136, 0x88:
{ 0x00, 0x00 }, // 137, 0x89:
{ 0x00, 0x00 }, // 138, 0x8A:
{ 0x00, 0x00 }, // 139, 0x8B:
{ 0x00, 0x00 }, // 140, 0x8C:
{ 0x00, 0x00 }, // 141, 0x8D:
{ 0x00, 0x00 }, // 142, 0x8E:
{ 0x00, 0x00 }, // 143, 0x8F:
{ 0x00, 0x00 }, // 144, 0x90: VK_NUMLOCK
{ 0x00, 0x00 }, // 145, 0x91: VK_SCROLL
{ 0x00, 0x00 }, // 146, 0x92:
{ 0x00, 0x00 }, // 147, 0x93:
{ 0x00, 0x00 }, // 148, 0x94:
{ 0x00, 0x00 }, // 149, 0x95:
{ 0x00, 0x00 }, // 150, 0x96:
{ 0x00, 0x00 }, // 151, 0x97:
{ 0x00, 0x00 }, // 152, 0x98:
{ 0x00, 0x00 }, // 153, 0x99:
{ 0x00, 0x00 }, // 154, 0x9A:
{ 0x00, 0x00 }, // 155, 0x9B:
{ 0x00, 0x00 }, // 156, 0x9C:
{ 0x00, 0x00 }, // 157, 0x9D:
{ 0x00, 0x00 }, // 158, 0x9E:
{ 0x00, 0x00 }, // 159, 0x9F:
{ 0x00, 0x00 }, // 160, 0xA0:
{ 0x00, 0x00 }, // 161, 0xA1:
{ 0x00, 0x00 }, // 162, 0xA2:
{ 0x00, 0x00 }, // 163, 0xA3:
{ 0x00, 0x00 }, // 164, 0xA4:
{ 0x00, 0x00 }, // 165, 0xA5:
{ 0x00, 0x00 }, // 166, 0xA6:
{ 0x00, 0x00 }, // 167, 0xA7:
{ 0x00, 0x00 }, // 168, 0xA8:
{ 0x00, 0x00 }, // 169, 0xA9:
{ 0x00, 0x00 }, // 170, 0xAA:
{ 0x00, 0x00 }, // 171, 0xAB:
{ 0x00, 0x00 }, // 172, 0xAC:
{ 0x00, 0x00 }, // 173, 0xAD:
{ 0x00, 0x00 }, // 174, 0xAE:
{ 0x00, 0x00 }, // 175, 0xAF:
{ 0x00, 0x00 }, // 176, 0xB0:
{ 0x00, 0x00 }, // 177, 0xB1:
{ 0x00, 0x00 }, // 178, 0xB2:
{ 0x00, 0x00 }, // 179, 0xB3:
{ 0x00, 0x00 }, // 180, 0xB4:
{ 0x00, 0x00 }, // 181, 0xB5:
{ 0x00, 0x00 }, // 182, 0xB6:
{ 0x00, 0x00 }, // 183, 0xB7:
{ 0x00, 0x00 }, // 184, 0xB8:
{ 0x00, 0x00 }, // 185, 0xB9:
{ 8 | H_CHOSUNG | H_DOUBLE, 0x34 }, // 186, 0xBA: �� 4
{ 0x3E, 0x2B }, // 187, 0xBB: > +
{ 0x2C, 0x2C }, // 188, 0xBC: , ,
{ 0x29, 0x3B }, // 189, 0xBD: ) ;
{ 0x2E, 0x2E }, // 190, 0xBE: . .
{ 9 | H_JUNGSUNG | H_DOUBLE, 0x21 }, // 191, 0xBF: �� !
{ 0x60, 0x7E }, // 192, 0xC0:
{ 0x00, 0x00 }, // 193, 0xC1:
{ 0x00, 0x00 }, // 194, 0xC2:
{ 0x00, 0x00 }, // 195, 0xC3:
{ 0x00, 0x00 }, // 196, 0xC4:
{ 0x00, 0x00 }, // 197, 0xC5:
{ 0x00, 0x00 }, // 198, 0xC6:
{ 0x00, 0x00 }, // 199, 0xC7:
{ 0x00, 0x00 }, // 200, 0xC8:
{ 0x00, 0x00 }, // 201, 0xC9:
{ 0x00, 0x00 }, // 202, 0xCA:
{ 0x00, 0x00 }, // 203, 0xCB:
{ 0x00, 0x00 }, // 204, 0xCC:
{ 0x00, 0x00 }, // 205, 0xCD:
{ 0x00, 0x00 }, // 206, 0xCE:
{ 0x00, 0x00 }, // 207, 0xCF:
{ 0x00, 0x00 }, // 208, 0xD0:
{ 0x00, 0x00 }, // 209, 0xD1:
{ 0x00, 0x00 }, // 210, 0xD2:
{ 0x00, 0x00 }, // 211, 0xD3:
{ 0x00, 0x00 }, // 212, 0xD4:
{ 0x00, 0x00 }, // 213, 0xD5:
{ 0x00, 0x00 }, // 214, 0xD6:
{ 0x00, 0x00 }, // 215, 0xD7:
{ 0x00, 0x00 }, // 216, 0xD8:
{ 0x00, 0x00 }, // 217, 0xD9:
{ 0x00, 0x00 }, // 218, 0xDA:
{ 0x28, 0x25 }, // 219, 0xDB: ( %
{ 0x3A, 0x5C }, // 220, 0xDC: : '\'
{ 0x3C, 0x2F }, // 221, 0xDD: < /
{ 17 | H_CHOSUNG, 0x00 }, // 222, 0xDE: ��
{ 0x00, 0x00 }, // 223, 0xDF:
{ 0x00, 0x00 }, // 224, 0xE0:
{ 0x00, 0x00 }, // 225, 0xE1:
{ 0x00, 0x00 }, // 226, 0xE2:
{ 0x00, 0x00 }, // 227, 0xE3:
{ 0x00, 0x00 }, // 228, 0xE4:
{ 0x00, 0x00 }, // 229, 0xE5:
{ 0x00, 0x00 }, // 230, 0xE6:
{ 0x00, 0x00 }, // 231, 0xE7:
{ 0x00, 0x00 }, // 232, 0xE8:
{ 0x00, 0x00 }, // 233, 0xE9:
{ 0x00, 0x00 }, // 234, 0xEA:
{ 0x00, 0x00 }, // 235, 0xEB:
{ 0x00, 0x00 }, // 236, 0xEC:
{ 0x00, 0x00 }, // 237, 0xED:
{ 0x00, 0x00 }, // 238, 0xEE:
{ 0x00, 0x00 }, // 239, 0xEF:
{ 0x00, 0x00 }, // 240, 0xF0:
{ 0x00, 0x00 }, // 241, 0xF1:
{ 0x00, 0x00 }, // 242, 0xF2:
{ 0x00, 0x00 }, // 243, 0xF3:
{ 0x00, 0x00 }, // 244, 0xF4:
{ 0x00, 0x00 }, // 245, 0xF5:
{ 0x00, 0x00 }, // 246, 0xF6:
{ 0x00, 0x00 }, // 247, 0xF7:
{ 0x00, 0x00 }, // 248, 0xF8:
{ 0x00, 0x00 }, // 249, 0xF9:
{ 0x00, 0x00 }, // 250, 0xFA:
{ 0x00, 0x00 }, // 251, 0xFB:
{ 0x00, 0x00 }, // 252, 0xFC:
{ 0x00, 0x00 }, // 253, 0xFD:
{ 0x00, 0x00 }, // 254, 0xFE:
{ 0x00, 0x00 } // 255, 0xFF:
};
const BYTE CHangulAutomata::bETable[256][2] = { // English normal, English shift for Junja(Full shape) mode
{ 0x00, 0x00 }, // 0, 0x00:
{ 0x00, 0x00 }, // 1, 0x01: VK_LBUTTON
{ 0x00, 0x00 }, // 2, 0x02: VK_RBUTTON
{ 0x00, 0x00 }, // 3, 0x03: VK_CANCEL
{ 0x00, 0x00 }, // 4, 0x04: VK_MBUTTON
{ 0x00, 0x00 }, // 5, 0x05:
{ 0x00, 0x00 }, // 6, 0x06:
{ 0x00, 0x00 }, // 7, 0x07:
{ 0x00, 0x00 }, // 8, 0x08: VK_BACK
{ 0x00, 0x00 }, // 9, 0x09: VK_TAB
{ 0x00, 0x00 }, // 10, 0x0A:
{ 0x00, 0x00 }, // 11, 0x0B:
{ 0x00, 0x00 }, // 12, 0x0C: VK_CLEAR
{ 0x00, 0x00 }, // 13, 0x0D: VK_RETURN
{ 0x00, 0x00 }, // 14, 0x0E:
{ 0x00, 0x00 }, // 15, 0x0F:
{ 0x00, 0x00 }, // 16, 0x10: VK_SHIFT
{ 0x00, 0x00 }, // 17, 0x11: VK_CONTROL
{ 0x00, 0x00 }, // 18, 0x12: VK_MENU
{ 0x00, 0x00 }, // 19, 0x13: VK_PAUSE
{ 0x00, 0x00 }, // 20, 0x14: VK_CAPITAL
{ 0x00, 0x00 }, // 21, 0x15: VK_HANGUL
{ 0x00, 0x00 }, // 22, 0x16:
{ 0x00, 0x00 }, // 23, 0x17: VK_JUNJA
{ 0x00, 0x00 }, // 24, 0x18:
{ 0x00, 0x00 }, // 25, 0x19: VK_HANJA
{ 0x00, 0x00 }, // 26, 0x1A:
{ 0x00, 0x00 }, // 27, 0x1B: VK_ESCAPE
{ 0x00, 0x00 }, // 28, 0x1C:
{ 0x00, 0x00 }, // 29, 0x1D:
{ 0x00, 0x00 }, // 30, 0x1E:
{ 0x00, 0x00 }, // 31, 0x1F:
{ 0x20, 0x20 }, // 32, 0x20: VK_SPACE
{ 0x00, 0x00 }, // 33, 0x21: VK_PRIOR
{ 0x00, 0x00 }, // 34, 0x22: VK_NEXT
{ 0x00, 0x00 }, // 35, 0x23: VK_END
{ 0x00, 0x00 }, // 36, 0x24: VK_HOME
{ 0x00, 0x00 }, // 37, 0x25: VK_LEFT
{ 0x00, 0x00 }, // 38, 0x26: VK_UP
{ 0x00, 0x00 }, // 39, 0x27: VK_RIGHT
{ 0x00, 0x00 }, // 40, 0x28: VK_DOWN
{ 0x00, 0x00 }, // 41, 0x29: VK_SELECT
{ 0x00, 0x00 }, // 42, 0x2A: VK_PRINT
{ 0x00, 0x00 }, // 43, 0x2B: VK_EXECUTE
{ 0x00, 0x00 }, // 44, 0x2C: VK_SNAPSHOT
{ 0x00, 0x00 }, // 45, 0x2D: VK_INSERT
{ 0x00, 0x00 }, // 46, 0x2E: VK_DELETE
{ 0x00, 0x00 }, // 47, 0x2F: VK_HELP
{ 0x30, 0x29 }, // 48, 0x30: VK_0
{ 0x31, 0x21 }, // 49, 0x31: VK_1
{ 0x32, 0x40 }, // 50, 0x32: VK_2
{ 0x33, 0x23 }, // 51, 0x33: VK_3
{ 0x34, 0x24 }, // 52, 0x34: VK_4
{ 0x35, 0x25 }, // 53, 0x35: VK_5
{ 0x36, 0x5E }, // 54, 0x36: VK_6
{ 0x37, 0x26 }, // 55, 0x37: VK_7
{ 0x38, 0x2A }, // 56, 0x38: VK_8
{ 0x39, 0x28 }, // 57, 0x39: VK_9
{ 0x00, 0x00 }, // 58, 0x3A:
{ 0x00, 0x00 }, // 59, 0x3B:
{ 0x00, 0x00 }, // 60, 0x3C:
{ 0x00, 0x00 }, // 61, 0x3D:
{ 0x00, 0x00 }, // 62, 0x3E:
{ 0x00, 0x00 }, // 63, 0x3F:
{ 0x00, 0x00 }, // 64, 0x40:
{ 0x61, 0x41 }, // 65, 0x41: VK_A
{ 0x62, 0x42 }, // 66, 0x42: VK_B
{ 0x63, 0x43 }, // 67, 0x43: VK_C
{ 0x64, 0x44 }, // 68, 0x44: VK_D
{ 0x65, 0x45 }, // 69, 0x45: VK_E
{ 0x66, 0x46 }, // 70, 0x46: VK_F
{ 0x67, 0x47 }, // 71, 0x47: VK_G
{ 0x68, 0x48 }, // 72, 0x48: VK_H
{ 0x69, 0x49 }, // 73, 0x49: VK_I
{ 0x6A, 0x4A }, // 74, 0x4A: VK_J
{ 0x6B, 0x4B }, // 75, 0x4B: VK_K
{ 0x6C, 0x4C }, // 76, 0x4C: VK_L
{ 0x6D, 0x4D }, // 77, 0x4D: VK_M
{ 0x6E, 0x4E }, // 78, 0x4E: VK_N
{ 0x6F, 0x4F }, // 79, 0x4F: VK_O
{ 0x70, 0x50 }, // 80, 0x50: VK_P
{ 0x71, 0x51 }, // 81, 0x51: VK_Q
{ 0x72, 0x52 }, // 82, 0x52: VK_R
{ 0x73, 0x53 }, // 83, 0x53: VK_S
{ 0x74, 0x54 }, // 84, 0x54: VK_T
{ 0x75, 0x55 }, // 85, 0x55: VK_U
{ 0x76, 0x56 }, // 86, 0x56: VK_V
{ 0x77, 0x57 }, // 87, 0x57: VK_W
{ 0x78, 0x58 }, // 88, 0x58: VK_X
{ 0x79, 0x59 }, // 89, 0x59: VK_Y
{ 0x7A, 0x5A }, // 90, 0x5A: VK_Z
{ 0x00, 0x00 }, // 91, 0x5B:
{ 0x00, 0x00 }, // 92, 0x5C:
{ 0x00, 0x00 }, // 93, 0x5D:
{ 0x00, 0x00 }, // 94, 0x5E:
{ 0x00, 0x00 }, // 95, 0x5F:
{ 0x30, 0x00 }, // 96, 0x60: VK_NUMPAD0
{ 0x31, 0x00 }, // 97, 0x61: VK_NUMPAD1
{ 0x32, 0x00 }, // 98, 0x62: VK_NUMPAD2
{ 0x33, 0x00 }, // 99, 0x63: VK_NUMPAD3
{ 0x34, 0x00 }, // 100, 0x64: VK_NUMPAD4
{ 0x35, 0x00 }, // 101, 0x65: VK_NUMPAD5
{ 0x36, 0x00 }, // 102, 0x66: VK_NUMPAD6
{ 0x37, 0x00 }, // 103, 0x67: VK_NUMPAD7
{ 0x38, 0x00 }, // 104, 0x68: VK_NUMPAD8
{ 0x39, 0x00 }, // 105, 0x69: VK_NUMPAD9
{ 0x2A, 0x2A }, // 106, 0x6A: VK_MULTIPLY
{ 0x2B, 0x2B }, // 107, 0x6B: VK_ADD
{ 0x00, 0x00 }, // 108, 0x6C: VK_SEPARATOR
{ 0x2D, 0x2D }, // 109, 0x6D: VK_SUBTRACT
{ 0x2E, 0x00 }, // 110, 0x6E: VK_DECIMAL
{ 0x2F, 0x2F }, // 111, 0x6F: VK_DIVIDE
{ 0x00, 0x00 }, // 112, 0x70: VK_F1
{ 0x00, 0x00 }, // 113, 0x71: VK_F2
{ 0x00, 0x00 }, // 114, 0x72: VK_F3
{ 0x00, 0x00 }, // 115, 0x73: VK_F4
{ 0x00, 0x00 }, // 116, 0x74: VK_F5
{ 0x00, 0x00 }, // 117, 0x75: VK_F6
{ 0x00, 0x00 }, // 118, 0x76: VK_F7
{ 0x00, 0x00 }, // 119, 0x77: VK_F8
{ 0x00, 0x00 }, // 120, 0x78: VK_F9
{ 0x00, 0x00 }, // 121, 0x79: VK_F10
{ 0x00, 0x00 }, // 122, 0x7A: VK_F11
{ 0x00, 0x00 }, // 123, 0x7B: VK_F12
{ 0x00, 0x00 }, // 124, 0x7C: VK_F13
{ 0x00, 0x00 }, // 125, 0x7D: VK_F14
{ 0x00, 0x00 }, // 126, 0x7E: VK_F15
{ 0x00, 0x00 }, // 127, 0x7F: VK_F16
{ 0x00, 0x00 }, // 128, 0x80: VK_F17
{ 0x00, 0x00 }, // 129, 0x81: VK_F18
{ 0x00, 0x00 }, // 130, 0x82: VK_F19
{ 0x00, 0x00 }, // 131, 0x83: VK_F20
{ 0x00, 0x00 }, // 132, 0x84: VK_F21
{ 0x00, 0x00 }, // 133, 0x85: VK_F22
{ 0x00, 0x00 }, // 134, 0x86: VK_F23
{ 0x00, 0x00 }, // 135, 0x87: VK_F24
{ 0x00, 0x00 }, // 136, 0x88:
{ 0x00, 0x00 }, // 137, 0x89:
{ 0x00, 0x00 }, // 138, 0x8A:
{ 0x00, 0x00 }, // 139, 0x8B:
{ 0x00, 0x00 }, // 140, 0x8C:
{ 0x00, 0x00 }, // 141, 0x8D:
{ 0x00, 0x00 }, // 142, 0x8E:
{ 0x00, 0x00 }, // 143, 0x8F:
{ 0x00, 0x00 }, // 144, 0x90: VK_NUMLOCK
{ 0x00, 0x00 }, // 145, 0x91: VK_SCROLL
{ 0x00, 0x00 }, // 146, 0x92:
{ 0x00, 0x00 }, // 147, 0x93:
{ 0x00, 0x00 }, // 148, 0x94:
{ 0x00, 0x00 }, // 149, 0x95:
{ 0x00, 0x00 }, // 150, 0x96:
{ 0x00, 0x00 }, // 151, 0x97:
{ 0x00, 0x00 }, // 152, 0x98:
{ 0x00, 0x00 }, // 153, 0x99:
{ 0x00, 0x00 }, // 154, 0x9A:
{ 0x00, 0x00 }, // 155, 0x9B:
{ 0x00, 0x00 }, // 156, 0x9C:
{ 0x00, 0x00 }, // 157, 0x9D:
{ 0x00, 0x00 }, // 158, 0x9E:
{ 0x00, 0x00 }, // 159, 0x9F:
{ 0x00, 0x00 }, // 160, 0xA0:
{ 0x00, 0x00 }, // 161, 0xA1:
{ 0x00, 0x00 }, // 162, 0xA2:
{ 0x00, 0x00 }, // 163, 0xA3:
{ 0x00, 0x00 }, // 164, 0xA4:
{ 0x00, 0x00 }, // 165, 0xA5:
{ 0x00, 0x00 }, // 166, 0xA6:
{ 0x00, 0x00 }, // 167, 0xA7:
{ 0x00, 0x00 }, // 168, 0xA8:
{ 0x00, 0x00 }, // 169, 0xA9:
{ 0x00, 0x00 }, // 170, 0xAA:
{ 0x00, 0x00 }, // 171, 0xAB:
{ 0x00, 0x00 }, // 172, 0xAC:
{ 0x00, 0x00 }, // 173, 0xAD:
{ 0x00, 0x00 }, // 174, 0xAE:
{ 0x00, 0x00 }, // 175, 0xAF:
{ 0x00, 0x00 }, // 176, 0xB0:
{ 0x00, 0x00 }, // 177, 0xB1:
{ 0x00, 0x00 }, // 178, 0xB2:
{ 0x00, 0x00 }, // 179, 0xB3:
{ 0x00, 0x00 }, // 180, 0xB4:
{ 0x00, 0x00 }, // 181, 0xB5:
{ 0x00, 0x00 }, // 182, 0xB6:
{ 0x00, 0x00 }, // 183, 0xB7:
{ 0x00, 0x00 }, // 184, 0xB8:
{ 0x00, 0x00 }, // 185, 0xB9:
{ 0x3B, 0x3A }, // 186, 0xBA:
{ 0x3D, 0x2B }, // 187, 0xBB:
{ 0x2C, 0x3C }, // 188, 0xBC:
{ 0x2D, 0x5F }, // 189, 0xBD:
{ 0x2E, 0x3E }, // 190, 0xBE:
{ 0x2F, 0x3F }, // 191, 0xBF:
{ 0x60, 0x7E }, // 192, 0xC0:
{ 0x00, 0x00 }, // 193, 0xC1:
{ 0x00, 0x00 }, // 194, 0xC2:
{ 0x00, 0x00 }, // 195, 0xC3:
{ 0x00, 0x00 }, // 196, 0xC4:
{ 0x00, 0x00 }, // 197, 0xC5:
{ 0x00, 0x00 }, // 198, 0xC6:
{ 0x00, 0x00 }, // 199, 0xC7:
{ 0x00, 0x00 }, // 200, 0xC8:
{ 0x00, 0x00 }, // 201, 0xC9:
{ 0x00, 0x00 }, // 202, 0xCA:
{ 0x00, 0x00 }, // 203, 0xCB:
{ 0x00, 0x00 }, // 204, 0xCC:
{ 0x00, 0x00 }, // 205, 0xCD:
{ 0x00, 0x00 }, // 206, 0xCE:
{ 0x00, 0x00 }, // 207, 0xCF:
{ 0x00, 0x00 }, // 208, 0xD0:
{ 0x00, 0x00 }, // 209, 0xD1:
{ 0x00, 0x00 }, // 210, 0xD2:
{ 0x00, 0x00 }, // 211, 0xD3:
{ 0x00, 0x00 }, // 212, 0xD4:
{ 0x00, 0x00 }, // 213, 0xD5:
{ 0x00, 0x00 }, // 214, 0xD6:
{ 0x00, 0x00 }, // 215, 0xD7:
{ 0x00, 0x00 }, // 216, 0xD8:
{ 0x00, 0x00 }, // 217, 0xD9:
{ 0x00, 0x00 }, // 218, 0xDA:
{ 0x5B, 0x7B }, // 219, 0xDB:
{ 0x5C, 0x7C }, // 220, 0xDC:
{ 0x5D, 0x7D }, // 221, 0xDD:
{ 0x27, 0x22 }, // 222, 0xDE:
{ 0x00, 0x00 }, // 223, 0xDF:
{ 0x00, 0x00 }, // 224, 0xE0:
{ 0x00, 0x00 }, // 225, 0xE1:
{ 0x00, 0x00 }, // 226, 0xE2:
{ 0x00, 0x00 }, // 227, 0xE3:
{ 0x00, 0x00 }, // 228, 0xE4:
{ 0x00, 0x00 }, // 229, 0xE5:
{ 0x00, 0x00 }, // 230, 0xE6:
{ 0x00, 0x00 }, // 231, 0xE7:
{ 0x00, 0x00 }, // 232, 0xE8:
{ 0x00, 0x00 }, // 233, 0xE9:
{ 0x00, 0x00 }, // 234, 0xEA:
{ 0x00, 0x00 }, // 235, 0xEB:
{ 0x00, 0x00 }, // 236, 0xEC:
{ 0x00, 0x00 }, // 237, 0xED:
{ 0x00, 0x00 }, // 238, 0xEE:
{ 0x00, 0x00 }, // 239, 0xEF:
{ 0x00, 0x00 }, // 240, 0xF0:
{ 0x00, 0x00 }, // 241, 0xF1:
{ 0x00, 0x00 }, // 242, 0xF2:
{ 0x00, 0x00 }, // 243, 0xF3:
{ 0x00, 0x00 }, // 244, 0xF4:
{ 0x00, 0x00 }, // 245, 0xF5:
{ 0x00, 0x00 }, // 246, 0xF6:
{ 0x00, 0x00 }, // 247, 0xF7:
{ 0x00, 0x00 }, // 248, 0xF8:
{ 0x00, 0x00 }, // 249, 0xF9:
{ 0x00, 0x00 }, // 250, 0xFA:
{ 0x00, 0x00 }, // 251, 0xFB:
{ 0x00, 0x00 }, // 252, 0xFC:
{ 0x00, 0x00 }, // 253, 0xFD:
{ 0x00, 0x00 }, // 254, 0xFE:
{ 0x00, 0x00 } // 255, 0xFF:
};
static WORD Int2UniCho[NUM_OF_CHOSUNG+1] = { 0, // fill [0]
UNICODE_HANGUL_COMP_JAMO_START + 0, // ��
UNICODE_HANGUL_COMP_JAMO_START + 1, // ��
UNICODE_HANGUL_COMP_JAMO_START + 3, // ��
UNICODE_HANGUL_COMP_JAMO_START + 6, // ��
UNICODE_HANGUL_COMP_JAMO_START + 7, // ��
UNICODE_HANGUL_COMP_JAMO_START + 8, // ��
UNICODE_HANGUL_COMP_JAMO_START + 16, // ��
UNICODE_HANGUL_COMP_JAMO_START + 17, // ��
UNICODE_HANGUL_COMP_JAMO_START + 18, // ��
UNICODE_HANGUL_COMP_JAMO_START + 20, // ��
UNICODE_HANGUL_COMP_JAMO_START + 21, // ��
UNICODE_HANGUL_COMP_JAMO_START + 22, // ��
UNICODE_HANGUL_COMP_JAMO_START + 23, // ��
UNICODE_HANGUL_COMP_JAMO_START + 24, // ��
UNICODE_HANGUL_COMP_JAMO_START + 25, // ��
UNICODE_HANGUL_COMP_JAMO_START + 26, // ��
UNICODE_HANGUL_COMP_JAMO_START + 27, // ��
UNICODE_HANGUL_COMP_JAMO_START + 28, // ��
UNICODE_HANGUL_COMP_JAMO_START + 29, // ��
};
static WORD Int2UniJong[NUM_OF_JONGSUNG] = { 0, // fill [0]
UNICODE_HANGUL_COMP_JAMO_START + 0, // ��
UNICODE_HANGUL_COMP_JAMO_START + 1, // ��
UNICODE_HANGUL_COMP_JAMO_START + 2, // ����
UNICODE_HANGUL_COMP_JAMO_START + 3, // ��
UNICODE_HANGUL_COMP_JAMO_START + 4, // ����
UNICODE_HANGUL_COMP_JAMO_START + 5, // ����
UNICODE_HANGUL_COMP_JAMO_START + 6, // ��
UNICODE_HANGUL_COMP_JAMO_START + 8, // ��
UNICODE_HANGUL_COMP_JAMO_START + 9, // ����
UNICODE_HANGUL_COMP_JAMO_START + 10, // ����
UNICODE_HANGUL_COMP_JAMO_START + 11, // ����
UNICODE_HANGUL_COMP_JAMO_START + 12, // ����
UNICODE_HANGUL_COMP_JAMO_START + 13, // ����
UNICODE_HANGUL_COMP_JAMO_START + 14, // ����
UNICODE_HANGUL_COMP_JAMO_START + 15, // ����
UNICODE_HANGUL_COMP_JAMO_START + 16, // ��
UNICODE_HANGUL_COMP_JAMO_START + 17, // ��
UNICODE_HANGUL_COMP_JAMO_START + 19, // ����
UNICODE_HANGUL_COMP_JAMO_START + 20, // ��
UNICODE_HANGUL_COMP_JAMO_START + 21, // ��
UNICODE_HANGUL_COMP_JAMO_START + 22, // ��
UNICODE_HANGUL_COMP_JAMO_START + 23, // ��
UNICODE_HANGUL_COMP_JAMO_START + 25, // ��
UNICODE_HANGUL_COMP_JAMO_START + 26, // ��
UNICODE_HANGUL_COMP_JAMO_START + 27, // ��
UNICODE_HANGUL_COMP_JAMO_START + 28, // ��
UNICODE_HANGUL_COMP_JAMO_START + 29, // ��
};
// Compatibility Jamo Consonant map
static BYTE CompJamoMapTable[30][2] = { // Jamo code , Jongsung Flag : Only if it can't be chosung then make it jongsung
{ _KIYEOK_, 0 }, { _SSANGKIYEOK_, 0 }, { _JONG_KIYEOK_SIOS, 1 }, { _NIEUN_, 0 }, { _JONG_NIEUN_CHIEUCH_, 1 }, { _JONG_NIEUN_HIEUH_, 1 }, { _TIKEUT_, 0 }, { _SSANGTIKEUT_, 0 }, { _RIEUL_, 0 }, { _JONG_RIEUL_KIYEOK_, 1 }, { _JONG_RIEUL_MIUM_, 1 }, { _JONG_RIEUL_PIEUP_, 1 }, { _JONG_RIEUL_SIOS_, 1 }, { _JONG_RIEUL_THIEUTH_, 1 }, { _JONG_RIEUL_PHIEUPH_, 1 }, { _JONG_RIEUL_HIEUH_, 1 }, { _MIEUM_, 0 }, { _PIEUP_, 0 }, { _SSANGPIEUP_, 0 }, { _JONG_PIEUP_SIOS, 1 }, { _SIOS_, 0 }, { _SSANGSIOS_, 0 }, { _IEUNG_, 0 }, { _CIEUC_, 0 }, { _SSANGCIEUC_, 0 }, { _CHIEUCH_, 0 }, { _KHIEUKH_, 0 }, { _THIEUTH_, 0 }, { _PHIEUPH_, 0 }, { _HIEUH_, 0 }, };
static BYTE JongSungSep[NUM_OF_JONGSUNG][2] = { { 0, 0 }, { _JONG_KIYEOK_, 0 }, //_JONG_KIYEOK_
{ _JONG_SSANGKIYEOK_, 0 }, //_JONG_SSANGKIYEOK_
{ _JONG_KIYEOK_, _JONG_SIOS_ }, //_JONG_KIYEOK_SIOS
{ _JONG_NIEUN_, 0 }, //_JONG_NIEUN_
{ _JONG_NIEUN_, _JONG_CIEUC_ }, //_JONG_NIEUN_CIEUC_
{ _JONG_NIEUN_, _JONG_HIEUH_ }, //_JONG_NIEUN_HIEUH_
{ _JONG_TIKEUT_, 0 }, //_JONG_TIKEUT_
{ _JONG_RIEUL_, 0 }, //_JONG_RIEUL_
{ _JONG_RIEUL_, _JONG_KIYEOK_ }, //_JONG_RIEUL_KIYEOK_
{ _JONG_RIEUL_, _JONG_MIEUM_ }, //_JONG_RIEUL_MIUM_
{ _JONG_RIEUL_, _JONG_PIEUP_ }, //_JONG_RIEUL_PIEUP_
{ _JONG_RIEUL_, _JONG_SIOS_ }, //_JONG_RIEUL_SIOS_
{ _JONG_RIEUL_, _JONG_THIEUTH_ }, //_JONG_RIEUL_THIEUTH_
{ _JONG_RIEUL_, _JONG_PHIEUPH_ }, //_JONG_RIEUL_PHIEUPH_
{ _JONG_RIEUL_, _JONG_HIEUH_ }, //_JONG_RIEUL_HIEUH_
{ _JONG_MIEUM_, 0 }, //_JONG_MIEUM_
{ _JONG_PIEUP_, 0 }, //_JONG_PIEUP_
{ _JONG_PIEUP_, _JONG_SIOS_ }, //_JONG_PIEUP_SIOS
{ _JONG_SIOS_, 0 }, //_JONG_SIOS_
{ _JONG_SSANGSIOS_, 0 }, //_JONG_SSANGSIOS_
{ _JONG_IEUNG_, 0 }, //_JONG_IEUNG_
{ _JONG_CIEUC_, 0 }, //_JONG_CIEUC_
{ _JONG_CHIEUCH_, 0 }, //_JONG_CHIEUCH_
{ _JONG_KHIEUKH_, 0 }, //_JONG_KHIEUKH_
{ _JONG_THIEUTH_, 0 }, //_JONG_THIEUTH_
{ _JONG_PHIEUPH_, 0 }, //_JONG_PHIEUPH_
{ _JONG_HIEUH_, 0 } //_JONG_HIEUH_
};
static BYTE JungSungSep[NUM_OF_JUNGSUNG+1][2] = { { 0, 0 }, { _A_, 0 }, // _A_,
{ _AE_, 0 }, //_AE_,
{ _YA_, 0 }, //_YA_,
{ _YAE_, 0 }, //_YAE_,
{ _EO_, 0 }, //_EO_,
{ _E_, 0 }, //_E_,
{ _YEO_, 0 }, //_YEO_,
{ _YE_, 0 }, //_YE_,
{ _O_, 0 }, //_O_,
{ _O_, _A_ }, //_WA_,
{ _O_, _AE_ }, //_WAE_,
{ _O_, _I_ }, //_OE_,
{ _YO_, 0 }, //_YO_,
{ _U_, 0 }, //_U_,
{ _U_, _EO_ }, //_WEO_,
{ _U_, _E_ }, //_WE_,
{ _U_, _I_ }, //_WI_,
{ _YU_, 0 }, //_YU_,
{ _EU_, 0 }, //_EU_,
{ _EU_, _I_ }, //_YI_,
{ _I_, 0 } //_I_,
}; #pragma data_seg()
// ====-- SHARED SECTION END --====
///////////////////////////////////////////////////////////////////////////////
// CHangulAutomata class member function
BOOL CHangulAutomata::MakeComplete() { if (m_wcComposition) { m_wcComplete = m_wcComposition; // clear composition char
m_wcComposition = 0; // Init interim stack
InterimStack.Init(); m_Chosung = m_Jungsung = m_Jongsung = 0; // Init state
m_CurState = 0; return fTrue; } else return fFalse; }
// Complete used when takeover occurs
BOOL CHangulAutomata::MakeComplete(WORD wcComplete) { if (wcComplete) { m_wcComplete = wcComplete; // clear composition char
m_wcComposition = 0; // Init interim stack
InterimStack.Init(); m_Jungsung = m_Jongsung = 0; return fTrue; } else return fFalse; }
void CHangulAutomata::MakeComposition() { Assert(m_Chosung || m_Jungsung || m_Jongsung); // if Hangul
if (m_Chosung && m_Jungsung) { m_wcComposition = UNICODE_HANGUL_BASE + (m_Chosung-1) * NUM_OF_JUNGSUNG * (NUM_OF_JONGSUNG) // +1 : jongsung fill
+ (m_Jungsung-1) * (NUM_OF_JONGSUNG) + m_Jongsung; } else // Hangul jamo
// Currently map to compatiblity area. This should be changed if jamo glyphs available.
{ if (m_Chosung) m_wcComposition = Int2UniCho[m_Chosung]; else if (m_Jungsung) m_wcComposition = UNICODE_HANGUL_COMP_JAMO_START + 30 + m_Jungsung-1; else if (m_Jongsung) m_wcComposition = Int2UniJong[m_Jongsung]; } // Push to interim stack
InterimStack.Push(m_wInternalCode, m_CurState, m_Chosung, m_Jungsung, m_Jongsung, m_wcComposition); // 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);
//
}
WORD CHangulAutomata::FindChosungComb(WORD wPrevCode) { // Combination table for double chosung. (only for 3beolsik)
static BYTE rgbDChoTbl[NUM_OF_DOUBLE_CHOSUNG][3] = { { 1, 1, 2 }, { 4, 4, 5 }, // �� �� -> ��, �� �� -> ��
{ 8, 8, 9 }, { 10, 10, 11 }, // �� �� -> ��, �� �� -> ��
{ 13, 13, 14 } // �� �� -> ��
};
BYTE (*pDbl)[3] = rgbDChoTbl; // pointer a little bit faster than array access.
int i = NUM_OF_DOUBLE_CHOSUNG; WORD wCurCode = m_wInternalCode & 0xFF;
for (; i>0; i--, pDbl++) { if ( ((*pDbl)[0] == wPrevCode) && ((*pDbl)[1] == wCurCode) ) return (*pDbl)[2]; } return 0; }
WORD CHangulAutomata::FindJunsungComb(WORD wPrevCode) { // Combination table for double jungsung.
static BYTE rgbDJungTbl[NUM_OF_DOUBLE_JUNGSUNG][3] = { { 9, 1, 10 }, { 9, 2, 11 }, // �� �� -> ��, �� �� -> ��
{ 9, 21, 12 }, { 14, 5, 15 }, // �� �� -> ��, �� �� -> ��
{ 14, 6, 16 }, { 14, 21, 17 }, // �� �� -> ��, �� �� -> ��
{ 19, 21, 20 } // �� �� -> ��
}; BYTE (*pDbl)[3] = rgbDJungTbl; int i = NUM_OF_DOUBLE_JUNGSUNG; WORD wCurCode = m_wInternalCode & 0xFF; for (; i>0; i--, pDbl++) { if ( ((*pDbl)[0] == wPrevCode) && ((*pDbl)[1] == wCurCode) ) return (*pDbl)[2]; } return 0; }
WORD CHangulAutomata2::FindJonsungComb(WORD wPrevCode) { BYTE (*pDbl)[3] = rgbDJongTbl; wPrevCode = Cho2Jong[wPrevCode]; WORD wCurCode = Cho2Jong[m_wInternalCode & 0xFF]; for (; (*pDbl)[0]; pDbl++) { if ( ((*pDbl)[0] == wPrevCode) && ((*pDbl)[1] == wCurCode) ) return (*pDbl)[2]; } return 0; }
WORD CHangulAutomata3::FindJonsungComb(WORD wPrevCode) { BYTE (*pDbl)[3] = rgbDJongTbl; // 3BeolSik internal code have Jongsung code
WORD wCurCode = m_wInternalCode & 0xFF; for (; (*pDbl)[0]; pDbl++) { if ( ((*pDbl)[0] == wPrevCode) && ((*pDbl)[1] == wCurCode) ) return (*pDbl)[2]; } return 0; }
BOOL CHangulAutomata::BackSpace() { InterimStackEntry* pInterimEntry;
if (InterimStack.IsEmpty()) return fFalse; else { InterimStack.Pop(); if (!InterimStack.IsEmpty()) { pInterimEntry = InterimStack.GetTop(); m_wcComposition = pInterimEntry->m_wcCode; m_CurState = pInterimEntry->m_CurState; m_Chosung = pInterimEntry->m_Chosung; m_Jungsung = pInterimEntry->m_Jungsung; m_Jongsung = pInterimEntry->m_Jongsung; } else InitState(); return fTrue; } }
void CHangulAutomata::SeparateDJung(LPWORD pJungSung) { WORD wJungSung = pJungSung[0]; pJungSung[0] = JungSungSep[wJungSung][0]; pJungSung[1] = JungSungSep[wJungSung][1]; }
void CHangulAutomata::SeparateDJong(LPWORD pJongSung) { WORD wJongSung = pJongSung[0]; pJongSung[0] = JongSungSep[wJongSung][0]; pJongSung[1] = JongSungSep[wJongSung][1]; }
///////////////////////////////////////////////////////////////////////////////
//
// Assume : Input wcComp has valid Unicode Hangul value
// (wcComp>0x3130 && wcComp<0x3164) || (wcComp>=0xAC00 && wcComp<0xD7A4))
//
BOOL CHangulAutomata2::SetCompositionChar(WCHAR wcComp) { WORD wUnicodeHangulOffset; WORD wChosung; WORD wJungsung[2], wJongsung[2];
// Dbg(DBGID_SetComp, _T("CHangulAutomata2::SetCompositionChar: wcComp = %c(0x%X)"), wcComp, wcComp),
InitState();
wChosung = wJungsung[0] = wJungsung[1] = wJongsung[0] = wJongsung[1] = 0;
if (wcComp <= UNICODE_HANGUL_COMP_JAMO_END && wcComp >= UNICODE_HANGUL_COMP_JAMO_START) { // Dbg(DBGID_SetComp, _T("COMP_JAMO"));
// Consonant or vowel ?
if (wcComp < UNICODE_HANGUL_COMP_JAMO_VOWEL_START) { wUnicodeHangulOffset = (wcComp-UNICODE_HANGUL_COMP_JAMO_START); // Jongsung or Chosung ?
if (CompJamoMapTable[wUnicodeHangulOffset][1]) { wJongsung[0] = CompJamoMapTable[wUnicodeHangulOffset][0]; SeparateDJong(wJongsung); // Dbg(DBGID_Automata, _T("SetCompositionChar() : wJongsung[0]=%04x, wJongsung[1]=%04x"), wJongsung[0], wJongsung[1]);
} else wChosung = CompJamoMapTable[wUnicodeHangulOffset][0];
} else { wJungsung[0] = wcComp - UNICODE_HANGUL_COMP_JAMO_VOWEL_START + 1; SeparateDJung(wJungsung); } } else { wUnicodeHangulOffset = (wcComp-UNICODE_HANGUL_BASE); wChosung = (WORD)( wUnicodeHangulOffset / (NUM_OF_JONGSUNG*NUM_OF_JUNGSUNG)) + 1; // +1 to skip fill code
wJungsung[0] = (WORD)(wUnicodeHangulOffset / NUM_OF_JONGSUNG % NUM_OF_JUNGSUNG) + 1; SeparateDJung(wJungsung);
wJongsung[0] = (WORD)(wUnicodeHangulOffset % NUM_OF_JONGSUNG); // jongsung already has fill code
SeparateDJong(wJongsung); }
///////////////////////////////////////////////////////////////////////////
// Push process
if (wChosung) { m_Chosung = m_wInternalCode = wChosung; m_CurState = 1; // Chosung state
MakeComposition(); }
if (wJungsung[0]) { m_Jungsung = m_wInternalCode = wJungsung[0]; if (m_Jungsung == _O_ || m_Jungsung == _U_ || m_Jungsung == _EU_) m_CurState = 3; // Double Jungsung possible state
else m_CurState = 2; // Single Jungsung state
MakeComposition(); }
if (wJungsung[1]) { Assert(wJungsung[0] == _O_ || wJungsung[0] == _U_ || wJungsung[0] == _EU_); m_wInternalCode = wJungsung[1]; m_Jungsung = FindJunsungComb(wJungsung[0]); Assert(m_Jungsung); m_CurState = 2; // Jungsung state
MakeComposition(); }
//
if (wJongsung[0]) { m_wInternalCode = Jong2Cho[wJongsung[0]]; m_Jongsung = wJongsung[0];
// KiYeok, Nieun, Rieul and Pieup: Double jongsong possible chars.
if (m_Jongsung == _JONG_KIYEOK_ || m_Jongsung == _JONG_NIEUN_ || m_Jongsung == _JONG_RIEUL_ || m_Jongsung == _JONG_PIEUP_) m_CurState = 5; // Double Jongsung possible state
else m_CurState = 4; // Single Jongsung state
MakeComposition(); }
if (wJongsung[1]) { Assert(m_Jongsung == _JONG_KIYEOK_ || m_Jongsung == _JONG_NIEUN_ || m_Jongsung == _JONG_RIEUL_ || m_Jongsung == _JONG_PIEUP_); m_wInternalCode = Jong2Cho[wJongsung[1]]; m_Jongsung = FindJonsungComb(Jong2Cho[wJongsung[0]]);
Assert(m_Jongsung); m_CurState = 4; // Jongsung state
MakeComposition(); } return fTrue; }
///////////////////////////////////////////////////////////////////////////////
// Transition table of 2beolsik hangul automata
const WORD CHangulAutomata2::m_NextStateTbl[8][5] = { /////////////////////////////////////////////////////
// Sa Va Sb Vb Sc State
{ 1, 6, 1, 7, 1 }, // 0 : Start
{ FIND, 2, FIND, 3, FINAL }, // 1 : Chosung
{ 4, FINAL, 5, FINAL, FINAL }, // 2 : Single Jungsung
{ 4, FIND, 5, FINAL, FINAL }, // 3 : Double Jungsung possible
{ FINAL, TAKEOVER, FINAL, TAKEOVER, FINAL }, // 4 : Single Jongsung
{ FIND, TAKEOVER, FIND, TAKEOVER, FINAL }, // 5 : Double Jongsung possible
{ FINAL, FINAL, FINAL, FINAL, FINAL }, // 6 : Single Jungsung(without chosung)
{ FINAL, FIND, FINAL, FINAL, FINAL } // 7 : Double Jungsung possible(without chosung)
}; ///////////////////////////////////////////////////////////////////////////////
HAutomataReturnState CHangulAutomata2::Input(WORD InternalCode) { WORD wSymbol, wFind; InterimStackEntry* pPrevInterim;
// Check if hangul key
if ( !(InternalCode & H_HANGUL) ) return HAUTO_NONHANGULKEY; // This keycode need not handled in automata.
// Calling function should handle it properly.
// Copy internal code to member data
m_wInternalCode = InternalCode; wSymbol = (m_wInternalCode >> 8) & 0x7F; m_NextState = m_NextStateTbl[m_CurState][wSymbol];
switch (m_NextState) { // Chosung
case 1 : m_Chosung = m_wInternalCode & 0xFF; m_CurState = m_NextState; MakeComposition(); return HAUTO_COMPOSITION; break; // Jungsung
case 2 : case 3 : case 6 : case 7 : m_Jungsung = m_wInternalCode & 0xFF; m_CurState = m_NextState; MakeComposition(); return HAUTO_COMPOSITION; break; // Jongsung
case 4 : case 5 : m_Jongsung = Cho2Jong[m_wInternalCode & 0xFF]; m_CurState = m_NextState; MakeComposition(); return HAUTO_COMPOSITION; break;
case FINAL : MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; break;
case TAKEOVER : pPrevInterim = InterimStack.Pop(); m_Chosung = pPrevInterim->m_wInternalCode & 0xFF; pPrevInterim = InterimStack.Pop(); MakeComplete(pPrevInterim->m_wcCode); m_CurState = 1; // FIXED : should call MakeComposition() to push interim state
MakeComposition(); Input(m_wInternalCode); return HAUTO_COMPLETE; break;
case FIND : switch (m_CurState) { case 7 : pPrevInterim = InterimStack.GetTop(); if (wFind = FindJunsungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Jungsung = wFind; m_CurState = 6; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break; case 3 : pPrevInterim = InterimStack.GetTop(); if (wFind = FindJunsungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Jungsung = wFind; m_CurState = 2; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break; case 5 : pPrevInterim = InterimStack.GetTop(); if (wFind = FindJonsungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Jongsung = wFind; m_CurState = 4; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break;
// Only DJongsung case. same as case 5 except clearing chosung
case 1: pPrevInterim = InterimStack.GetTop(); if (wFind = FindJonsungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Chosung = 0; m_Jongsung = wFind; m_CurState = 4; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break; } } // impossible
Assert(0); return HAUTO_IMPOSSIBLE; }
///////////////////////////////////////////////////////////////////////////////
// Transition table of 3 beolsik 390 hangul automata
const WORD CHangulAutomata3::m_NextStateTbl[11][6] = { ////////////////////////////////////////////////////////////
// Sa Sb Va Vb Sc Sd State
{ 1, 2, 7, 8, 9, 10 }, // 0 : Start
{ FINAL, FINAL, 3, 4, FINAL, FINAL }, // 1 : Chosung
{ FINAL, FIND, 3, 4, FINAL, FINAL }, // 2 : Double Chosung possible
{ FINAL, FINAL, FINAL, FINAL, 5, 6 }, // 3 : Jungsung
{ FINAL, FINAL, FIND, FINAL, 5, 6 }, // 4 : Double Jungsung possible
{ FINAL, FINAL, FINAL, FINAL, FINAL, FINAL }, // 5 : Jongsung
{ FINAL, FINAL, FINAL, FINAL, FIND, FIND }, // 6 : Double Jongsung possible
{ FINAL, FINAL, FINAL, FINAL, FINAL, FINAL }, // 7 : Single Jungsung (without chosung)
{ FINAL, FINAL, FIND, FINAL, FINAL, FINAL }, // 8 : Double Jungsung possible(without chosung)
{ FINAL, FINAL, FINAL, FINAL, FINAL, FINAL }, // 9 : Single Jongsung(without chosung)
{ FINAL, FINAL, FINAL, FINAL, FIND, FIND } // 10 : Double Jongsung possible(without chosung)
}; ///////////////////////////////////////////////////////////////////////////////
HAutomataReturnState CHangulAutomata3::Input(WORD InternalCode) { WORD wSymbol, wFind; InterimStackEntry* pPrevInterim;
// Check if hangul key
if (!(InternalCode & H_HANGUL)) return HAUTO_NONHANGULKEY; // This keycode need not handled in automata.
// Calling function should handle it properly.
// Get internal code from keycode
m_wInternalCode = InternalCode; wSymbol = (m_wInternalCode >> 8) & 0x7F; m_NextState = m_NextStateTbl[m_CurState][wSymbol];
switch (m_NextState) { // Chosung
case 1 : case 2 : m_Chosung = m_wInternalCode & 0xFF; m_CurState = m_NextState; MakeComposition(); return HAUTO_COMPOSITION; break; // Jungsung
case 3 : case 4 : case 7 : case 8 : m_Jungsung = m_wInternalCode & 0xFF; m_CurState = m_NextState; MakeComposition(); return HAUTO_COMPOSITION; break; // Jongsung
case 5 : case 6 : case 9 : case 10 : m_Jongsung = m_wInternalCode & 0xFF; m_CurState = m_NextState; MakeComposition(); return HAUTO_COMPOSITION; break; case FINAL : MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; break;
case FIND : switch (m_CurState) { case 8 : pPrevInterim = InterimStack.GetTop(); if (wFind = FindJunsungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Jungsung = wFind; m_CurState = 7; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break; case 4 : pPrevInterim = InterimStack.GetTop(); if (wFind = FindJunsungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Jungsung = wFind; m_CurState = 3; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break; case 6 : pPrevInterim = InterimStack.GetTop(); if (wFind = FindJonsungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Jongsung = wFind; m_CurState = 5; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break; case 10 : pPrevInterim = InterimStack.GetTop(); if (wFind = FindJonsungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Jongsung = wFind; m_CurState = 7; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break;
case 2 : pPrevInterim = InterimStack.GetTop(); if (wFind = FindChosungComb(pPrevInterim->m_wInternalCode & 0xFF)) { m_Chosung = wFind; m_CurState = 1; MakeComposition(); return HAUTO_COMPOSITION; } else { MakeComplete(); Input(m_wInternalCode); return HAUTO_COMPLETE; } break; } }
// impossible
Assert(0); return HAUTO_IMPOSSIBLE; }
///////////////////////////////////////////////////////////////////////////////
//
// Assume : Input wcComp has valid Unicode Hangul value
// (wcComp>0x3130 && wcComp<0x3164) || (wcComp>=0xAC00 && wcComp<0xD7A4))
//
BOOL CHangulAutomata3::SetCompositionChar(WCHAR wcComp) { WORD wUnicodeHangulOffset; WORD wChosung; WORD wJungsung[2], wJongsung[2];
wChosung = wJungsung[0] = wJungsung[1] = wJongsung[0] = wJongsung[1] = 0; InitState();
if (wcComp <= UNICODE_HANGUL_COMP_JAMO_END && wcComp >= UNICODE_HANGUL_COMP_JAMO_START) { wUnicodeHangulOffset = (wcComp-UNICODE_HANGUL_COMP_JAMO_START); // Consonant or vowel ?
if (wcComp < UNICODE_HANGUL_COMP_JAMO_VOWEL_START) { // Jongsung or Chosung ?
if (CompJamoMapTable[wUnicodeHangulOffset][1]) { wJongsung[0] = CompJamoMapTable[wUnicodeHangulOffset][0]; SeparateDJong(wJongsung); } else wChosung = CompJamoMapTable[wUnicodeHangulOffset][0];
} else { wJungsung[0] = wcComp - UNICODE_HANGUL_COMP_JAMO_VOWEL_START + 1; SeparateDJung(wJungsung); } } else { wUnicodeHangulOffset = (wcComp-UNICODE_HANGUL_BASE); wChosung = (WORD)( wUnicodeHangulOffset / (NUM_OF_JONGSUNG*NUM_OF_JUNGSUNG)) + 1;
wJungsung[0] = (WORD)(wUnicodeHangulOffset / NUM_OF_JONGSUNG % NUM_OF_JUNGSUNG) + 1; SeparateDJung(wJungsung);
wJongsung[0] = (WORD)(wUnicodeHangulOffset % NUM_OF_JONGSUNG); SeparateDJong(wJongsung); }
///////////////////////////////////////////////////////////////////////////
// Push process
if (wChosung) { m_Chosung = m_wInternalCode = wChosung; // KiYeok, TiKeut, Pieup, Sios, Cieuc
if (m_Chosung == _KIYEOK_ || m_Chosung == _TIKEUT_ || m_Chosung == _PIEUP_|| m_Chosung == _SIOS_ || m_Chosung == _CIEUC_) m_CurState = 2; // Double Chosung possible state
else m_CurState = 1; // Chosung state
MakeComposition(); }
if (wJungsung[0]) { m_Jungsung = m_wInternalCode = wJungsung[0]; if (m_Jungsung == _O_ || m_Jungsung == _U_ || m_Jungsung == _EU_) m_CurState = 4; // Double Jungsung possible state
else m_CurState = 3; // Single Jungsung state
MakeComposition(); }
if (wJungsung[1]) { Assert(wJungsung[0] == _O_|| wJungsung[0] == _U_ || wJungsung[0] == _EU_); m_wInternalCode = wJungsung[1]; m_Jungsung = FindJunsungComb(wJungsung[0]); Assert(m_Jungsung); m_CurState = 3; // Jungsung state
MakeComposition(); }
//
if (wJongsung[0]) { m_wInternalCode = wJongsung[0]; m_Jongsung = wJongsung[0]; // KiYeok, Nieun, Rieul, Pieup and Sios: Double jongsong possible chars.
if (m_Jongsung == _JONG_KIYEOK_ || m_Jongsung == _JONG_NIEUN_ || m_Jongsung == _JONG_RIEUL_ || m_Jongsung == _JONG_PIEUP_ || m_Jongsung == _JONG_SIOS_) m_CurState = 6; // Double Jongsung possible state
else m_CurState = 5; // Single Jongsung state
MakeComposition(); }
if (wJongsung[1]) { Assert(m_Jongsung == _JONG_KIYEOK_ || m_Jongsung == _JONG_NIEUN_ || m_Jongsung == _JONG_RIEUL_ || m_Jongsung == _JONG_PIEUP_ || m_Jongsung == _JONG_SIOS_);
m_wInternalCode = wJongsung[1]; m_Jongsung = FindJonsungComb(wJongsung[0]);
Assert(m_Jongsung); m_CurState = 5; // Jongsung state
MakeComposition(); } return fTrue; }
|