@@ -129,106 +129,53 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf32le = {
129
129
130
130
#define CK (statement ) do { if ((statement) < 0) return (-1); } while (0)
131
131
132
- /*
133
- * UTF-32 => wchar
134
- */
135
- int mbfl_filt_conv_utf32_wchar (int c , mbfl_convert_filter * filter )
132
+ static int emit_char_if_valid (int n , mbfl_convert_filter * filter )
136
133
{
137
- int n , endian ;
134
+ if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xD800 || n > 0xDFFF )) {
135
+ CK ((* filter -> output_function )(n , filter -> data ));
136
+ } else {
137
+ n = (n & MBFL_WCSGROUP_MASK ) | MBFL_WCSGROUP_THROUGH ;
138
+ CK ((* filter -> output_function )(n , filter -> data ));
139
+ }
140
+ return 0 ;
141
+ }
138
142
139
- endian = filter -> status & 0xff00 ;
140
- switch (filter -> status & 0xff ) {
141
- case 0 :
142
- if (endian ) {
143
- n = c & 0xff ;
144
- } else {
145
- n = (c & 0xffu ) << 24 ;
146
- }
147
- filter -> cache = n ;
148
- filter -> status ++ ;
149
- break ;
150
- case 1 :
151
- if (endian ) {
152
- n = (c & 0xff ) << 8 ;
153
- } else {
154
- n = (c & 0xff ) << 16 ;
155
- }
156
- filter -> cache |= n ;
157
- filter -> status ++ ;
158
- break ;
159
- case 2 :
160
- if (endian ) {
161
- n = (c & 0xff ) << 16 ;
162
- } else {
163
- n = (c & 0xff ) << 8 ;
164
- }
165
- filter -> cache |= n ;
143
+ int mbfl_filt_conv_utf32_wchar (int c , mbfl_convert_filter * filter )
144
+ {
145
+ if (filter -> status < 3 ) {
146
+ filter -> cache = (filter -> cache << 8 ) | (c & 0xFF );
166
147
filter -> status ++ ;
167
- break ;
168
- default :
169
- if (endian ) {
170
- n = (c & 0xffu ) << 24 ;
171
- } else {
172
- n = c & 0xff ;
173
- }
174
- n |= filter -> cache ;
175
- if ((n & 0xffff ) == 0 && ((n >> 16 ) & 0xffff ) == 0xfffe ) {
176
- if (endian ) {
177
- filter -> status = 0 ; /* big-endian */
178
- } else {
179
- filter -> status = 0x100 ; /* little-endian */
180
- }
181
- CK ((* filter -> output_function )(0xfeff , filter -> data ));
148
+ } else {
149
+ int n = ((unsigned int )filter -> cache << 8 ) | (c & 0xFF );
150
+ filter -> cache = filter -> status = 0 ;
151
+
152
+ if (n == 0xFFFE0000 ) {
153
+ /* Found a little-endian byte order mark */
154
+ filter -> filter_function = mbfl_filt_conv_utf32le_wchar ;
182
155
} else {
183
- filter -> status &= ~0xff ;
184
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff )) {
185
- CK ((* filter -> output_function )(n , filter -> data ));
186
- } else {
187
- n = (n & MBFL_WCSGROUP_MASK ) | MBFL_WCSGROUP_THROUGH ;
188
- CK ((* filter -> output_function )(n , filter -> data ));
156
+ filter -> filter_function = mbfl_filt_conv_utf32be_wchar ;
157
+ if (n != 0xFEFF ) {
158
+ CK (emit_char_if_valid (n , filter ));
189
159
}
190
160
}
191
- break ;
192
161
}
193
162
194
163
return c ;
195
164
}
196
165
197
- /*
198
- * UTF-32BE => wchar
199
- */
200
166
int mbfl_filt_conv_utf32be_wchar (int c , mbfl_convert_filter * filter )
201
167
{
202
- int n ;
203
-
204
- if (filter -> status == 0 ) {
205
- filter -> status = 1 ;
206
- n = (c & 0xffu ) << 24 ;
207
- filter -> cache = n ;
208
- } else if (filter -> status == 1 ) {
209
- filter -> status = 2 ;
210
- n = (c & 0xff ) << 16 ;
211
- filter -> cache |= n ;
212
- } else if (filter -> status == 2 ) {
213
- filter -> status = 3 ;
214
- n = (c & 0xff ) << 8 ;
215
- filter -> cache |= n ;
168
+ if (filter -> status < 3 ) {
169
+ filter -> cache = (filter -> cache << 8 ) | (c & 0xFF );
170
+ filter -> status ++ ;
216
171
} else {
217
- filter -> status = 0 ;
218
- n = (c & 0xff ) | filter -> cache ;
219
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff )) {
220
- CK ((* filter -> output_function )(n , filter -> data ));
221
- } else {
222
- n = (n & MBFL_WCSGROUP_MASK ) | MBFL_WCSGROUP_THROUGH ;
223
- CK ((* filter -> output_function )(n , filter -> data ));
224
- }
172
+ int n = ((unsigned int )filter -> cache << 8 ) | (c & 0xFF );
173
+ filter -> cache = filter -> status = 0 ;
174
+ CK (emit_char_if_valid (n , filter ));
225
175
}
226
176
return c ;
227
177
}
228
178
229
- /*
230
- * wchar => UTF-32BE
231
- */
232
179
int mbfl_filt_conv_wchar_utf32be (int c , mbfl_convert_filter * filter )
233
180
{
234
181
if (c >= 0 && c < MBFL_WCSPLANE_UTF32MAX ) {
@@ -243,41 +190,19 @@ int mbfl_filt_conv_wchar_utf32be(int c, mbfl_convert_filter *filter)
243
190
return c ;
244
191
}
245
192
246
- /*
247
- * UTF-32LE => wchar
248
- */
249
193
int mbfl_filt_conv_utf32le_wchar (int c , mbfl_convert_filter * filter )
250
194
{
251
- int n ;
252
-
253
- if (filter -> status == 0 ) {
254
- filter -> status = 1 ;
255
- n = (c & 0xff );
256
- filter -> cache = n ;
257
- } else if (filter -> status == 1 ) {
258
- filter -> status = 2 ;
259
- n = (c & 0xff ) << 8 ;
260
- filter -> cache |= n ;
261
- } else if (filter -> status == 2 ) {
262
- filter -> status = 3 ;
263
- n = (c & 0xff ) << 16 ;
264
- filter -> cache |= n ;
195
+ if (filter -> status < 3 ) {
196
+ filter -> cache |= ((c & 0xFFU ) << (8 * filter -> status ));
197
+ filter -> status ++ ;
265
198
} else {
266
- filter -> status = 0 ;
267
- n = ((c & 0xffu ) << 24 ) | filter -> cache ;
268
- if (n < MBFL_WCSPLANE_UTF32MAX && (n < 0xd800 || n > 0xdfff )) {
269
- CK ((* filter -> output_function )(n , filter -> data ));
270
- } else {
271
- n = (n & MBFL_WCSGROUP_MASK ) | MBFL_WCSGROUP_THROUGH ;
272
- CK ((* filter -> output_function )(n , filter -> data ));
273
- }
199
+ int n = ((c & 0xFFU ) << 24 ) | filter -> cache ;
200
+ filter -> cache = filter -> status = 0 ;
201
+ CK (emit_char_if_valid (n , filter ));
274
202
}
275
203
return c ;
276
204
}
277
205
278
- /*
279
- * wchar => UTF-32LE
280
- */
281
206
int mbfl_filt_conv_wchar_utf32le (int c , mbfl_convert_filter * filter )
282
207
{
283
208
if (c >= 0 && c < MBFL_WCSPLANE_UTF32MAX ) {
@@ -294,7 +219,7 @@ int mbfl_filt_conv_wchar_utf32le(int c, mbfl_convert_filter *filter)
294
219
295
220
static int mbfl_filt_conv_utf32_wchar_flush (mbfl_convert_filter * filter )
296
221
{
297
- if (filter -> status & 0xF ) {
222
+ if (filter -> status ) {
298
223
/* Input string was truncated */
299
224
CK ((* filter -> output_function )(filter -> cache | MBFL_WCSGROUP_THROUGH , filter -> data ));
300
225
}
@@ -303,6 +228,5 @@ static int mbfl_filt_conv_utf32_wchar_flush(mbfl_convert_filter *filter)
303
228
(* filter -> flush_function )(filter -> data );
304
229
}
305
230
306
- filter -> status = filter -> cache = 0 ;
307
231
return 0 ;
308
232
}
0 commit comments