#define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
-/*
- * koi8u => wchar
- */
-int
-mbfl_filt_conv_koi8u_wchar(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_koi8u_wchar(int c, mbfl_convert_filter *filter)
{
int s;
- if (c >= 0 && c < koi8u_ucs_table_min) {
+ if (c < koi8u_ucs_table_min) {
s = c;
- } else if (c >= koi8u_ucs_table_min && c < 0x100) {
- s = koi8u_ucs_table[c - koi8u_ucs_table_min];
- if (s <= 0) {
- s = c;
- s &= MBFL_WCSPLANE_MASK;
- s |= MBFL_WCSPLANE_KOI8U;
- }
} else {
- s = c;
- s &= MBFL_WCSGROUP_MASK;
- s |= MBFL_WCSGROUP_THROUGH;
+ s = koi8u_ucs_table[c - koi8u_ucs_table_min];
}
CK((*filter->output_function)(s, filter->data));
-
return c;
}
-/*
- * wchar => koi8u
- */
-int
-mbfl_filt_conv_wchar_koi8u(int c, mbfl_convert_filter *filter)
+int mbfl_filt_conv_wchar_koi8u(int c, mbfl_convert_filter *filter)
{
- int s, n;
-
if (c < 0x80) {
- s = c;
+ CK((*filter->output_function)(c, filter->data));
} else {
- s = -1;
- n = koi8u_ucs_table_len-1;
- while (n >= 0) {
+ for (int n = 0; n < koi8u_ucs_table_len; n++) {
if (c == koi8u_ucs_table[n]) {
- s = koi8u_ucs_table_min + n;
- break;
+ CK((*filter->output_function)(koi8u_ucs_table_min + n, filter->data));
+ return c;
}
- n--;
- }
- if (s <= 0 && (c & ~MBFL_WCSPLANE_MASK) == MBFL_WCSPLANE_KOI8U) {
- s = c & MBFL_WCSPLANE_MASK;
}
- }
-
- if (s >= 0) {
- CK((*filter->output_function)(s, filter->data));
- } else {
CK(mbfl_filt_conv_illegal_output(c, filter));
}
#define MBFL_WCSPLANE_CNS11643 0x70f50000 /* 2121h - 9898h */
#define MBFL_WCSPLANE_UHC 0x70f60000 /* 8141h - fefeh */
#define MBFL_WCSPLANE_ARMSCII8 0x70fb0000
-#define MBFL_WCSPLANE_KOI8U 0x70fc0000
#define MBFL_WCSPLANE_GB18030 0x70ff0000 /* a1a1h-e3329a35h */
#define MBFL_WCSGROUP_MASK 0xffffff
#define MBFL_WCSGROUP_UCS4MAX 0x70000000