@@ -79,55 +79,52 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf7 = {
79
79
80
80
#define CK (statement ) do { if ((statement) < 0) return (-1); } while (0)
81
81
82
- /*
83
- * UTF-7 => wchar
84
- */
82
+ static unsigned int decode_base64_char (unsigned char c )
83
+ {
84
+ if (c >= 'A' && c <= 'Z' ) {
85
+ return c - 65 ;
86
+ } else if (c >= 'a' && c <= 'z' ) {
87
+ return c - 71 ;
88
+ } else if (c >= '0' && c <= '9' ) {
89
+ return c + 4 ;
90
+ } else if (c == '+' ) {
91
+ return 62 ;
92
+ } else if (c == '/' ) {
93
+ return 63 ;
94
+ }
95
+ return -1 ;
96
+ }
97
+
85
98
int mbfl_filt_conv_utf7_wchar (int c , mbfl_convert_filter * filter )
86
99
{
87
- int s , n ;
88
-
89
- n = -1 ;
90
- if (filter -> status != 0 ) { /* Modified Base64 */
91
- if (c >= 0x41 && c <= 0x5a ) { /* A - Z */
92
- n = c - 65 ;
93
- } else if (c >= 0x61 && c <= 0x7a ) { /* a - z */
94
- n = c - 71 ;
95
- } else if (c >= 0x30 && c <= 0x39 ) { /* 0 - 9 */
96
- n = c + 4 ;
97
- } else if (c == 0x2b ) { /* '+' */
98
- n = 62 ;
99
- } else if (c == 0x2f ) { /* '/' */
100
- n = 63 ;
101
- }
102
- if (n < 0 || n > 63 ) {
103
- if (c == 0x2d ) {
104
- if (filter -> status == 1 ) { /* "+-" -> "+" */
105
- CK ((* filter -> output_function )(0x2b , filter -> data ));
100
+ int s , n = -1 ;
101
+
102
+ if (filter -> status ) { /* Modified Base64 */
103
+ n = decode_base64_char (c );
104
+ if (n < 0 ) {
105
+ if (c == '-' ) {
106
+ if (filter -> status == 1 ) { /* "+-" -> "+" */
107
+ CK ((* filter -> output_function )('+' , filter -> data ));
106
108
}
107
- } else if (c >= 0 && c < 0x80 ) { /* ASCII exclude '-' */
109
+ } else if (c >= 0 && c < 0x80 ) { /* ASCII exclude '-' */
108
110
CK ((* filter -> output_function )(c , filter -> data ));
109
- } else { /* illegal character */
110
- s = c & MBFL_WCSGROUP_MASK ;
111
- s |= MBFL_WCSGROUP_THROUGH ;
112
- CK ((* filter -> output_function )(s , filter -> data ));
111
+ } else { /* illegal character */
112
+ CK ((* filter -> output_function )(c | MBFL_WCSGROUP_THROUGH , filter -> data ));
113
113
}
114
- filter -> cache = 0 ;
115
- filter -> status = 0 ;
114
+ filter -> cache = filter -> status = 0 ;
116
115
return c ;
117
116
}
118
117
}
119
118
120
119
switch (filter -> status ) {
121
120
/* directly encoded characters */
122
121
case 0 :
123
- if (c == 0x2b ) { /* '+' shift character */
122
+ if (c == '+' ) { /* '+' shift character */
124
123
filter -> status = 1 ;
125
- } else if (c >= 0 && c < 0x80 ) { /* ASCII */
124
+ } else if (c >= 0 && c < 0x80 ) { /* ASCII */
126
125
CK ((* filter -> output_function )(c , filter -> data ));
127
- } else { /* illegal character */
128
- s = c & MBFL_WCSGROUP_MASK ;
129
- s |= MBFL_WCSGROUP_THROUGH ;
130
- CK ((* filter -> output_function )(s , filter -> data ));
126
+ } else { /* illegal character */
127
+ CK ((* filter -> output_function )(c | MBFL_WCSGROUP_THROUGH , filter -> data ));
131
128
}
132
129
break ;
133
130
@@ -154,10 +151,8 @@ int mbfl_filt_conv_utf7_wchar(int c, mbfl_convert_filter *filter)
154
151
filter -> cache = n ;
155
152
if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX ) {
156
153
CK ((* filter -> output_function )(s , filter -> data ));
157
- } else { /* illegal character */
158
- s &= MBFL_WCSGROUP_MASK ;
159
- s |= MBFL_WCSGROUP_THROUGH ;
160
- CK ((* filter -> output_function )(s , filter -> data ));
154
+ } else { /* illegal character */
155
+ CK ((* filter -> output_function )(s | MBFL_WCSGROUP_THROUGH , filter -> data ));
161
156
}
162
157
} else {
163
158
filter -> cache = n ;
@@ -186,10 +181,8 @@ int mbfl_filt_conv_utf7_wchar(int c, mbfl_convert_filter *filter)
186
181
filter -> cache = n ;
187
182
if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX ) {
188
183
CK ((* filter -> output_function )(s , filter -> data ));
189
- } else { /* illegal character */
190
- s &= MBFL_WCSGROUP_MASK ;
191
- s |= MBFL_WCSGROUP_THROUGH ;
192
- CK ((* filter -> output_function )(s , filter -> data ));
184
+ } else { /* illegal character */
185
+ CK ((* filter -> output_function )(s | MBFL_WCSGROUP_THROUGH , filter -> data ));
193
186
}
194
187
} else {
195
188
filter -> cache = n ;
@@ -232,57 +225,22 @@ int mbfl_filt_conv_utf7_wchar(int c, mbfl_convert_filter *filter)
232
225
return c ;
233
226
}
234
227
235
- /*
236
- * wchar => UTF-7
237
- */
238
228
int mbfl_filt_conv_wchar_utf7 (int c , mbfl_convert_filter * filter )
239
229
{
240
- int s , n ;
230
+ int s ;
241
231
242
- n = 0 ;
243
- if (c >= 0 && c < 0x80 ) { /* ASCII */
244
- if (c >= 0x41 && c <= 0x5a ) { /* A - Z */
245
- n = 1 ;
246
- } else if (c >= 0x61 && c <= 0x7a ) { /* a - z */
232
+ int n = 0 ;
233
+ if (c >= 0 && c < 0x80 ) { /* ASCII */
234
+ if ((c >= 'A' && c <= 'Z' ) || (c >= 'a' && c <= 'z' ) || (c >= '0' && c <= '9' ) || c == '\0' || c == '/' || c == '-' ) {
247
235
n = 1 ;
248
- } else if (c >= 0x30 && c <= 0x39 ) { /* 0 - 9 */
249
- n = 1 ;
250
- } else if (c == '\0' ) { /* '\0' */
251
- n = 1 ;
252
- } else if (c == 0x2f ) { /* '/' */
253
- n = 1 ;
254
- } else if (c == 0x2d ) { /* '-' */
255
- n = 1 ;
256
- } else if (c == 0x20 ) { /* SPACE */
257
- n = 2 ;
258
- } else if (c == 0x09 ) { /* HTAB */
259
- n = 2 ;
260
- } else if (c == 0x0d ) { /* CR */
261
- n = 2 ;
262
- } else if (c == 0x0a ) { /* LF */
263
- n = 2 ;
264
- } else if (c == 0x27 ) { /* "'" */
265
- n = 2 ;
266
- } else if (c == 0x28 ) { /* '(' */
267
- n = 2 ;
268
- } else if (c == 0x29 ) { /* ')' */
269
- n = 2 ;
270
- } else if (c == 0x2c ) { /* ',' */
271
- n = 2 ;
272
- } else if (c == 0x2e ) { /* '.' */
273
- n = 2 ;
274
- } else if (c == 0x3a ) { /* ':' */
275
- n = 2 ;
276
- } else if (c == 0x3f ) { /* '?' */
236
+ } else if (c == ' ' || c == '\t' || c == '\r' || c == '\n' || c == '\'' || c == '(' || c == ')' || c == ',' || c == '.' || c == ':' || c == '?' ) {
277
237
n = 2 ;
278
238
}
279
239
} else if (c >= 0 && c < MBFL_WCSPLANE_UCS2MAX ) {
280
240
;
281
241
} else if (c >= MBFL_WCSPLANE_SUPMIN && c < MBFL_WCSPLANE_SUPMAX ) {
282
- s = ((c >> 10 ) - 0x40 ) | 0xd800 ;
283
- CK ((* filter -> filter_function )(s , filter ));
284
- s = (c & 0x3ff ) | 0xdc00 ;
285
- CK ((* filter -> filter_function )(s , filter ));
242
+ CK ((* filter -> filter_function )(((c >> 10 ) - 0x40 ) | 0xd800 , filter ));
243
+ CK ((* filter -> filter_function )((c & 0x3ff ) | 0xdc00 , filter ));
286
244
return c ;
287
245
} else {
288
246
CK (mbfl_filt_conv_illegal_output (c , filter ));
@@ -291,11 +249,11 @@ int mbfl_filt_conv_wchar_utf7(int c, mbfl_convert_filter *filter)
291
249
292
250
switch (filter -> status ) {
293
251
case 0 :
294
- if (n != 0 ) { /* directly encode characters */
252
+ if (n != 0 ) { /* directly encode characters */
295
253
CK ((* filter -> output_function )(c , filter -> data ));
296
- } else { /* Modified Base64 */
297
- CK ((* filter -> output_function )(0x2b , filter -> data )); /* '+' */
298
- filter -> status ++ ;
254
+ } else { /* Modified Base64 */
255
+ CK ((* filter -> output_function )('+' , filter -> data ));
256
+ filter -> status = 1 ;
299
257
filter -> cache = c ;
300
258
}
301
259
break ;
@@ -308,12 +266,12 @@ int mbfl_filt_conv_wchar_utf7(int c, mbfl_convert_filter *filter)
308
266
if (n != 0 ) {
309
267
CK ((* filter -> output_function )(mbfl_base64_table [(s << 2 ) & 0x3c ], filter -> data ));
310
268
if (n == 1 ) {
311
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
269
+ CK ((* filter -> output_function )('-' , filter -> data ));
312
270
}
313
271
CK ((* filter -> output_function )(c , filter -> data ));
314
272
filter -> status = 0 ;
315
273
} else {
316
- filter -> status ++ ;
274
+ filter -> status = 2 ;
317
275
filter -> cache = ((s & 0xf ) << 16 ) | c ;
318
276
}
319
277
break ;
@@ -326,12 +284,12 @@ int mbfl_filt_conv_wchar_utf7(int c, mbfl_convert_filter *filter)
326
284
if (n != 0 ) {
327
285
CK ((* filter -> output_function )(mbfl_base64_table [(s << 4 ) & 0x30 ], filter -> data ));
328
286
if (n == 1 ) {
329
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
287
+ CK ((* filter -> output_function )('-' , filter -> data ));
330
288
}
331
289
CK ((* filter -> output_function )(c , filter -> data ));
332
290
filter -> status = 0 ;
333
291
} else {
334
- filter -> status ++ ;
292
+ filter -> status = 3 ;
335
293
filter -> cache = ((s & 0x3 ) << 16 ) | c ;
336
294
}
337
295
break ;
@@ -343,7 +301,7 @@ int mbfl_filt_conv_wchar_utf7(int c, mbfl_convert_filter *filter)
343
301
CK ((* filter -> output_function )(mbfl_base64_table [s & 0x3f ], filter -> data ));
344
302
if (n != 0 ) {
345
303
if (n == 1 ) {
346
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
304
+ CK ((* filter -> output_function )('-' , filter -> data ));
347
305
}
348
306
CK ((* filter -> output_function )(c , filter -> data ));
349
307
filter -> status = 0 ;
@@ -364,38 +322,35 @@ int mbfl_filt_conv_wchar_utf7(int c, mbfl_convert_filter *filter)
364
322
365
323
int mbfl_filt_conv_wchar_utf7_flush (mbfl_convert_filter * filter )
366
324
{
367
- int status , cache ;
325
+ int status = filter -> status ;
326
+ int cache = filter -> cache ;
368
327
369
- status = filter -> status ;
370
- cache = filter -> cache ;
371
- filter -> status = 0 ;
372
- filter -> cache = 0 ;
373
328
/* flush fragments */
374
329
switch (status ) {
375
330
case 1 :
376
331
CK ((* filter -> output_function )(mbfl_base64_table [(cache >> 10 ) & 0x3f ], filter -> data ));
377
332
CK ((* filter -> output_function )(mbfl_base64_table [(cache >> 4 ) & 0x3f ], filter -> data ));
378
333
CK ((* filter -> output_function )(mbfl_base64_table [(cache << 2 ) & 0x3c ], filter -> data ));
379
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
334
+ CK ((* filter -> output_function )('-' , filter -> data ));
380
335
break ;
381
336
382
337
case 2 :
383
338
CK ((* filter -> output_function )(mbfl_base64_table [(cache >> 14 ) & 0x3f ], filter -> data ));
384
339
CK ((* filter -> output_function )(mbfl_base64_table [(cache >> 8 ) & 0x3f ], filter -> data ));
385
340
CK ((* filter -> output_function )(mbfl_base64_table [(cache >> 2 ) & 0x3f ], filter -> data ));
386
341
CK ((* filter -> output_function )(mbfl_base64_table [(cache << 4 ) & 0x30 ], filter -> data ));
387
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
342
+ CK ((* filter -> output_function )('-' , filter -> data ));
388
343
break ;
389
344
390
345
case 3 :
391
346
CK ((* filter -> output_function )(mbfl_base64_table [(cache >> 12 ) & 0x3f ], filter -> data ));
392
347
CK ((* filter -> output_function )(mbfl_base64_table [(cache >> 6 ) & 0x3f ], filter -> data ));
393
348
CK ((* filter -> output_function )(mbfl_base64_table [cache & 0x3f ], filter -> data ));
394
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
349
+ CK ((* filter -> output_function )('-' , filter -> data ));
395
350
break ;
396
351
}
397
352
398
- if (filter -> flush_function != NULL ) {
353
+ if (filter -> flush_function ) {
399
354
(* filter -> flush_function )(filter -> data );
400
355
}
401
356
0 commit comments