📄 hangul.c
字号:
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 + -