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

📄 hangul.c

📁 手机韩语输入法源码 朝鲜语字母与手机键盘之间的对应
💻 C
📖 第 1 页 / 共 4 页
字号:
    unsigned char tmp[3];
    unsigned char *org_des;
    extern int font_jo_mode;

    org_des = des;
    while (n > 0) {
	if (*src & 0x80) {
	    convert_ks_to_3(*src, *(src+1), tmp);
/*	    if( font_jo_mode == TRUE )
	      l = convert_3_to_jo844(tmp[0], tmp[1], tmp[2], des);
	    else */
	      l = convert_3_to_johab(tmp[0], tmp[1], tmp[2], des);
	    src += l;
	    des += l;
	    n -= l;
	} else {
	    *des++ = *src++;
	    n--;
	}
    }
    return (des - org_des);
}

/* 炼钦屈 巩磊凯阑 肯己屈 巩磊凯肺 官槽促. 函券等 肯己屈 巩磊凯狼 辨捞甫
   倒妨霖促. */

int convert_johab_to_ks(src, des, len)
    unsigned char *src, *des;
    int len;
{
    int f, m, l;
    unsigned char *org_des;

    org_des = des;
    while (len > 0) {
	if (*src & 0x80) {
	    convert_johab_to_3(src, &f, &m, &l);
	    des += convert_3_to_ks(f, m, l, des);
	    src += 2;
	    len -= 2;
	} else {
	    *des++ = *src++;
	    --len;
	}
    }
    *des = 0;
    return des - org_des;
}

#if !defined(NO_PATCH_UTF8) /* by hanmaum 1998.2.5 */
/* UTF-8 -> 2 官捞飘 炼钦屈 */

int convert_utf8_to_johab( src, des, src_len )
    unsigned char *src;
    unsigned char *des;
    int src_len;
{
    int des_len = 0;
    int chr_len;
    unsigned long code;
    int ret;

#if defined(DEBUG_PATCH_UTF8) /* by hanmaum 1998.2.5 */
    printf("convert_utf8_to_johab()\n");
#endif

    for (; src_len > 0; src += chr_len, src_len -= chr_len) {
	if (src[0] < (unsigned char)0x80) {
	    chr_len = 1; 
	    *(des++) = src[0];
	    des_len++;
	    continue;
	}

	ret = convert_mb_to_wc(&code, src, src_len);
	if (ret > 0) {
	    chr_len = ret;

	    /* 11172 hangul area */
	    if (code >= (unsigned long)0xac00 && code <= (unsigned long)0xd7a3) 
	    {
		unsigned index_f, index_m, index_l, code_x;

		code_x = code - (unsigned long)0xac00;
		index_l = code_x % 28;
		code_x /= 28;
		index_m = code_x % 21;
		code_x /= 21;
		index_f = code_x;

		*(des++) = 0x80 | (johab_index1[index_f+1] << 2) 
			        | (johab_index2[index_m+1] >> 3);
		*(des++) = (johab_index2[index_m+1] << 5) 
				| johab_index3[index_l];
		des_len+=2;

		continue;
	    }
#if 1 /* convert to single jamo in johab code */
	    else if (code >= 0x3131 && code <= 0x3181) {
		int i, f, m, l, len;
		unsigned short ks_code = 
			((unsigned short)code - 0x3131) + 0xa4a1;
		for (i = 0; i < 40; i++) {
		    if ((unsigned long)ks_table2[i][0] == ks_code) {
			f = (unsigned char)ks_table2[i][1];
			m = (unsigned char)ks_table2[i][2];
			l = (unsigned char)ks_table2[i][3];
			len = convert_3_to_johab(f, m, l, des);
			des += len;
			des_len += len;
			break;
		    }
		}
		if (i < 40) continue;
	    }
#endif
	    else { /* refer table */
		int f, m, l;
		int len;
		unsigned short ksc_code = convert_char_ucs2_to_ksc5601(
			    (unsigned short)code);
		if (ksc_code > 0) {
		    f = (unsigned char)0xff;
		    m = (unsigned char)(ksc_code >> 8);
		    l = (unsigned char)(ksc_code & 0xff);
		    len = convert_3_to_johab(f, m, l, des);
		    if (len > 0) {
			des += len;
			des_len += len;
			continue;
		    }
		}
	    }
	}

	{
	    int i;

	    for (i = 1; i <= 6 && i < src_len; i++) {
		if (src[i] & 0x40) break;
	    }
	    chr_len = i;

#if defined(DEBUG_PATCH_UTF8) /* by hanmaum 1998.2.5 */
	    printf("convert_utf8_to_johab() scope error! (");
	    for (i = 0; i < chr_len; i++)
		    printf("%02x",src[i]);
	    printf(")\n");
#endif
	}

	/* screen width is assumed as 2. check is needed. */
	*(des++) = '?';
	*(des++) = '?';
	des_len += 2;
    }

    return des_len;

#if 0
    if (f == 0xff) {
	if (m >= 0xa1 && m <= 0xac) {
	    des[0] = (m - 0xa1) / 2 + 0xd9;
	    if (m & 1) {		/* 0xa1, 0xa3, 0xa5, ... */
		des[1] = (l-0xa1 < 0x7f-0x31) ? l-0xa1+0x31 : l-0xa1+0x91-0x7f+0x31; /* bug ! */
	    } else {
		des[1] = l;
	    }
	} else if (m >= 0xad && m <= 0xaf) { /* 沥狼 救等 康开 */
	    des[0] = 0xd9;	/* 傍鄂巩磊肺 盲框 */
	    des[1] = 0x31;
	} else if (m == 0xc9 || m == 0xfe) {
	    des[0] = 0xd8;
	    if (m & 1) {
		des[1] = (l-0xa1 < 0x7f-0x31) ? l-0xa1+0x31 : l-0xa1+0x91;
	    } else {
		des[1] = l;
	    }
	} else if (m > 0xc9 && m < 0xfe) {
	    des[0] = (m - 0xca) / 2 + 0xe0;
	    if (m & 1) {
		des[1] = l;
	    } else {
		des[1] = (l-0xa1 < 0x7f-0x31) ? l-0xa1+0x31 : l-0xa1+0x91-0x7f+0x31; /* bug ! */
	    }
	}
    } else 
#endif
}

unsigned short convert_char_ksc5601_to_ucs2(byte1, byte2)
unsigned char byte1, byte2;
{
	int tab_idx = ((int)byte1 - 0x00a1) * 94 + (int)byte2 - 0x00a1;
	long code_ucs2;

	if (tab_idx >= 0 && tab_idx < ksc5601max) {
		code_ucs2 = tabksc5601[tab_idx];
		if (code_ucs2 != -1) return code_ucs2;
	}
	return 0;
}

#define MAX_UCS2 0xffff

unsigned short convert_char_ucs2_to_ksc5601(code_ucs2)
unsigned short code_ucs2;
{
	register int i;
#if 0 /* Use reverse table. some memory is used. */
	static unsigned short tabrev[MAX_UCS2+1];
	static Boolean tabrev_set = False;
	long l;

	if (tabrev_set == False) {
		for (i = 0; i < ksc5601max; i++) {
			l = tabksc5601[i];
			if (l == -1) continue;

			if (l >= 0 && l <= (unsigned long)MAX_UCS2) {
				tabrev[l] = ((i/94+0xa1) << 8) | (i%94+0xa1);
			}
			else if (l < 0)
				tabrev[(unsigned short)l] = i;
		}
		tabrev_set = True;
	}

	return tabrev[code_ucs2];
#else
	for (i = 0; i < ksc5601max; i++) {
		if (code_ucs2 == tabksc5601[i])
			return ((i/94+0xa1) << 8) | (i%94+0xa1);
	}
#endif
	return 0;
}

enum
{
	T1	= 0x00,
	Tx	= 0x80,
	T2	= 0xC0,
	T3	= 0xE0,
	T4	= 0xF0,
	T5	= 0xF8,
	T6	= 0xFC,

	Bit1	= 7,
	Bitx	= 6,
	Bit2	= 5,
	Bit3	= 4,
	Bit4	= 3,
	Bit5	= 2,
	Bit6	= 2,

	Mask1	= (1<<Bit1)-1,
	Maskx	= (1<<Bitx)-1,
	Mask2	= (1<<Bit2)-1,
	Mask3	= (1<<Bit3)-1,
	Mask4	= (1<<Bit4)-1,
	Mask5	= (1<<Bit5)-1,
	Mask6	= (1<<Bit6)-1,

	Wchar1	= ((unsigned long)1<<Bit1)-1,
	Wchar2	= ((unsigned long)1<<(Bit2+Bitx))-1,
	Wchar3	= ((unsigned long)1<<(Bit3+2*Bitx))-1,
	Wchar4	= ((unsigned long)1<<(Bit4+3*Bitx))-1,
	Wchar5	= ((unsigned long)1<<(Bit5+4*Bitx))-1
};

int
convert_wc_to_mb(s, wc)
char *s;
unsigned long wc;
{
	if(s == 0)
		return 0;		/* no shift states */
	if(wc & ~Wchar2) {
		if(wc & ~Wchar4) {
			if(wc & ~Wchar5) {
				/* 6 bytes */
				s[0] = T6 | ((wc >> 5*Bitx) & Mask6);
				s[1] = Tx | ((wc >> 4*Bitx) & Maskx);
				s[2] = Tx | ((wc >> 3*Bitx) & Maskx);
				s[3] = Tx | ((wc >> 2*Bitx) & Maskx);
				s[4] = Tx | ((wc >> 1*Bitx) & Maskx);
				s[5] = Tx |  (wc & Maskx);
				return 6;
			}
			/* 5 bytes */
			s[0] = T5 |  (wc >> 4*Bitx);
			s[1] = Tx | ((wc >> 3*Bitx) & Maskx);
			s[2] = Tx | ((wc >> 2*Bitx) & Maskx);
			s[3] = Tx | ((wc >> 1*Bitx) & Maskx);
			s[4] = Tx |  (wc & Maskx);
			return 5;
		}
		if(wc & ~Wchar3) {
			/* 4 bytes */
			s[0] = T4 |  (wc >> 3*Bitx);
			s[1] = Tx | ((wc >> 2*Bitx) & Maskx);
			s[2] = Tx | ((wc >> 1*Bitx) & Maskx);
			s[3] = Tx |  (wc & Maskx);
			return 4;
		}
		/* 3 bytes */
		s[0] = T3 |  (wc >> 2*Bitx);
		s[1] = Tx | ((wc >> 1*Bitx) & Maskx);
		s[2] = Tx |  (wc & Maskx);
		return 3;
	}
	if(wc & ~Wchar1) {
		/* 2 bytes */
		s[0] = T2 | (wc >> 1*Bitx);
		s[1] = Tx | (wc & Maskx);
		return 2;
	}
	/* 1 byte */
	s[0] = T1 | wc;
	return 1;
}

int
convert_mb_to_wc(p, s, n)
unsigned long *p;
char *s;
unsigned n;
{
	unsigned char *us;
	int c0, c1, c2, c3, c4, c5;
	unsigned long wc;

	if(s == 0)
		return 0;		/* no shift states */

	if(n < 1)
		goto badlen;
	us = (unsigned char*)s;
	c0 = us[0];
	if(c0 >= T3) {
		if(n < 3)
			goto badlen;
		c1 = us[1] ^ Tx;
		c2 = us[2] ^ Tx;
		if((c1|c2) & T2)
			goto bad;
		if(c0 >= T5) {
			if(n < 5)
				goto badlen;
			c3 = us[3] ^ Tx;
			c4 = us[4] ^ Tx;
			if((c3|c4) & T2)
				goto bad;
			if(c0 >= T6) {
				/* 6 bytes */
				if(n < 6)
					goto badlen;
				c5 = us[5] ^ Tx;
				if(c5 & T2)
					goto bad;
				wc = ((((((((((c0 & Mask6) << Bitx) |
					c1) << Bitx) | c2) << Bitx) |
					c3) << Bitx) | c4) << Bitx) | c5;
				if(wc <= Wchar5)
					goto bad;
				*p = wc;
				return 6;
			}
			/* 5 bytes */
			wc = ((((((((c0 & Mask5) << Bitx) |
				c1) << Bitx) | c2) << Bitx) |
				c3) << Bitx) | c4;
			if(wc <= Wchar4)
				goto bad;
			*p = wc;
			return 5;
		}
		if(c0 >= T4) {
			/* 4 bytes */
			if(n < 4)
				goto badlen;
			c3 = us[3] ^ Tx;
			if(c3 & T2)
				goto bad;
			wc = ((((((c0 & Mask4) << Bitx) |
				c1) << Bitx) | c2) << Bitx) |
				c3;
			if(wc <= Wchar3)
				goto bad;
			*p = wc;
			return 4;
		}
		/* 3 bytes */
		wc = ((((c0 & Mask3) << Bitx) |
			c1) << Bitx) | c2;
		if(wc <= Wchar2)
			goto bad;
		*p = wc;
		return 3;
	}
	if(c0 >= T2) {
		/* 2 bytes */
		if(n < 2)
			goto badlen;
		c1 = us[1] ^ Tx;
		if(c1 & T2)
			goto bad;
		wc = ((c0 & Mask2) << Bitx) |
			c1;
		if(wc <= Wchar1)
			goto bad;
		*p = wc;
		return 2;
	}
	/* 1 byte */
	if(c0 >= Tx)
		goto bad;
	*p = c0;
	return 1;

bad:
	return -1;
badlen:
	return -2;
}
#endif

⌨️ 快捷键说明

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