This source file includes following definitions.
- mbfl_filt_conv_jis_wchar
- mbfl_filt_conv_wchar_jis
- mbfl_filt_conv_wchar_2022jp
- mbfl_filt_conv_any_jis_flush
- mbfl_filt_ident_jis
- mbfl_filt_ident_2022jp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30 #ifdef HAVE_CONFIG_H
31 #include "config.h"
32 #endif
33
34 #include "mbfilter.h"
35 #include "mbfilter_jis.h"
36
37 #include "unicode_table_cp932_ext.h"
38 #include "unicode_table_jis.h"
39
40 static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter);
41 static int mbfl_filt_ident_2022jp(int c, mbfl_identify_filter *filter);
42
43 const mbfl_encoding mbfl_encoding_jis = {
44 mbfl_no_encoding_jis,
45 "JIS",
46 "ISO-2022-JP",
47 NULL,
48 NULL,
49 MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_SHFTCODE | MBFL_ENCTYPE_GL_UNSAFE
50 };
51
52 const mbfl_encoding mbfl_encoding_2022jp = {
53 mbfl_no_encoding_2022jp,
54 "ISO-2022-JP",
55 "ISO-2022-JP",
56 NULL,
57 NULL,
58 MBFL_ENCTYPE_MBCS | MBFL_ENCTYPE_SHFTCODE | MBFL_ENCTYPE_GL_UNSAFE
59 };
60
61 const struct mbfl_identify_vtbl vtbl_identify_jis = {
62 mbfl_no_encoding_jis,
63 mbfl_filt_ident_common_ctor,
64 mbfl_filt_ident_common_dtor,
65 mbfl_filt_ident_jis
66 };
67
68 const struct mbfl_identify_vtbl vtbl_identify_2022jp = {
69 mbfl_no_encoding_2022jp,
70 mbfl_filt_ident_common_ctor,
71 mbfl_filt_ident_common_dtor,
72 mbfl_filt_ident_2022jp
73 };
74
75 const struct mbfl_convert_vtbl vtbl_jis_wchar = {
76 mbfl_no_encoding_jis,
77 mbfl_no_encoding_wchar,
78 mbfl_filt_conv_common_ctor,
79 mbfl_filt_conv_common_dtor,
80 mbfl_filt_conv_jis_wchar,
81 mbfl_filt_conv_common_flush
82 };
83
84 const struct mbfl_convert_vtbl vtbl_wchar_jis = {
85 mbfl_no_encoding_wchar,
86 mbfl_no_encoding_jis,
87 mbfl_filt_conv_common_ctor,
88 mbfl_filt_conv_common_dtor,
89 mbfl_filt_conv_wchar_jis,
90 mbfl_filt_conv_any_jis_flush
91 };
92
93 const struct mbfl_convert_vtbl vtbl_2022jp_wchar = {
94 mbfl_no_encoding_2022jp,
95 mbfl_no_encoding_wchar,
96 mbfl_filt_conv_common_ctor,
97 mbfl_filt_conv_common_dtor,
98 mbfl_filt_conv_jis_wchar,
99 mbfl_filt_conv_common_flush
100 };
101
102 const struct mbfl_convert_vtbl vtbl_wchar_2022jp = {
103 mbfl_no_encoding_wchar,
104 mbfl_no_encoding_2022jp,
105 mbfl_filt_conv_common_ctor,
106 mbfl_filt_conv_common_dtor,
107 mbfl_filt_conv_wchar_2022jp,
108 mbfl_filt_conv_any_jis_flush
109 };
110
111 #define CK(statement) do { if ((statement) < 0) return (-1); } while (0)
112
113
114
115
116 int
117 mbfl_filt_conv_jis_wchar(int c, mbfl_convert_filter *filter)
118 {
119 int c1, s, w;
120
121 retry:
122 switch (filter->status & 0xf) {
123
124
125
126
127
128 case 0:
129 if (c == 0x1b) {
130 filter->status += 2;
131 } else if (c == 0x0e) {
132 filter->status = 0x20;
133 } else if (c == 0x0f) {
134 filter->status = 0;
135 } else if (filter->status == 0x10 && c == 0x5c) {
136 CK((*filter->output_function)(0xa5, filter->data));
137 } else if (filter->status == 0x10 && c == 0x7e) {
138 CK((*filter->output_function)(0x203e, filter->data));
139 } else if (filter->status == 0x20 && c > 0x20 && c < 0x60) {
140 CK((*filter->output_function)(0xff40 + c, filter->data));
141 } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) {
142 filter->cache = c;
143 filter->status += 1;
144 } else if (c >= 0 && c < 0x80) {
145 CK((*filter->output_function)(c, filter->data));
146 } else if (c > 0xa0 && c < 0xe0) {
147 CK((*filter->output_function)(0xfec0 + c, filter->data));
148 } else {
149 w = c & MBFL_WCSGROUP_MASK;
150 w |= MBFL_WCSGROUP_THROUGH;
151 CK((*filter->output_function)(w, filter->data));
152 }
153 break;
154
155
156
157 case 1:
158 filter->status &= ~0xf;
159 c1 = filter->cache;
160 if (c > 0x20 && c < 0x7f) {
161 s = (c1 - 0x21)*94 + c - 0x21;
162 if (filter->status == 0x80) {
163 if (s >= 0 && s < jisx0208_ucs_table_size) {
164 w = jisx0208_ucs_table[s];
165 } else {
166 w = 0;
167 }
168 if (w <= 0) {
169 w = (c1 << 8) | c;
170 w &= MBFL_WCSPLANE_MASK;
171 w |= MBFL_WCSPLANE_JIS0208;
172 }
173 } else {
174 if (s >= 0 && s < jisx0212_ucs_table_size) {
175 w = jisx0212_ucs_table[s];
176 } else {
177 w = 0;
178 }
179 if (w <= 0) {
180 w = (c1 << 8) | c;
181 w &= MBFL_WCSPLANE_MASK;
182 w |= MBFL_WCSPLANE_JIS0212;
183 }
184 }
185 CK((*filter->output_function)(w, filter->data));
186 } else if (c == 0x1b) {
187 filter->status += 2;
188 } else if ((c >= 0 && c < 0x21) || c == 0x7f) {
189 CK((*filter->output_function)(c, filter->data));
190 } else {
191 w = (c1 << 8) | c;
192 w &= MBFL_WCSGROUP_MASK;
193 w |= MBFL_WCSGROUP_THROUGH;
194 CK((*filter->output_function)(w, filter->data));
195 }
196 break;
197
198
199
200
201
202
203
204 case 2:
205 if (c == 0x24) {
206 filter->status++;
207 } else if (c == 0x28) {
208 filter->status += 3;
209 } else {
210 filter->status &= ~0xf;
211 CK((*filter->output_function)(0x1b, filter->data));
212 goto retry;
213 }
214 break;
215
216
217
218
219
220
221
222 case 3:
223 if (c == 0x40 || c == 0x42) {
224 filter->status = 0x80;
225 } else if (c == 0x28) {
226 filter->status++;
227 } else {
228 filter->status &= ~0xf;
229 CK((*filter->output_function)(0x1b, filter->data));
230 CK((*filter->output_function)(0x24, filter->data));
231 goto retry;
232 }
233 break;
234
235
236
237
238
239
240
241 case 4:
242 if (c == 0x40 || c == 0x42) {
243 filter->status = 0x80;
244 } else if (c == 0x44) {
245 filter->status = 0x90;
246 } else {
247 filter->status &= ~0xf;
248 CK((*filter->output_function)(0x1b, filter->data));
249 CK((*filter->output_function)(0x24, filter->data));
250 CK((*filter->output_function)(0x28, filter->data));
251 goto retry;
252 }
253 break;
254
255
256
257
258
259
260
261 case 5:
262 if (c == 0x42 || c == 0x48) {
263 filter->status = 0;
264 } else if (c == 0x4a) {
265 filter->status = 0x10;
266 } else if (c == 0x49) {
267 filter->status = 0x20;
268 } else {
269 filter->status &= ~0xf;
270 CK((*filter->output_function)(0x1b, filter->data));
271 CK((*filter->output_function)(0x28, filter->data));
272 goto retry;
273 }
274 break;
275
276 default:
277 filter->status = 0;
278 break;
279 }
280
281 return c;
282 }
283
284
285
286
287 int
288 mbfl_filt_conv_wchar_jis(int c, mbfl_convert_filter *filter)
289 {
290 int c1, s;
291
292 s = 0;
293 if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
294 s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
295 } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
296 s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
297 } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) {
298 s = ucs_i_jis_table[c - ucs_i_jis_table_min];
299 } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) {
300 s = ucs_r_jis_table[c - ucs_r_jis_table_min];
301 }
302 if (s <= 0) {
303 c1 = c & ~MBFL_WCSPLANE_MASK;
304 if (c1 == MBFL_WCSPLANE_JIS0208) {
305 s = c & MBFL_WCSPLANE_MASK;
306 } else if (c1 == MBFL_WCSPLANE_JIS0212) {
307 s = c & MBFL_WCSPLANE_MASK;
308 s |= 0x8080;
309 } else if (c == 0xa5) {
310 s = 0x1005c;
311 } else if (c == 0x203e) {
312 s = 0x1007e;
313 } else if (c == 0xff3c) {
314 s = 0x2140;
315 } else if (c == 0xff5e) {
316 s = 0x2141;
317 } else if (c == 0x2225) {
318 s = 0x2142;
319 } else if (c == 0xff0d) {
320 s = 0x215d;
321 } else if (c == 0xffe0) {
322 s = 0x2171;
323 } else if (c == 0xffe1) {
324 s = 0x2172;
325 } else if (c == 0xffe2) {
326 s = 0x224c;
327 }
328 if (c == 0) {
329 s = 0;
330 } else if (s <= 0) {
331 s = -1;
332 }
333 }
334 if (s >= 0) {
335 if (s < 0x80) {
336 if ((filter->status & 0xff00) != 0) {
337 CK((*filter->output_function)(0x1b, filter->data));
338 CK((*filter->output_function)(0x28, filter->data));
339 CK((*filter->output_function)(0x42, filter->data));
340 }
341 filter->status = 0;
342 CK((*filter->output_function)(s, filter->data));
343 } else if (s < 0x100) {
344 if ((filter->status & 0xff00) != 0x100) {
345 CK((*filter->output_function)(0x1b, filter->data));
346 CK((*filter->output_function)(0x28, filter->data));
347 CK((*filter->output_function)(0x49, filter->data));
348 }
349 filter->status = 0x100;
350 CK((*filter->output_function)(s & 0x7f, filter->data));
351 } else if (s < 0x8080) {
352 if ((filter->status & 0xff00) != 0x200) {
353 CK((*filter->output_function)(0x1b, filter->data));
354 CK((*filter->output_function)(0x24, filter->data));
355 CK((*filter->output_function)(0x42, filter->data));
356 }
357 filter->status = 0x200;
358 CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
359 CK((*filter->output_function)(s & 0x7f, filter->data));
360 } else if (s < 0x10000) {
361 if ((filter->status & 0xff00) != 0x300) {
362 CK((*filter->output_function)(0x1b, filter->data));
363 CK((*filter->output_function)(0x24, filter->data));
364 CK((*filter->output_function)(0x28, filter->data));
365 CK((*filter->output_function)(0x44, filter->data));
366 }
367 filter->status = 0x300;
368 CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
369 CK((*filter->output_function)(s & 0x7f, filter->data));
370 } else {
371 if ((filter->status & 0xff00) != 0x400) {
372 CK((*filter->output_function)(0x1b, filter->data));
373 CK((*filter->output_function)(0x28, filter->data));
374 CK((*filter->output_function)(0x4a, filter->data));
375 }
376 filter->status = 0x400;
377 CK((*filter->output_function)(s & 0x7f, filter->data));
378 }
379 } else {
380 if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
381 CK(mbfl_filt_conv_illegal_output(c, filter));
382 }
383 }
384
385 return c;
386 }
387
388
389
390
391
392 int
393 mbfl_filt_conv_wchar_2022jp(int c, mbfl_convert_filter *filter)
394 {
395 int s;
396
397 s = 0;
398 if (c >= ucs_a1_jis_table_min && c < ucs_a1_jis_table_max) {
399 s = ucs_a1_jis_table[c - ucs_a1_jis_table_min];
400 } else if (c >= ucs_a2_jis_table_min && c < ucs_a2_jis_table_max) {
401 s = ucs_a2_jis_table[c - ucs_a2_jis_table_min];
402 } else if (c >= ucs_i_jis_table_min && c < ucs_i_jis_table_max) {
403 s = ucs_i_jis_table[c - ucs_i_jis_table_min];
404 } else if (c >= ucs_r_jis_table_min && c < ucs_r_jis_table_max) {
405 s = ucs_r_jis_table[c - ucs_r_jis_table_min];
406 }
407 if (s <= 0) {
408 if (c == 0xa5) {
409 s = 0x1005c;
410 } else if (c == 0x203e) {
411 s = 0x1007e;
412 } else if (c == 0xff3c) {
413 s = 0x2140;
414 } else if (c == 0xff5e) {
415 s = 0x2141;
416 } else if (c == 0x2225) {
417 s = 0x2142;
418 } else if (c == 0xff0d) {
419 s = 0x215d;
420 } else if (c == 0xffe0) {
421 s = 0x2171;
422 } else if (c == 0xffe1) {
423 s = 0x2172;
424 } else if (c == 0xffe2) {
425 s = 0x224c;
426 }
427 if (c == 0) {
428 s = 0;
429 } else if (s <= 0) {
430 s = -1;
431 }
432 } else if ((s >= 0x80 && s < 0x2121) || (s > 0x8080)) {
433 s = -1;
434 }
435 if (s >= 0) {
436 if (s < 0x80) {
437 if ((filter->status & 0xff00) != 0) {
438 CK((*filter->output_function)(0x1b, filter->data));
439 CK((*filter->output_function)(0x28, filter->data));
440 CK((*filter->output_function)(0x42, filter->data));
441 }
442 filter->status = 0;
443 CK((*filter->output_function)(s, filter->data));
444 } else if (s < 0x10000) {
445 if ((filter->status & 0xff00) != 0x200) {
446 CK((*filter->output_function)(0x1b, filter->data));
447 CK((*filter->output_function)(0x24, filter->data));
448 CK((*filter->output_function)(0x42, filter->data));
449 }
450 filter->status = 0x200;
451 CK((*filter->output_function)((s >> 8) & 0x7f, filter->data));
452 CK((*filter->output_function)(s & 0x7f, filter->data));
453 } else {
454 if ((filter->status & 0xff00) != 0x400) {
455 CK((*filter->output_function)(0x1b, filter->data));
456 CK((*filter->output_function)(0x28, filter->data));
457 CK((*filter->output_function)(0x4a, filter->data));
458 }
459 filter->status = 0x400;
460 CK((*filter->output_function)(s & 0x7f, filter->data));
461 }
462 } else {
463 if (filter->illegal_mode != MBFL_OUTPUTFILTER_ILLEGAL_MODE_NONE) {
464 CK(mbfl_filt_conv_illegal_output(c, filter));
465 }
466 }
467
468 return c;
469 }
470
471 int
472 mbfl_filt_conv_any_jis_flush(mbfl_convert_filter *filter)
473 {
474
475 if ((filter->status & 0xff00) != 0) {
476 CK((*filter->output_function)(0x1b, filter->data));
477 CK((*filter->output_function)(0x28, filter->data));
478 CK((*filter->output_function)(0x42, filter->data));
479 }
480 filter->status &= 0xff;
481
482 if (filter->flush_function != NULL) {
483 return (*filter->flush_function)(filter->data);
484 }
485
486 return 0;
487 }
488
489 static int mbfl_filt_ident_jis(int c, mbfl_identify_filter *filter)
490 {
491 retry:
492 switch (filter->status & 0xf) {
493
494
495
496
497
498 case 0:
499 if (c == 0x1b) {
500 filter->status += 2;
501 } else if (c == 0x0e) {
502 filter->status = 0x20;
503 } else if (c == 0x0f) {
504 filter->status = 0;
505 } else if ((filter->status == 0x80 || filter->status == 0x90) && c > 0x20 && c < 0x7f) {
506 filter->status += 1;
507 } else if (c >= 0 && c < 0x80) {
508 ;
509 } else {
510 filter->flag = 1;
511 }
512 break;
513
514
515
516 case 1:
517 filter->status &= ~0xf;
518 if (c == 0x1b) {
519 goto retry;
520 } else if (c < 0x21 || c > 0x7e) {
521 filter->flag = 1;
522 }
523 break;
524
525
526 case 2:
527 if (c == 0x24) {
528 filter->status++;
529 } else if (c == 0x28) {
530 filter->status += 3;
531 } else {
532 filter->flag = 1;
533 filter->status &= ~0xf;
534 goto retry;
535 }
536 break;
537
538
539 case 3:
540 if (c == 0x40 || c == 0x42) {
541 filter->status = 0x80;
542 } else if (c == 0x28) {
543 filter->status++;
544 } else {
545 filter->flag = 1;
546 filter->status &= ~0xf;
547 goto retry;
548 }
549 break;
550
551
552 case 4:
553 if (c == 0x40 || c == 0x42) {
554 filter->status = 0x80;
555 } else if (c == 0x44) {
556 filter->status = 0x90;
557 } else {
558 filter->flag = 1;
559 filter->status &= ~0xf;
560 goto retry;
561 }
562 break;
563
564
565 case 5:
566 if (c == 0x42 || c == 0x48) {
567 filter->status = 0;
568 } else if (c == 0x4a) {
569 filter->status = 0x10;
570 } else if (c == 0x49) {
571 filter->status = 0x20;
572 } else {
573 filter->flag = 1;
574 filter->status &= ~0xf;
575 goto retry;
576 }
577 break;
578
579 default:
580 filter->status = 0;
581 break;
582 }
583
584 return c;
585 }
586
587 static int mbfl_filt_ident_2022jp(int c, mbfl_identify_filter *filter)
588 {
589 retry:
590 switch (filter->status & 0xf) {
591
592
593
594 case 0:
595 if (c == 0x1b) {
596 filter->status += 2;
597 } else if (filter->status == 0x80 && c > 0x20 && c < 0x7f) {
598 filter->status += 1;
599 } else if (c >= 0 && c < 0x80) {
600 ;
601 } else {
602 filter->flag = 1;
603 }
604 break;
605
606
607 case 1:
608 if (c == 0x1b) {
609 filter->status++;
610 } else {
611 filter->status &= ~0xf;
612 if (c < 0x21 || c > 0x7e) {
613 filter->flag = 1;
614 }
615 }
616 break;
617
618
619 case 2:
620 if (c == 0x24) {
621 filter->status++;
622 } else if (c == 0x28) {
623 filter->status += 3;
624 } else {
625 filter->flag = 1;
626 filter->status &= ~0xf;
627 goto retry;
628 }
629 break;
630
631
632 case 3:
633 if (c == 0x40 || c == 0x42) {
634 filter->status = 0x80;
635 } else {
636 filter->flag = 1;
637 filter->status &= ~0xf;
638 goto retry;
639 }
640 break;
641
642
643 case 5:
644 if (c == 0x42) {
645 filter->status = 0;
646 } else if (c == 0x4a) {
647 filter->status = 0x10;
648 } else {
649 filter->flag = 1;
650 filter->status &= ~0xf;
651 goto retry;
652 }
653 break;
654
655 default:
656 filter->status = 0;
657 break;
658 }
659
660 return c;
661 }
662
663