⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 hangul.c

📁 手机上的韩文输入法 saenaru20031212.zip
💻 C
📖 第 1 页 / 共 5 页
字号:
/* 
 * imported from the Nabi 0.10 (http://nabi.kldp.net) and the imhangul 0.9.7
 * by Won-Kyu Park <wkpark@kldp.org>
 * The Nabi and the imhangul are mabe by Hwan Jin Choi <krisna@kldp.org>
 */

#include <windows.h>
#include <immdev.h>
#include "saenaru.h"
#include "vksub.h"

// Hangul Input context
HangulIC ic;

int hangul_automata2( HangulIC *ic, WCHAR jamo, WCHAR *cs);
int hangul_automata3( HangulIC *ic, WCHAR jamo, WCHAR *cs);
void PASCAL hangul_ic_init( HangulIC *ic );

WCHAR PASCAL
hangul_choseong_to_cjamo(WCHAR ch)
{
    static const WCHAR table[] = {
	0x3131,	    /* 0x1100 */
	0x3132,	    /* 0x1101 */
	0x3134,	    /* 0x1102 */
	0x3137,	    /* 0x1103 */
	0x3138,	    /* 0x1104 */
	0x3139,	    /* 0x1105 */
	0x3141,	    /* 0x1106 */
	0x3142,	    /* 0x1107 */
	0x3143,	    /* 0x1108 */
	0x3145,	    /* 0x1109 */
	0x3146,	    /* 0x110a */
	0x3147,	    /* 0x110b */
	0x3148,	    /* 0x110c */
	0x3149,	    /* 0x110d */
	0x314a,	    /* 0x110e */
	0x314b,	    /* 0x110f */
	0x314c,	    /* 0x1110 */
	0x314d,	    /* 0x1111 */
	0x314e	    /* 0x1112 */
    };
    if (ch < 0x1100 || ch > 0x1112)
    {
        if (ch == 0x1140)
            return 0x317f;
        else if (ch == 0x114C)
            return 0x3181;
        else if (ch == 0x1159)
            return 0x3186;
	return 0;
    }
    return table[ch - 0x1100];
}

#define hangul_is_choseong(ch)	((ch) >= 0x1100 && (ch) <= 0x1159)
#define hangul_is_jungseong(ch)	((ch) >= 0x1161 && (ch) <= 0x11a2)
#define hangul_is_jongseong(ch)	((ch) >= 0x11a7 && (ch) <= 0x11f9)

WCHAR PASCAL
hangul_jungseong_to_cjamo(WCHAR ch)
{
    static const WCHAR table[] = {
	0x314f,	    /* 0x1161 */
	0x3150,	    /* 0x1162 */
	0x3151,	    /* 0x1163 */
	0x3152,	    /* 0x1164 */
	0x3153,	    /* 0x1165 */
	0x3154,	    /* 0x1166 */
	0x3155,	    /* 0x1167 */
	0x3156,	    /* 0x1168 */
	0x3157,	    /* 0x1169 */
	0x3158,	    /* 0x116a */
	0x3159,	    /* 0x116b */
	0x315a,	    /* 0x116c */
	0x315b,	    /* 0x116d */
	0x315c,	    /* 0x116e */
	0x315d,	    /* 0x116f */
	0x315e,	    /* 0x1170 */
	0x315f,	    /* 0x1171 */
	0x3160,	    /* 0x1172 */
	0x3161,	    /* 0x1173 */
	0x3162,	    /* 0x1174 */
	0x3163	    /* 0x1175 */
    };
    if (ch < 0x1161 || ch > 0x1175)
    {
        if (ch == 0x119E)
            return 0x318D;
	return 0;
    }
    return table[ch - 0x1161];
}

WCHAR PASCAL
hangul_jongseong_to_cjamo(WCHAR ch)
{
    static const WCHAR table[] = {
	0x3131,	    /* 0x11a8 */
	0x3132,	    /* 0x11a9 */
	0x3133,	    /* 0x11aa */
	0x3134,	    /* 0x11ab */
	0x3135,	    /* 0x11ac */
	0x3136,	    /* 0x11ad */
	0x3137,	    /* 0x11ae */
	0x3139,	    /* 0x11af */
	0x313a,	    /* 0x11b0 */
	0x313b,	    /* 0x11b1 */
	0x313c,	    /* 0x11b2 */
	0x313d,	    /* 0x11b3 */
	0x313e,	    /* 0x11b4 */
	0x313f,	    /* 0x11b5 */
	0x3140,	    /* 0x11b6 */
	0x3141,	    /* 0x11b7 */
	0x3142,	    /* 0x11b8 */
	0x3144,	    /* 0x11b9 */
	0x3145,	    /* 0x11ba */
	0x3146,	    /* 0x11bb */
	0x3147,	    /* 0x11bc */
	0x3148,	    /* 0x11bd */
	0x314a,	    /* 0x11be */
	0x314b,	    /* 0x11bf */
	0x314c,	    /* 0x11c0 */
	0x314d,	    /* 0x11c1 */
	0x314e	    /* 0x11c2 */
    };
    if (ch < 0x11a8 || ch > 0x11c2)
    {
        if (ch == 0x11EB)
            return 0x317f;
        else if (ch == 0x11F0)
            return 0x3181;
        else if (ch == 0x11F9)
            return 0x3186;
	return 0;
    }
    return table[ch - 0x11a8];
}

WCHAR PASCAL
hangul_choseong_to_jongseong(WCHAR ch)
{
    static const WCHAR table[] = {
      0x11a8,  /* choseong kiyeok      -> jongseong kiyeok      */
      0x11a9,  /* choseong ssangkiyeok -> jongseong ssangkiyeok */
      0x11ab,  /* choseong nieun       -> jongseong nieun       */
      0x11ae,  /* choseong tikeut      -> jongseong tikeut      */
      0x0,     /* choseong ssangtikeut -> jongseong tikeut      */
      0x11af,  /* choseong rieul       -> jongseong rieul       */
      0x11b7,  /* choseong mieum       -> jongseong mieum       */
      0x11b8,  /* choseong pieup       -> jongseong pieup       */
      0x0,     /* choseong ssangpieup  -> jongseong pieup       */
      0x11ba,  /* choseong sios        -> jongseong sios        */
      0x11bb,  /* choseong ssangsios   -> jongseong ssangsios   */
      0x11bc,  /* choseong ieung       -> jongseong ieung       */
      0x11bd,  /* choseong cieuc       -> jongseong cieuc       */
      0x0,     /* choseong ssangcieuc  -> jongseong cieuc       */
      0x11be,  /* choseong chieuch     -> jongseong chieuch     */
      0x11bf,  /* choseong khieukh     -> jongseong khieukh     */
      0x11c0,  /* choseong thieuth     -> jongseong thieuth     */
      0x11c1,  /* choseong phieuph     -> jongseong phieuph     */
      0x11c2   /* choseong hieuh       -> jongseong hieuh       */
    };
    if (ch < 0x1100 || ch > 0x1112)
	return 0;
    return table[ch - 0x1100];
}

WCHAR PASCAL
hangul_jongseong_to_choseong(WCHAR ch)
{
    static const WCHAR table[] = {
      0x1100,  /* jongseong kiyeok        -> choseong kiyeok       */
      0x1101,  /* jongseong ssangkiyeok   -> choseong ssangkiyeok  */
      0x1109,  /* jongseong kiyeok-sios   -> choseong sios         */
      0x1102,  /* jongseong nieun         -> choseong nieun        */
      0x110c,  /* jongseong nieun-cieuc   -> choseong cieuc        */
      0x1112,  /* jongseong nieun-hieuh   -> choseong hieuh        */
      0x1103,  /* jongseong tikeut        -> choseong tikeut       */
      0x1105,  /* jongseong rieul         -> choseong rieul        */
      0x1100,  /* jongseong rieul-kiyeok  -> choseong kiyeok       */
      0x1106,  /* jongseong rieul-mieum   -> choseong mieum        */
      0x1107,  /* jongseong rieul-pieup   -> choseong pieup        */
      0x1109,  /* jongseong rieul-sios    -> choseong sios         */
      0x1110,  /* jongseong rieul-thieuth -> choseong thieuth      */
      0x1111,  /* jongseong rieul-phieuph -> choseong phieuph      */
      0x1112,  /* jongseong rieul-hieuh   -> choseong hieuh        */
      0x1106,  /* jongseong mieum         -> choseong mieum        */
      0x1107,  /* jongseong pieup         -> choseong pieup        */
      0x1109,  /* jongseong pieup-sios    -> choseong sios         */
      0x1109,  /* jongseong sios          -> choseong sios         */
      0x110a,  /* jongseong ssangsios     -> choseong ssangsios    */
      0x110b,  /* jongseong ieung         -> choseong ieung        */
      0x110c,  /* jongseong cieuc         -> choseong cieuc        */
      0x110e,  /* jongseong chieuch       -> choseong chieuch      */
      0x110f,  /* jongseong khieukh       -> choseong khieukh      */
      0x1110,  /* jongseong thieuth       -> choseong thieuth      */
      0x1111,  /* jongseong phieuph       -> choseong phieuph      */
      0x1112   /* jongseong hieuh         -> choseong hieuh        */
    };
    if (ch < 0x11a8 || ch > 0x11c2)
	return 0;
    return table[ch - 0x11a8];
}

void PASCAL
hangul_jongseong_dicompose(WCHAR ch, WCHAR* jong, WCHAR* cho)
{
static const WCHAR table[][2] = {
    { 0,      0x1100 }, /* jong kiyeok	      = cho  kiyeok               */
    { 0x11a8, 0x1100 }, /* jong ssangkiyeok   = jong kiyeok + cho kiyeok  */
    { 0x11a8, 0x1109 }, /* jong kiyeok-sios   = jong kiyeok + cho sios    */
    { 0,      0x1102 }, /* jong nieun	      = cho  nieun                */
    { 0x11ab, 0x110c }, /* jong nieun-cieuc   = jong nieun  + cho cieuc   */
    { 0x11ab, 0x1112 }, /* jong nieun-hieuh   = jong nieun  + cho hieuh   */
    { 0,      0x1103 }, /* jong tikeut	      = cho  tikeut               */
    { 0,      0x1105 }, /* jong rieul         = cho  rieul                */
    { 0x11af, 0x1100 }, /* jong rieul-kiyeok  = jong rieul  + cho kiyeok  */
    { 0x11af, 0x1106 }, /* jong rieul-mieum   = jong rieul  + cho mieum   */
    { 0x11af, 0x1107 }, /* jong rieul-pieup   = jong rieul  + cho pieup   */
    { 0x11af, 0x1109 }, /* jong rieul-sios    = jong rieul  + cho sios    */
    { 0x11af, 0x1110 }, /* jong rieul-thieuth = jong rieul  + cho thieuth */
    { 0x11af, 0x1111 }, /* jong rieul-phieuph = jong rieul  + cho phieuph */
    { 0x11af, 0x1112 }, /* jong rieul-hieuh   = jong rieul  + cho hieuh   */
    { 0,      0x1106 }, /* jong mieum         = cho  mieum                */
    { 0,      0x1107 }, /* jong pieup         = cho  pieup                */
    { 0x11b8, 0x1109 }, /* jong pieup-sios    = jong pieup  + cho sios    */
    { 0,      0x1109 }, /* jong sios          = cho  sios                 */
    { 0x11ba, 0x1109 }, /* jong ssangsios     = jong sios   + cho sios    */
    { 0,      0x110b }, /* jong ieung         = cho  ieung                */
    { 0,      0x110c }, /* jong cieuc         = cho  cieuc                */
    { 0,      0x110e }, /* jong chieuch       = cho  chieuch              */
    { 0,      0x110f }, /* jong khieukh       = cho  khieukh              */
    { 0,      0x1110 }, /* jong thieuth       = cho  thieuth              */
    { 0,      0x1111 }, /* jong phieuph       = cho  phieuph              */
    { 0,      0x1112 }  /* jong hieuh         = cho  hieuh                */
};
    *jong = table[ch - 0x11a8][0];
    *cho  = table[ch - 0x11a8][1];
}

void PASCAL
hangul_jungseong_dicompose(WCHAR ch, WCHAR* jung, WCHAR* jung2)
{
static const WCHAR table[][2] = {
  { 0x1163, 0x1175 }, /* jungseong ya     + i	= yae		*/
  { 0x1165, 0x0000 }, /* */
  { 0x1166, 0x0000 }, /* */
  { 0x1167, 0x0000 }, /* */
  { 0x1167, 0x1175 }, /* jungseong yeo    + i	= ye		*/
  { 0x1169, 0x0000 }, /* */
  { 0x1169, 0x1161 }, /* jungseong o      + a	= wa		*/
  { 0x1169, 0x1162 }, /* jungseong o      + ae	= wae		*/
  { 0x1169, 0x1175 }, /* jungseong o      + i	= oe		*/
  { 0x116d, 0x0000 }, /* */
  { 0x116e, 0x0000 }, /* */
  { 0x116e, 0x1165 }, /* jungseong u      + eo	= weo		*/
  { 0x116e, 0x1166 }, /* jungseong u      + e	= we		*/
  { 0x116e, 0x1175 }, /* jungseong u      + i	= wi		*/
  { 0x1172, 0x0000 }, /* */
  { 0x1173, 0x0000 }, /* */
  { 0x1173, 0x1175 }, /* jungseong eu     + i	= yi		*/
};
  *jung  = 0;
  *jung2 = 0;

  if ( ch < 0x1164 || ch > 0x1174 )
     return;
  *jung  = table[ch - 0x1164][0];
  *jung2 = table[ch - 0x1164][1];
}

WCHAR PASCAL
hangul_jamo_to_syllable(WCHAR choseong, WCHAR jungseong, WCHAR jongseong)
{
    static const WCHAR hangul_base    = 0xac00;
    static const WCHAR choseong_base  = 0x1100;
    static const WCHAR jungseong_base = 0x1161;
    static const WCHAR jongseong_base = 0x11a7;
    static const int njungseong = 21;
    static const int njongseong = 28;
    WCHAR ch;

    /* we use 0x11a7 like a Jongseong filler */
    if (jongseong == 0)
	jongseong = 0x11a7;         /* Jongseong filler */

    if (!(choseong  >= 0x1100 && choseong  <= 0x1112))
	return 0;
    if (!(jungseong >= 0x1161 && jungseong <= 0x1175))
	return 0;
    if (!(jongseong >= 0x11a7 && jongseong <= 0x11c2))
	return 0;

    choseong  -= choseong_base;
    jungseong -= jungseong_base;
    jongseong -= jongseong_base;

    ch = ((choseong * njungseong) + jungseong) * njongseong + jongseong
	+ hangul_base;

    if (dwOptionFlag & KSX1001_SUPPORT)
    {
        WORD mb;
        WideCharToMultiByte(949, WC_COMPOSITECHECK,
                        &ch, 1, (char *)&mb, 2, NULL, NULL);

        if(LOBYTE(mb) < 0xa1 || LOBYTE(mb) > 0xfe 

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -