78
78
#include "mbfilter.h"
79
79
#include "mbfilter_utf7imap.h"
80
80
81
+ static int mbfl_filt_conv_wchar_utf7imap_flush (mbfl_convert_filter * filter );
82
+
81
83
static const char * mbfl_encoding_utf7imap_aliases [] = {"mUTF-7" , NULL };
82
84
83
85
const mbfl_encoding mbfl_encoding_utf7imap = {
@@ -113,55 +115,47 @@ const struct mbfl_convert_vtbl vtbl_wchar_utf7imap = {
113
115
114
116
#define CK (statement ) do { if ((statement) < 0) return (-1); } while (0)
115
117
116
- /*
117
- * UTF7-IMAP => wchar
118
- */
119
118
int mbfl_filt_conv_utf7imap_wchar (int c , mbfl_convert_filter * filter )
120
119
{
121
- int s , n ;
120
+ int s , n = -1 ;
122
121
123
- n = -1 ;
124
- if (filter -> status != 0 ) { /* Modified Base64 */
125
- if (c >= 0x41 && c <= 0x5a ) { /* A - Z */
122
+ if (filter -> status != 0 ) { /* Modified Base64 */
123
+ if (c >= 'A' && c <= 'Z' ) {
126
124
n = c - 65 ;
127
- } else if (c >= 0x61 && c <= 0x7a ) { /* a - z */
125
+ } else if (c >= 'a' && c <= 'z' ) {
128
126
n = c - 71 ;
129
- } else if (c >= 0x30 && c <= 0x39 ) { /* 0 - 9 */
127
+ } else if (c >= '0' && c <= '9' ) {
130
128
n = c + 4 ;
131
- } else if (c == 0x2b ) { /* '+' */
129
+ } else if (c == '+' ) {
132
130
n = 62 ;
133
- } else if (c == 0x2c ) { /* ',' */
131
+ } else if (c == ',' ) {
134
132
n = 63 ;
135
133
}
134
+
136
135
if (n < 0 || n > 63 ) {
137
- if (c == 0x2d ) {
138
- if (filter -> status == 1 ) { /* "&-" -> "&" */
139
- CK ((* filter -> output_function )(0x26 , filter -> data ));
136
+ if (c == '-' ) {
137
+ if (filter -> status == 1 ) { /* "&-" -> "&" */
138
+ CK ((* filter -> output_function )('&' , filter -> data ));
140
139
}
141
- } else if (c >= 0 && c < 0x80 ) { /* ASCII exclude '-' */
140
+ } else if (c >= 0 && c < 0x80 ) { /* ASCII exclude '-' */
142
141
CK ((* filter -> output_function )(c , filter -> data ));
143
- } else { /* illegal character */
144
- s = c & MBFL_WCSGROUP_MASK ;
145
- s |= MBFL_WCSGROUP_THROUGH ;
146
- CK ((* filter -> output_function )(s , filter -> data ));
142
+ } else { /* illegal character */
143
+ CK ((* filter -> output_function )(c | MBFL_WCSGROUP_THROUGH , filter -> data ));
147
144
}
148
- filter -> cache = 0 ;
149
- filter -> status = 0 ;
145
+ filter -> cache = filter -> status = 0 ;
150
146
return c ;
151
147
}
152
148
}
153
149
154
150
switch (filter -> status ) {
155
151
/* directly encoded characters */
156
152
case 0 :
157
- if (c == 0x26 ) { /* '&' shift character */
153
+ if (c == '&' ) { /* shift character */
158
154
filter -> status ++ ;
159
- } else if (c >= 0x20 && c <= 0x7E ) { /* ASCII */
155
+ } else if (c >= 0x20 && c <= 0x7E ) { /* ASCII */
160
156
CK ((* filter -> output_function )(c , filter -> data ));
161
- } else { /* illegal character */
162
- s = c & MBFL_WCSGROUP_MASK ;
163
- s |= MBFL_WCSGROUP_THROUGH ;
164
- CK ((* filter -> output_function )(s , filter -> data ));
157
+ } else { /* illegal character */
158
+ CK ((* filter -> output_function )(c | MBFL_WCSGROUP_THROUGH , filter -> data ));
165
159
}
166
160
break ;
167
161
@@ -188,10 +182,8 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
188
182
filter -> cache = n ;
189
183
if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX ) {
190
184
CK ((* filter -> output_function )(s , filter -> data ));
191
- } else { /* illegal character */
192
- s &= MBFL_WCSGROUP_MASK ;
193
- s |= MBFL_WCSGROUP_THROUGH ;
194
- CK ((* filter -> output_function )(s , filter -> data ));
185
+ } else { /* illegal character */
186
+ CK ((* filter -> output_function )(s | MBFL_WCSGROUP_THROUGH , filter -> data ));
195
187
}
196
188
} else {
197
189
filter -> cache = n ;
@@ -200,9 +192,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
200
192
if (s < 0x20 || s > 0x7E || s == '&' ) {
201
193
CK ((* filter -> output_function )(s , filter -> data ));
202
194
} else {
203
- s &= MBFL_WCSGROUP_MASK ;
204
- s |= MBFL_WCSGROUP_THROUGH ;
205
- CK ((* filter -> output_function )(s , filter -> data ));
195
+ CK ((* filter -> output_function )(s | MBFL_WCSGROUP_THROUGH , filter -> data ));
206
196
}
207
197
}
208
198
break ;
@@ -228,10 +218,8 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
228
218
filter -> cache = n ;
229
219
if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX ) {
230
220
CK ((* filter -> output_function )(s , filter -> data ));
231
- } else { /* illegal character */
232
- s &= MBFL_WCSGROUP_MASK ;
233
- s |= MBFL_WCSGROUP_THROUGH ;
234
- CK ((* filter -> output_function )(s , filter -> data ));
221
+ } else { /* illegal character */
222
+ CK ((* filter -> output_function )(s | MBFL_WCSGROUP_THROUGH , filter -> data ));
235
223
}
236
224
} else {
237
225
filter -> cache = n ;
@@ -240,9 +228,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
240
228
if (s < 0x20 || s > 0x7E || s == '&' ) {
241
229
CK ((* filter -> output_function )(s , filter -> data ));
242
230
} else {
243
- s &= MBFL_WCSGROUP_MASK ;
244
- s |= MBFL_WCSGROUP_THROUGH ;
245
- CK ((* filter -> output_function )(s , filter -> data ));
231
+ CK ((* filter -> output_function )(s | MBFL_WCSGROUP_THROUGH , filter -> data ));
246
232
}
247
233
}
248
234
break ;
@@ -263,10 +249,8 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
263
249
filter -> cache = 0 ;
264
250
if (s >= MBFL_WCSPLANE_SUPMIN && s < MBFL_WCSPLANE_SUPMAX ) {
265
251
CK ((* filter -> output_function )(s , filter -> data ));
266
- } else { /* illegal character */
267
- s &= MBFL_WCSGROUP_MASK ;
268
- s |= MBFL_WCSGROUP_THROUGH ;
269
- CK ((* filter -> output_function )(s , filter -> data ));
252
+ } else { /* illegal character */
253
+ CK ((* filter -> output_function )(s | MBFL_WCSGROUP_THROUGH , filter -> data ));
270
254
}
271
255
} else {
272
256
filter -> cache = 0 ;
@@ -275,9 +259,7 @@ int mbfl_filt_conv_utf7imap_wchar(int c, mbfl_convert_filter *filter)
275
259
if (s < 0x20 || s > 0x7E || s == '&' ) {
276
260
CK ((* filter -> output_function )(s , filter -> data ));
277
261
} else {
278
- s &= MBFL_WCSGROUP_MASK ;
279
- s |= MBFL_WCSGROUP_THROUGH ;
280
- CK ((* filter -> output_function )(s , filter -> data ));
262
+ CK ((* filter -> output_function )(s | MBFL_WCSGROUP_THROUGH , filter -> data ));
281
263
}
282
264
}
283
265
break ;
@@ -304,15 +286,11 @@ static const unsigned char mbfl_utf7imap_base64_table[] =
304
286
0x30 ,0x31 ,0x32 ,0x33 ,0x34 ,0x35 ,0x36 ,0x37 ,0x38 ,0x39 ,0x2b ,0x2c ,0x00
305
287
};
306
288
307
- /*
308
- * wchar => UTF7-IMAP
309
- */
310
289
int mbfl_filt_conv_wchar_utf7imap (int c , mbfl_convert_filter * filter )
311
290
{
312
- int n , s ;
291
+ int n = 0 , s ;
313
292
314
- n = 0 ;
315
- if (c == 0x26 ) {
293
+ if (c == '&' ) {
316
294
n = 1 ;
317
295
} else if ((c >= 0x20 && c <= 0x7e ) || c == 0 ) {
318
296
n = 2 ;
@@ -350,10 +328,10 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter)
350
328
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(s >> 4 ) & 0x3f ], filter -> data ));
351
329
if (n != 0 ) {
352
330
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(s << 2 ) & 0x3c ], filter -> data ));
353
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
331
+ CK ((* filter -> output_function )('-' , filter -> data ));
354
332
CK ((* filter -> output_function )(c , filter -> data ));
355
333
if (n == 1 ) {
356
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
334
+ CK ((* filter -> output_function )('-' , filter -> data ));
357
335
}
358
336
filter -> status = 0 ;
359
337
} else {
@@ -369,10 +347,10 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter)
369
347
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(s >> 2 ) & 0x3f ], filter -> data ));
370
348
if (n != 0 ) {
371
349
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(s << 4 ) & 0x30 ], filter -> data ));
372
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
350
+ CK ((* filter -> output_function )('-' , filter -> data ));
373
351
CK ((* filter -> output_function )(c , filter -> data ));
374
352
if (n == 1 ) {
375
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
353
+ CK ((* filter -> output_function )('-' , filter -> data ));
376
354
}
377
355
filter -> status = 0 ;
378
356
} else {
@@ -387,10 +365,10 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter)
387
365
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(s >> 6 ) & 0x3f ], filter -> data ));
388
366
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [s & 0x3f ], filter -> data ));
389
367
if (n != 0 ) {
390
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
368
+ CK ((* filter -> output_function )('-' , filter -> data ));
391
369
CK ((* filter -> output_function )(c , filter -> data ));
392
370
if (n == 1 ) {
393
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
371
+ CK ((* filter -> output_function )('-' , filter -> data ));
394
372
}
395
373
filter -> status = 0 ;
396
374
} else {
@@ -408,36 +386,33 @@ int mbfl_filt_conv_wchar_utf7imap(int c, mbfl_convert_filter *filter)
408
386
409
387
}
410
388
411
- int mbfl_filt_conv_wchar_utf7imap_flush (mbfl_convert_filter * filter )
389
+ static int mbfl_filt_conv_wchar_utf7imap_flush (mbfl_convert_filter * filter )
412
390
{
413
- int status , cache ;
391
+ int status = filter -> status , cache = filter -> cache ;
392
+ filter -> status = filter -> cache = 0 ;
414
393
415
- status = filter -> status ;
416
- cache = filter -> cache ;
417
- filter -> status = 0 ;
418
- filter -> cache = 0 ;
419
394
/* flush fragments */
420
395
switch (status ) {
421
396
case 1 :
422
397
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache >> 10 ) & 0x3f ], filter -> data ));
423
398
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache >> 4 ) & 0x3f ], filter -> data ));
424
399
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache << 2 ) & 0x3c ], filter -> data ));
425
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
400
+ CK ((* filter -> output_function )('-' , filter -> data ));
426
401
break ;
427
402
428
403
case 2 :
429
404
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache >> 14 ) & 0x3f ], filter -> data ));
430
405
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache >> 8 ) & 0x3f ], filter -> data ));
431
406
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache >> 2 ) & 0x3f ], filter -> data ));
432
407
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache << 4 ) & 0x30 ], filter -> data ));
433
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
408
+ CK ((* filter -> output_function )('-' , filter -> data ));
434
409
break ;
435
410
436
411
case 3 :
437
412
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache >> 12 ) & 0x3f ], filter -> data ));
438
413
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [(cache >> 6 ) & 0x3f ], filter -> data ));
439
414
CK ((* filter -> output_function )(mbfl_utf7imap_base64_table [cache & 0x3f ], filter -> data ));
440
- CK ((* filter -> output_function )(0x2d , filter -> data )); /* '-' */
415
+ CK ((* filter -> output_function )('-' , filter -> data ));
441
416
break ;
442
417
}
443
418
return 0 ;
0 commit comments