|
|
|
@ -802,6 +802,15 @@ static mbfl_encoding mbfl_encoding_uhc = { |
|
|
|
MBFL_ENCTYPE_MBCS |
|
|
|
}; |
|
|
|
|
|
|
|
static mbfl_encoding mbfl_encoding_2022kr = { |
|
|
|
mbfl_no_encoding_2022kr, |
|
|
|
"ISO-2022-KR", |
|
|
|
"ISO-2022-KR", |
|
|
|
NULL, |
|
|
|
NULL, |
|
|
|
MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_SHFTCODE |
|
|
|
}; |
|
|
|
|
|
|
|
#endif /* HAVE_MBSTR_KR */ |
|
|
|
|
|
|
|
static const char *mbfl_encoding_cp1252_aliases[] = {"cp1252", NULL}; |
|
|
|
@ -1056,6 +1065,7 @@ static mbfl_encoding *mbfl_encoding_ptr_list[] = { |
|
|
|
#if defined(HAVE_MBSTR_KR) |
|
|
|
&mbfl_encoding_euc_kr, |
|
|
|
&mbfl_encoding_uhc, |
|
|
|
&mbfl_encoding_2022kr, |
|
|
|
#endif |
|
|
|
#if defined(HAVE_MBSTR_RU) |
|
|
|
&mbfl_encoding_cp1251, |
|
|
|
@ -1169,6 +1179,7 @@ static int mbfl_filt_ident_big5(int c, mbfl_identify_filter *filter TSRMLS_DC); |
|
|
|
#if defined(HAVE_MBSTR_KR) |
|
|
|
static int mbfl_filt_ident_euckr(int c, mbfl_identify_filter *filter TSRMLS_DC); |
|
|
|
static int mbfl_filt_ident_uhc(int c, mbfl_identify_filter *filter TSRMLS_DC); |
|
|
|
static int mbfl_filt_ident_2022kr(int c, mbfl_identify_filter *filter TSRMLS_DC); |
|
|
|
#endif /* HAVE_MBSTR_KR */ |
|
|
|
|
|
|
|
#if defined(HAVE_MBSTR_RU) |
|
|
|
@ -1783,6 +1794,23 @@ static struct mbfl_convert_vtbl vtbl_wchar_uhc = { |
|
|
|
mbfl_filt_conv_common_dtor, |
|
|
|
mbfl_filt_conv_wchar_uhc, |
|
|
|
mbfl_filt_conv_common_flush }; |
|
|
|
|
|
|
|
static struct mbfl_convert_vtbl vtbl_wchar_2022kr = { |
|
|
|
mbfl_no_encoding_wchar, |
|
|
|
mbfl_no_encoding_2022kr, |
|
|
|
mbfl_filt_conv_common_ctor, |
|
|
|
mbfl_filt_conv_common_dtor, |
|
|
|
mbfl_filt_conv_wchar_2022kr, |
|
|
|
mbfl_filt_conv_any_2022kr_flush }; |
|
|
|
|
|
|
|
static struct mbfl_convert_vtbl vtbl_2022kr_wchar = { |
|
|
|
mbfl_no_encoding_2022kr, |
|
|
|
mbfl_no_encoding_wchar, |
|
|
|
mbfl_filt_conv_common_ctor, |
|
|
|
mbfl_filt_conv_common_dtor, |
|
|
|
mbfl_filt_conv_2022kr_wchar, |
|
|
|
mbfl_filt_conv_common_flush }; |
|
|
|
|
|
|
|
#endif /* HAVE_MBSTR_KR */ |
|
|
|
|
|
|
|
#if defined(HAVE_MBSTR_RU) |
|
|
|
@ -2098,6 +2126,8 @@ static struct mbfl_convert_vtbl *mbfl_convert_filter_list[] = { |
|
|
|
&vtbl_wchar_euckr, |
|
|
|
&vtbl_uhc_wchar, |
|
|
|
&vtbl_wchar_uhc, |
|
|
|
&vtbl_2022kr_wchar, |
|
|
|
&vtbl_wchar_2022kr, |
|
|
|
#endif |
|
|
|
#if defined(HAVE_MBSTR_RU) |
|
|
|
&vtbl_cp1251_wchar, |
|
|
|
@ -2289,6 +2319,13 @@ static struct mbfl_identify_vtbl vtbl_identify_uhc = { |
|
|
|
mbfl_filt_ident_common_ctor, |
|
|
|
mbfl_filt_ident_common_dtor, |
|
|
|
mbfl_filt_ident_uhc }; |
|
|
|
|
|
|
|
static struct mbfl_identify_vtbl vtbl_identify_2022kr = { |
|
|
|
mbfl_no_encoding_2022kr, |
|
|
|
mbfl_filt_ident_common_ctor, |
|
|
|
mbfl_filt_ident_common_dtor, |
|
|
|
mbfl_filt_ident_2022kr }; |
|
|
|
|
|
|
|
#endif /* HAVE_MBSTR_KR */ |
|
|
|
|
|
|
|
#if defined(HAVE_MBSTR_RU) |
|
|
|
@ -2425,6 +2462,7 @@ static struct mbfl_identify_vtbl *mbfl_identify_filter_list[] = { |
|
|
|
#if defined(HAVE_MBSTR_KR) |
|
|
|
&vtbl_identify_euckr, |
|
|
|
&vtbl_identify_uhc, |
|
|
|
&vtbl_identify_2022kr, |
|
|
|
#endif |
|
|
|
#if defined(HAVE_MBSTR_RU) |
|
|
|
&vtbl_identify_cp1251, |
|
|
|
@ -6155,6 +6193,77 @@ mbfl_filt_ident_uhc(int c, mbfl_identify_filter *filter TSRMLS_DC) |
|
|
|
return c; |
|
|
|
} |
|
|
|
|
|
|
|
static int |
|
|
|
mbfl_filt_ident_2022kr(int c, mbfl_identify_filter *filter TSRMLS_DC) |
|
|
|
{ |
|
|
|
retry: |
|
|
|
switch (filter->status & 0xf) { |
|
|
|
/* case 0x00: ASCII */ |
|
|
|
/* case 0x10: KSC5601 mode */ |
|
|
|
/* case 0x20: KSC5601 DBCS */ |
|
|
|
/* case 0x40: KSC5601 SBCS */ |
|
|
|
case 0: |
|
|
|
if (!(filter->status & 0x10)) { |
|
|
|
if (c == 0x1b) |
|
|
|
filter->status += 2; |
|
|
|
} else if (filter->status == 0x20 && c > 0x20 && c < 0x7f) { /* kanji first char */ |
|
|
|
filter->status += 1; |
|
|
|
} else if (c >= 0 && c < 0x80) { /* latin, CTLs */ |
|
|
|
; |
|
|
|
} else { |
|
|
|
filter->flag = 1; /* bad */ |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
/* case 0x21: KSC5601 second char */ |
|
|
|
case 1: |
|
|
|
filter->status &= ~0xf; |
|
|
|
if (c < 0x21 || c > 0x7e) { /* bad */ |
|
|
|
filter->flag = 1; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
/* ESC */ |
|
|
|
case 2: |
|
|
|
if (c == 0x24) { /* '$' */ |
|
|
|
filter->status++; |
|
|
|
} else { |
|
|
|
filter->flag = 1; /* bad */ |
|
|
|
filter->status &= ~0xf; |
|
|
|
goto retry; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
/* ESC $ */ |
|
|
|
case 3: |
|
|
|
if (c == 0x29) { /* ')' */ |
|
|
|
filter->status++; |
|
|
|
} else { |
|
|
|
filter->flag = 1; /* bad */ |
|
|
|
filter->status &= ~0xf; |
|
|
|
goto retry; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
/* ESC $) */ |
|
|
|
case 5: |
|
|
|
if (c == 0x43) { /* 'C' */ |
|
|
|
filter->status = 0x10; |
|
|
|
} else { |
|
|
|
filter->flag = 1; /* bad */ |
|
|
|
filter->status &= ~0xf; |
|
|
|
goto retry; |
|
|
|
} |
|
|
|
break; |
|
|
|
|
|
|
|
default: |
|
|
|
filter->status = 0; |
|
|
|
break; |
|
|
|
} |
|
|
|
|
|
|
|
return c; |
|
|
|
} |
|
|
|
|
|
|
|
#endif /* HAVE_MBSTR_KR */ |
|
|
|
|
|
|
|
|
|
|
|
|