저번에 올린 루비로 만든 두벌식 오토마타를 c 로 구현하기로 했음.

https://gall.dcinside.com/mgallery/board/view/?id=github&no=7684&page=1

dubeolsik = { "q" => "ㅂ", "Q" => "ㅃ", "w" => "ㅈ", "W" => "ㅉ", "e" => "ㄷ", "E" => "ㄸ", "r" => "ㄱ", "R" => "ㄲ", "t" => "ㅅ", "T" => "ㅆ", "a" => "ㅁ", "s" => "ㄴ", "d" => "ㅇ", "f" => "ㄹ", "g" => "ㅎ", "z" => "ㅋ", "x" => "ㅌ", "c" => "ㅊ", "v" => "ㅍ", "y" => "ㅛ", "u" => "ㅕ", "i" => "ㅑ", "o" => "ㅐ", "O" => "ㅒ", "p" => "ㅔ", "P" => "ㅖ", "h" => "ㅗ", "j" => "ㅓ", "k" => "ㅏ", "l" => "ㅣ", "b" => "ㅠ", "n" => "ㅜ", "m" => "ㅡ" }

저 코드를 c 로 쓰려면 hash 자료구조가 필요한데, hash 자료구조를 성능 좋게 만들기가 번거로움. 그래서 매우 단순한 방법으로 작업

const uint16_t dubeolsik[] = { /* A(0x41)..Z(0x5a) */ 0, 0, 0, 0, 0x3138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0x3152, 0x3156, 0x3143, 0x3132, 0, 0x3146, 0, 0, 0x3149, 0, 0, 0, /* a(0x61)..z(0x7a) */ 0x3141, 0x3160, 0x314a, 0x3147, 0x3137, 0x3139, 0x314e, 0x3157, 0x3151, 0x3153, 0x314f, 0x3163, 0x3161, 0x315c, 0x3150, 0x3154, 0x3142, 0x3131, 0x3134, 0x3145, 0x3155, 0x314d, 0x3148, 0x314c, 0x315b, 0x314b };

이렇게 함. 어떻게 접근하냐... keyval 범위를 체크해서 0x41..0x5a 범위이면 dubeolsik['E' - 0x41] 이렇게 하면 0x3138 (ㄸ) 값을 얻을 수 있음.

키보드 자판 보면 E 가 ㄸ 가 됨. ㄸ 는 유니코드가 3138 이고 0x3138 이라는 ucs2 라는 표현법으로 하나의 uint16_t 숫자로 표현하면 나중에 한글 조합 작업하기 좋음