31
31
#include "mbfilter_euc_kr.h"
32
32
#include "unicode_table_uhc.h"
33
33
34
+ static int mbfl_filt_conv_euckr_wchar_flush (mbfl_convert_filter * filter );
35
+
34
36
static const unsigned char mblen_table_euckr [] = { /* 0xA1-0xFE */
35
37
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
36
38
1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 , 1 ,
@@ -69,7 +71,7 @@ const struct mbfl_convert_vtbl vtbl_euckr_wchar = {
69
71
mbfl_filt_conv_common_ctor ,
70
72
NULL ,
71
73
mbfl_filt_conv_euckr_wchar ,
72
- mbfl_filt_conv_common_flush ,
74
+ mbfl_filt_conv_euckr_wchar_flush ,
73
75
NULL ,
74
76
};
75
77
@@ -85,22 +87,19 @@ const struct mbfl_convert_vtbl vtbl_wchar_euckr = {
85
87
86
88
#define CK (statement ) do { if ((statement) < 0) return (-1); } while (0)
87
89
88
- int
89
- mbfl_filt_conv_euckr_wchar (int c , mbfl_convert_filter * filter )
90
+ int mbfl_filt_conv_euckr_wchar (int c , mbfl_convert_filter * filter )
90
91
{
91
92
int c1 , w , flag ;
92
93
93
94
switch (filter -> status ) {
94
95
case 0 :
95
96
if (c >= 0 && c < 0x80 ) { /* latin */
96
97
CK ((* filter -> output_function )(c , filter -> data ));
97
- } else if (c > 0xa0 && c < 0xff && c != 0xc9 ) { /* dbcs lead byte */
98
+ } else if ((( c >= 0xA1 && c <= 0xAC ) || ( c >= 0xB0 && c <= 0xFD )) && c != 0xC9 ) { /* dbcs lead byte */
98
99
filter -> status = 1 ;
99
100
filter -> cache = c ;
100
101
} else {
101
- w = c & MBFL_WCSGROUP_MASK ;
102
- w |= MBFL_WCSGROUP_THROUGH ;
103
- CK ((* filter -> output_function )(w , filter -> data ));
102
+ CK ((* filter -> output_function )(c | MBFL_WCSGROUP_THROUGH , filter -> data ));
104
103
}
105
104
break ;
106
105
@@ -114,7 +113,7 @@ mbfl_filt_conv_euckr_wchar(int c, mbfl_convert_filter *filter)
114
113
flag = 2 ;
115
114
}
116
115
if (flag > 0 && c >= 0xa1 && c <= 0xfe ) {
117
- if (flag == 1 ){ /* 1st: 0xa1..0xc6, 2nd: 0x41..0x7a, 0x81..0xfe */
116
+ if (flag == 1 ) { /* 1st: 0xa1..0xc6, 2nd: 0x41..0x7a, 0x81..0xfe */
118
117
w = (c1 - 0xa1 )* 190 + (c - 0x41 );
119
118
if (w >= 0 && w < uhc2_ucs_table_size ) {
120
119
w = uhc2_ucs_table [w ];
@@ -131,18 +130,11 @@ mbfl_filt_conv_euckr_wchar(int c, mbfl_convert_filter *filter)
131
130
}
132
131
133
132
if (w <= 0 ) {
134
- w = (c1 << 8 ) | c ;
135
- w &= MBFL_WCSPLANE_MASK ;
136
- w |= MBFL_WCSPLANE_KSC5601 ;
133
+ w = (c1 << 8 ) | c | MBFL_WCSPLANE_KSC5601 ;
137
134
}
138
135
CK ((* filter -> output_function )(w , filter -> data ));
139
- } else if ((c >= 0 && c < 0x21 ) || c == 0x7f ) { /* CTLs */
140
- CK ((* filter -> output_function )(c , filter -> data ));
141
136
} else {
142
- w = (c1 << 8 ) | c ;
143
- w &= MBFL_WCSGROUP_MASK ;
144
- w |= MBFL_WCSGROUP_THROUGH ;
145
- CK ((* filter -> output_function )(w , filter -> data ));
137
+ CK ((* filter -> output_function )((c1 << 8 ) | c | MBFL_WCSGROUP_THROUGH , filter -> data ));
146
138
}
147
139
break ;
148
140
@@ -154,10 +146,9 @@ mbfl_filt_conv_euckr_wchar(int c, mbfl_convert_filter *filter)
154
146
return c ;
155
147
}
156
148
157
- int
158
- mbfl_filt_conv_wchar_euckr (int c , mbfl_convert_filter * filter )
149
+ int mbfl_filt_conv_wchar_euckr (int c , mbfl_convert_filter * filter )
159
150
{
160
- int c1 , c2 , s = 0 ;
151
+ int s = 0 ;
161
152
162
153
if (c >= ucs_a1_uhc_table_min && c < ucs_a1_uhc_table_max ) {
163
154
s = ucs_a1_uhc_table [c - ucs_a1_uhc_table_min ];
@@ -175,24 +166,19 @@ mbfl_filt_conv_wchar_euckr(int c, mbfl_convert_filter *filter)
175
166
s = ucs_r2_uhc_table [c - ucs_r2_uhc_table_min ];
176
167
}
177
168
178
- c1 = (s >> 8 ) & 0xff ;
179
- c2 = s & 0xff ;
180
169
/* exclude UHC extension area (although we are using the UHC conversion tables) */
181
- if (c1 < 0xa1 || c2 < 0xa1 ) {
182
- s = c ;
170
+ if ((( s >> 8 ) & 0xFF ) < 0xA1 || ( s & 0xFF ) < 0xA1 ) {
171
+ s = 0 ;
183
172
}
184
173
185
174
if (s <= 0 ) {
186
- c1 = c & ~MBFL_WCSPLANE_MASK ;
187
- if (c1 == MBFL_WCSPLANE_KSC5601 ) {
188
- s = c & MBFL_WCSPLANE_MASK ;
189
- }
190
- if (c == 0 ) {
191
- s = 0 ;
192
- } else if (s <= 0 ) {
175
+ if (c < 0x80 ) {
176
+ s = c ;
177
+ } else {
193
178
s = -1 ;
194
179
}
195
180
}
181
+
196
182
if (s >= 0 ) {
197
183
if (s < 0x80 ) { /* latin */
198
184
CK ((* filter -> output_function )(s , filter -> data ));
@@ -206,3 +192,17 @@ mbfl_filt_conv_wchar_euckr(int c, mbfl_convert_filter *filter)
206
192
207
193
return c ;
208
194
}
195
+
196
+ static int mbfl_filt_conv_euckr_wchar_flush (mbfl_convert_filter * filter )
197
+ {
198
+ if (filter -> status == 1 ) {
199
+ /* 2-byte character was truncated */
200
+ CK ((* filter -> output_function )(filter -> cache | MBFL_WCSGROUP_THROUGH , filter -> data ));
201
+ }
202
+
203
+ if (filter -> flush_function ) {
204
+ (* filter -> flush_function )(filter -> data );
205
+ }
206
+
207
+ return 0 ;
208
+ }
0 commit comments