_codecs_jp.c 19.9 KB
Newer Older
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21
/*
 * _codecs_jp.c: Codecs collection for Japanese encodings
 *
 * Written by Hye-Shik Chang <perky@FreeBSD.org>
 */

#define USING_BINARY_PAIR_SEARCH
#define EMPBASE 0x20000

#include "cjkcodecs.h"
#include "mappings_jp.h"
#include "mappings_jisx0213_pair.h"
#include "alg_jisx0201.h"
#include "emu_jisx0213_2000.h"

/*
 * CP932 codec
 */

ENCODER(cp932)
{
22 23
    while (*inpos < inlen) {
        Py_UCS4 c = INCHAR1;
24 25 26 27
        DBCHAR code;
        unsigned char c1, c2;

        if (c <= 0x80) {
28
            WRITEBYTE1((unsigned char)c);
29
            NEXT(1, 1);
30 31 32
            continue;
        }
        else if (c >= 0xff61 && c <= 0xff9f) {
33
            WRITEBYTE1(c - 0xfec0);
34
            NEXT(1, 1);
35 36 37 38
            continue;
        }
        else if (c >= 0xf8f0 && c <= 0xf8f3) {
            /* Windows compatibility */
39
            REQUIRE_OUTBUF(1);
40
            if (c == 0xf8f0)
41
                OUTBYTE1(0xa0);
42
            else
43
                OUTBYTE1(c - 0xfef1 + 0xfd);
44
            NEXT(1, 1);
45 46 47
            continue;
        }

48 49
        if (c > 0xFFFF)
            return 1;
50
        REQUIRE_OUTBUF(2);
51

52
        if (TRYMAP_ENC(cp932ext, code, c)) {
53 54
            OUTBYTE1(code >> 8);
            OUTBYTE2(code & 0xff);
55
        }
56
        else if (TRYMAP_ENC(jisxcommon, code, c)) {
57 58 59 60 61 62 63 64
            if (code & 0x8000) /* MSB set: JIS X 0212 */
                return 1;

            /* JIS X 0208 */
            c1 = code >> 8;
            c2 = code & 0xff;
            c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
            c1 = (c1 - 0x21) >> 1;
65 66
            OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1);
            OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
67 68 69
        }
        else if (c >= 0xe000 && c < 0xe758) {
            /* User-defined area */
70 71
            c1 = (Py_UCS4)(c - 0xe000) / 188;
            c2 = (Py_UCS4)(c - 0xe000) % 188;
72 73
            OUTBYTE1(c1 + 0xf0);
            OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
74 75 76 77
        }
        else
            return 1;

78
        NEXT(1, 2);
79 80 81
    }

    return 0;
82 83 84 85
}

DECODER(cp932)
{
86
    while (inleft > 0) {
87
        unsigned char c = INBYTE1, c2;
88
        Py_UCS4 decoded;
89 90

        if (c <= 0x80) {
91 92
            OUTCHAR(c);
            NEXT_IN(1);
93 94 95 96
            continue;
        }
        else if (c >= 0xa0 && c <= 0xdf) {
            if (c == 0xa0)
97
                OUTCHAR(0xf8f0); /* half-width katakana */
98
            else
99 100
                OUTCHAR(0xfec0 + c);
            NEXT_IN(1);
101 102 103 104
            continue;
        }
        else if (c >= 0xfd/* && c <= 0xff*/) {
            /* Windows compatibility */
105 106
            OUTCHAR(0xf8f1 - 0xfd + c);
            NEXT_IN(1);
107 108 109
            continue;
        }

110
        REQUIRE_INBUF(2);
111
        c2 = INBYTE2;
112

113 114
        if (TRYMAP_DEC(cp932ext, decoded, c, c2))
            OUTCHAR(decoded);
115 116
        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
117
                return 1;
118 119 120 121 122 123

            c = (c < 0xe0 ? c - 0x81 : c - 0xc1);
            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
            c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;

124 125 126 127
            if (TRYMAP_DEC(jisx0208, decoded, c, c2))
                OUTCHAR(decoded);
            else
                return 1;
128 129 130 131
        }
        else if (c >= 0xf0 && c <= 0xf9) {
            if ((c2 >= 0x40 && c2 <= 0x7e) ||
                (c2 >= 0x80 && c2 <= 0xfc))
132 133
                OUTCHAR(0xe000 + 188 * (c - 0xf0) +
                    (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41));
134
            else
135
                return 1;
136 137
        }
        else
138
            return 1;
139

140
        NEXT_IN(2);
141 142 143
    }

    return 0;
144 145 146 147 148 149 150 151 152
}


/*
 * EUC-JIS-2004 codec
 */

ENCODER(euc_jis_2004)
{
153 154
    while (*inpos < inlen) {
        Py_UCS4 c = INCHAR1;
155 156 157 158
        DBCHAR code;
        Py_ssize_t insize;

        if (c < 0x80) {
159
            WRITEBYTE1(c);
160
            NEXT(1, 1);
161 162 163
            continue;
        }

164
        insize = 1;
165 166 167

        if (c <= 0xFFFF) {
            EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
168
            else if (TRYMAP_ENC(jisx0213_bmp, code, c)) {
169
                if (code == MULTIC) {
170
                    if (inlen - *inpos < 2) {
171 172 173 174 175 176 177 178 179 180 181 182
                        if (flags & MBENC_FLUSH) {
                            code = find_pairencmap(
                                (ucs2_t)c, 0,
                              jisx0213_pair_encmap,
                                JISX0213_ENCPAIRS);
                            if (code == DBCINV)
                                return 1;
                        }
                        else
                            return MBERR_TOOFEW;
                    }
                    else {
183
                        Py_UCS4 c2 = INCHAR2;
184
                        code = find_pairencmap(
185
                            (ucs2_t)c, c2,
186 187 188 189 190 191 192 193 194 195 196 197 198 199
                            jisx0213_pair_encmap,
                            JISX0213_ENCPAIRS);
                        if (code == DBCINV) {
                            code = find_pairencmap(
                                (ucs2_t)c, 0,
                              jisx0213_pair_encmap,
                                JISX0213_ENCPAIRS);
                            if (code == DBCINV)
                                return 1;
                        } else
                            insize = 2;
                    }
                }
            }
200 201
            else if (TRYMAP_ENC(jisxcommon, code, c))
                ;
202 203
            else if (c >= 0xff61 && c <= 0xff9f) {
                /* JIS X 0201 half-width katakana */
204
                WRITEBYTE2(0x8e, c - 0xfec0);
205
                NEXT(1, 2);
206 207 208 209 210 211 212 213 214 215 216 217 218
                continue;
            }
            else if (c == 0xff3c)
                /* F/W REVERSE SOLIDUS (see NOTES) */
                code = 0x2140;
            else if (c == 0xff5e)
                /* F/W TILDE (see NOTES) */
                code = 0x2232;
            else
                return 1;
        }
        else if (c >> 16 == EMPBASE >> 16) {
            EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
219 220 221 222
            else if (TRYMAP_ENC(jisx0213_emp, code, c & 0xffff))
                ;
            else
                return insize;
223 224 225 226 227 228
        }
        else
            return insize;

        if (code & 0x8000) {
            /* Codeset 2 */
229
            WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80);
230
            NEXT(insize, 3);
231 232
        } else {
            /* Codeset 1 */
233
            WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80);
234
            NEXT(insize, 2);
235 236 237 238
        }
    }

    return 0;
239 240 241 242
}

DECODER(euc_jis_2004)
{
243
    while (inleft > 0) {
244
        unsigned char c = INBYTE1;
245
        Py_UCS4 code, decoded;
246 247

        if (c < 0x80) {
248 249
            OUTCHAR(c);
            NEXT_IN(1);
250 251 252 253 254 255 256
            continue;
        }

        if (c == 0x8e) {
            /* JIS X 0201 half-width katakana */
            unsigned char c2;

257
            REQUIRE_INBUF(2);
258
            c2 = INBYTE2;
259
            if (c2 >= 0xa1 && c2 <= 0xdf) {
260 261
                OUTCHAR(0xfec0 + c2);
                NEXT_IN(2);
262 263
            }
            else
264
                return 1;
265 266 267 268
        }
        else if (c == 0x8f) {
            unsigned char c2, c3;

269
            REQUIRE_INBUF(3);
270 271
            c2 = INBYTE2 ^ 0x80;
            c3 = INBYTE3 ^ 0x80;
272 273

            /* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
274
            EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c2, c3)
275 276 277
            else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c2, c3))
                OUTCHAR(decoded);
            else if (TRYMAP_DEC(jisx0213_2_emp, code, c2, c3)) {
278 279
                OUTCHAR(EMPBASE | code);
                NEXT_IN(3);
280 281
                continue;
            }
282 283
            else if (TRYMAP_DEC(jisx0212, decoded, c2, c3))
                OUTCHAR(decoded);
284 285
            else
                return 1;
286
            NEXT_IN(3);
287 288 289 290
        }
        else {
            unsigned char c2;

291
            REQUIRE_INBUF(2);
292
            c ^= 0x80;
293
            c2 = INBYTE2 ^ 0x80;
294 295

            /* JIS X 0213 Plane 1 */
296
            EMULATE_JISX0213_2000_DECODE_PLANE1(writer, c, c2)
297 298 299 300
            else if (c == 0x21 && c2 == 0x40)
                OUTCHAR(0xff3c);
            else if (c == 0x22 && c2 == 0x32)
                OUTCHAR(0xff5e);
301 302 303 304 305
            else if (TRYMAP_DEC(jisx0208, decoded, c, c2))
                OUTCHAR(decoded);
            else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c, c2))
                OUTCHAR(decoded);
            else if (TRYMAP_DEC(jisx0213_1_emp, code, c, c2)) {
306 307
                OUTCHAR(EMPBASE | code);
                NEXT_IN(2);
308 309
                continue;
            }
310
            else if (TRYMAP_DEC(jisx0213_pair, code, c, c2)) {
311 312
                OUTCHAR2(code >> 16, code & 0xffff);
                NEXT_IN(2);
313 314
                continue;
            }
315 316
            else
                return 1;
317
            NEXT_IN(2);
318 319 320 321
        }
    }

    return 0;
322 323 324 325 326 327 328 329 330
}


/*
 * EUC-JP codec
 */

ENCODER(euc_jp)
{
331 332
    while (*inpos < inlen) {
        Py_UCS4 c = INCHAR1;
333 334 335
        DBCHAR code;

        if (c < 0x80) {
336
            WRITEBYTE1((unsigned char)c);
337
            NEXT(1, 1);
338 339 340
            continue;
        }

341 342
        if (c > 0xFFFF)
            return 1;
343

344 345
        if (TRYMAP_ENC(jisxcommon, code, c))
            ;
346 347
        else if (c >= 0xff61 && c <= 0xff9f) {
            /* JIS X 0201 half-width katakana */
348
            WRITEBYTE2(0x8e, c - 0xfec0);
349
            NEXT(1, 2);
350 351
            continue;
        }
352
#ifndef STRICT_BUILD
353 354 355
        else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */
            code = 0x2140;
        else if (c == 0xa5) { /* YEN SIGN */
356 357
            WRITEBYTE1(0x5c);
            NEXT(1, 1);
358 359
            continue;
        } else if (c == 0x203e) { /* OVERLINE */
360 361
            WRITEBYTE1(0x7e);
            NEXT(1, 1);
362 363
            continue;
        }
364
#endif
365 366 367 368 369
        else
            return 1;

        if (code & 0x8000) {
            /* JIS X 0212 */
370
            WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80);
371
            NEXT(1, 3);
372 373
        } else {
            /* JIS X 0208 */
374
            WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80);
375
            NEXT(1, 2);
376 377 378 379
        }
    }

    return 0;
380 381 382 383
}

DECODER(euc_jp)
{
384
    while (inleft > 0) {
385
        unsigned char c = INBYTE1;
386
        Py_UCS4 decoded;
387

388
        if (c < 0x80) {
389 390
            OUTCHAR(c);
            NEXT_IN(1);
391 392
            continue;
        }
393 394 395 396 397

        if (c == 0x8e) {
            /* JIS X 0201 half-width katakana */
            unsigned char c2;

398
            REQUIRE_INBUF(2);
399
            c2 = INBYTE2;
400
            if (c2 >= 0xa1 && c2 <= 0xdf) {
401 402
                OUTCHAR(0xfec0 + c2);
                NEXT_IN(2);
403 404
            }
            else
405
                return 1;
406 407 408 409
        }
        else if (c == 0x8f) {
            unsigned char c2, c3;

410
            REQUIRE_INBUF(3);
411 412
            c2 = INBYTE2;
            c3 = INBYTE3;
413
            /* JIS X 0212 */
414 415
            if (TRYMAP_DEC(jisx0212, decoded, c2 ^ 0x80, c3 ^ 0x80)) {
                OUTCHAR(decoded);
416
                NEXT_IN(3);
417 418
            }
            else
419
                return 1;
420 421 422 423
        }
        else {
            unsigned char c2;

424
            REQUIRE_INBUF(2);
425
            c2 = INBYTE2;
426
            /* JIS X 0208 */
427
#ifndef STRICT_BUILD
428 429
            if (c == 0xa1 && c2 == 0xc0)
                /* FULL-WIDTH REVERSE SOLIDUS */
430
                OUTCHAR(0xff3c);
431
            else
432
#endif
433 434 435 436
            if (TRYMAP_DEC(jisx0208, decoded, c ^ 0x80, c2 ^ 0x80))
                OUTCHAR(decoded);
            else
                return 1;
437
            NEXT_IN(2);
438 439 440 441
        }
    }

    return 0;
442 443 444 445 446 447 448 449 450
}


/*
 * SHIFT_JIS codec
 */

ENCODER(shift_jis)
{
451 452
    while (*inpos < inlen) {
        Py_UCS4 c = INCHAR1;
453 454
        DBCHAR code;
        unsigned char c1, c2;
455 456

#ifdef STRICT_BUILD
457
        JISX0201_R_ENCODE(c, code)
458
#else
459 460 461 462 463 464
        if (c < 0x80)
            code = c;
        else if (c == 0x00a5)
            code = 0x5c; /* YEN SIGN */
        else if (c == 0x203e)
            code = 0x7e; /* OVERLINE */
465
#endif
466
        else JISX0201_K_ENCODE(c, code)
467 468 469 470
        else if (c > 0xFFFF)
            return 1;
        else
            code = NOCHAR;
471

472
        if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
473
            REQUIRE_OUTBUF(1);
474

475
            OUTBYTE1((unsigned char)code);
476
            NEXT(1, 1);
477 478
            continue;
        }
479

480
        REQUIRE_OUTBUF(2);
481

482
        if (code == NOCHAR) {
483 484
            if (TRYMAP_ENC(jisxcommon, code, c))
                ;
485
#ifndef STRICT_BUILD
486 487
            else if (c == 0xff3c)
                code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
488
#endif
489 490 491 492 493 494 495 496 497 498 499
            else
                return 1;

            if (code & 0x8000) /* MSB set: JIS X 0212 */
                return 1;
        }

        c1 = code >> 8;
        c2 = code & 0xff;
        c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
        c1 = (c1 - 0x21) >> 1;
500 501
        OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1);
        OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
502
        NEXT(1, 2);
503 504 505
    }

    return 0;
506 507 508 509
}

DECODER(shift_jis)
{
510
    while (inleft > 0) {
511
        unsigned char c = INBYTE1;
512
        Py_UCS4 decoded;
513 514

#ifdef STRICT_BUILD
515
        JISX0201_R_DECODE(c, writer)
516
#else
517 518
        if (c < 0x80)
            OUTCHAR(c);
519
#endif
520
        else JISX0201_K_DECODE(c, writer)
521 522
        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
            unsigned char c1, c2;
523

524
            REQUIRE_INBUF(2);
525
            c2 = INBYTE2;
526
            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
527
                return 1;
528

529 530 531 532
            c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
            c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1) + 0x21);
            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
533 534

#ifndef STRICT_BUILD
535 536
            if (c1 == 0x21 && c2 == 0x40) {
                /* FULL-WIDTH REVERSE SOLIDUS */
537 538
                OUTCHAR(0xff3c);
                NEXT_IN(2);
539 540
                continue;
            }
541
#endif
542 543
            if (TRYMAP_DEC(jisx0208, decoded, c1, c2)) {
                OUTCHAR(decoded);
544
                NEXT_IN(2);
545 546 547
                continue;
            }
            else
548
                return 1;
549 550
        }
        else
551
            return 1;
552

553
        NEXT_IN(1); /* JIS X 0201 */
554 555 556
    }

    return 0;
557 558 559 560 561 562 563 564 565
}


/*
 * SHIFT_JIS-2004 codec
 */

ENCODER(shift_jis_2004)
{
566 567
    while (*inpos < inlen) {
        Py_UCS4 c = INCHAR1;
568 569 570 571 572 573 574
        DBCHAR code = NOCHAR;
        int c1, c2;
        Py_ssize_t insize;

        JISX0201_ENCODE(c, code)

        if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
575
            WRITEBYTE1((unsigned char)code);
576
            NEXT(1, 1);
577 578 579
            continue;
        }

580
        REQUIRE_OUTBUF(2);
581
        insize = 1;
582 583 584 585

        if (code == NOCHAR) {
            if (c <= 0xffff) {
                EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
586
                else if (TRYMAP_ENC(jisx0213_bmp, code, c)) {
587
                    if (code == MULTIC) {
588
                        if (inlen - *inpos < 2) {
589 590 591 592 593 594 595 596 597 598 599 600
                            if (flags & MBENC_FLUSH) {
                            code = find_pairencmap
                                ((ucs2_t)c, 0,
                              jisx0213_pair_encmap,
                                JISX0213_ENCPAIRS);
                            if (code == DBCINV)
                                return 1;
                            }
                            else
                                return MBERR_TOOFEW;
                        }
                        else {
601
                            Py_UCS4 ch2 = INCHAR2;
602
                            code = find_pairencmap(
603
                                (ucs2_t)c, ch2,
604 605 606 607 608 609 610 611 612 613 614 615 616 617 618
                              jisx0213_pair_encmap,
                                JISX0213_ENCPAIRS);
                            if (code == DBCINV) {
                            code = find_pairencmap(
                                (ucs2_t)c, 0,
                              jisx0213_pair_encmap,
                                JISX0213_ENCPAIRS);
                            if (code == DBCINV)
                                return 1;
                            }
                            else
                                insize = 2;
                        }
                    }
                }
619
                else if (TRYMAP_ENC(jisxcommon, code, c)) {
620 621 622 623
                    /* abandon JIS X 0212 codes */
                    if (code & 0x8000)
                        return 1;
                }
624 625
                else
                    return 1;
626 627 628
            }
            else if (c >> 16 == EMPBASE >> 16) {
                EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
629 630 631 632
                else if (TRYMAP_ENC(jisx0213_emp, code, c&0xffff))
                    ;
                else
                    return insize;
633 634 635 636 637 638 639 640
            }
            else
                return insize;
        }

        c1 = code >> 8;
        c2 = (code & 0xff) - 0x21;

641 642
        if (c1 & 0x80) {
            /* Plane 2 */
643 644 645 646 647 648
            if (c1 >= 0xee)
                c1 -= 0x87;
            else if (c1 >= 0xac || c1 == 0xa8)
                c1 -= 0x49;
            else
                c1 -= 0x43;
649
        }
650 651
        else {
            /* Plane 1 */
652
            c1 -= 0x21;
653
        }
654

655 656
        if (c1 & 1)
            c2 += 0x5e;
657
        c1 >>= 1;
658 659
        OUTBYTE1(c1 + (c1 < 0x1f ? 0x81 : 0xc1));
        OUTBYTE2(c2 + (c2 < 0x3f ? 0x40 : 0x41));
660

661
        NEXT(insize, 2);
662 663 664
    }

    return 0;
665 666 667 668
}

DECODER(shift_jis_2004)
{
669
    while (inleft > 0) {
670
        unsigned char c = INBYTE1;
671

672
        JISX0201_DECODE(c, writer)
673 674
        else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
            unsigned char c1, c2;
675
            Py_UCS4 code, decoded;
676

677
            REQUIRE_INBUF(2);
678
            c2 = INBYTE2;
679
            if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
680
                return 1;
681 682 683 684 685 686 687 688

            c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
            c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
            c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1));
            c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;

            if (c1 < 0x5e) { /* Plane 1 */
                c1 += 0x21;
689
                EMULATE_JISX0213_2000_DECODE_PLANE1(writer,
690
                                c1, c2)
691 692 693 694 695
                else if (TRYMAP_DEC(jisx0208, decoded, c1, c2))
                    OUTCHAR(decoded);
                else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c1, c2))
                    OUTCHAR(decoded);
                else if (TRYMAP_DEC(jisx0213_1_emp, code, c1, c2))
696
                    OUTCHAR(EMPBASE | code);
697
                else if (TRYMAP_DEC(jisx0213_pair, code, c1, c2))
698
                    OUTCHAR2(code >> 16, code & 0xffff);
699
                else
700
                    return 1;
701
                NEXT_IN(2);
702 703
            }
            else { /* Plane 2 */
704 705 706 707 708 709
                if (c1 >= 0x67)
                    c1 += 0x07;
                else if (c1 >= 0x63 || c1 == 0x5f)
                    c1 -= 0x37;
                else
                    c1 -= 0x3d;
710

711
                EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
712
                                c1, c2)
713 714 715
                else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c1, c2))
                    OUTCHAR(decoded);
                else if (TRYMAP_DEC(jisx0213_2_emp, code, c1, c2)) {
716 717
                    OUTCHAR(EMPBASE | code);
                    NEXT_IN(2);
718 719 720
                    continue;
                }
                else
721
                    return 1;
722
                NEXT_IN(2);
723 724 725 726
            }
            continue;
        }
        else
727
            return 1;
728

729
        NEXT_IN(1); /* JIS X 0201 */
730 731 732
    }

    return 0;
733 734 735 736 737 738 739 740 741 742 743 744 745 746 747 748 749 750 751 752 753 754 755 756 757 758 759 760
}


BEGIN_MAPPINGS_LIST
  MAPPING_DECONLY(jisx0208)
  MAPPING_DECONLY(jisx0212)
  MAPPING_ENCONLY(jisxcommon)
  MAPPING_DECONLY(jisx0213_1_bmp)
  MAPPING_DECONLY(jisx0213_2_bmp)
  MAPPING_ENCONLY(jisx0213_bmp)
  MAPPING_DECONLY(jisx0213_1_emp)
  MAPPING_DECONLY(jisx0213_2_emp)
  MAPPING_ENCONLY(jisx0213_emp)
  MAPPING_ENCDEC(jisx0213_pair)
  MAPPING_ENCDEC(cp932ext)
END_MAPPINGS_LIST

BEGIN_CODECS_LIST
  CODEC_STATELESS(shift_jis)
  CODEC_STATELESS(cp932)
  CODEC_STATELESS(euc_jp)
  CODEC_STATELESS(shift_jis_2004)
  CODEC_STATELESS(euc_jis_2004)
  { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) },
  { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) },
END_CODECS_LIST

I_AM_A_MODULE_FOR(jp)