Home | History | Annotate | Download | only in cjkcodecs
      1 /*
      2  * _codecs_jp.c: Codecs collection for Japanese encodings
      3  *
      4  * Written by Hye-Shik Chang <perky (at) FreeBSD.org>
      5  */
      6 
      7 #define USING_BINARY_PAIR_SEARCH
      8 #define EMPBASE 0x20000
      9 
     10 #include "cjkcodecs.h"
     11 #include "mappings_jp.h"
     12 #include "mappings_jisx0213_pair.h"
     13 #include "alg_jisx0201.h"
     14 #include "emu_jisx0213_2000.h"
     15 
     16 /*
     17  * CP932 codec
     18  */
     19 
     20 ENCODER(cp932)
     21 {
     22     while (*inpos < inlen) {
     23         Py_UCS4 c = INCHAR1;
     24         DBCHAR code;
     25         unsigned char c1, c2;
     26 
     27         if (c <= 0x80) {
     28             WRITEBYTE1((unsigned char)c);
     29             NEXT(1, 1);
     30             continue;
     31         }
     32         else if (c >= 0xff61 && c <= 0xff9f) {
     33             WRITEBYTE1(c - 0xfec0);
     34             NEXT(1, 1);
     35             continue;
     36         }
     37         else if (c >= 0xf8f0 && c <= 0xf8f3) {
     38             /* 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             continue;
     46         }
     47 
     48         if (c > 0xFFFF)
     49             return 1;
     50         REQUIRE_OUTBUF(2);
     51 
     52         if (TRYMAP_ENC(cp932ext, code, c)) {
     53             OUTBYTE1(code >> 8);
     54             OUTBYTE2(code & 0xff);
     55         }
     56         else if (TRYMAP_ENC(jisxcommon, code, c)) {
     57             if (code & 0x8000) /* MSB set: JIS X 0212 */
     58                 return 1;
     59 
     60             /* JIS X 0208 */
     61             c1 = code >> 8;
     62             c2 = code & 0xff;
     63             c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
     64             c1 = (c1 - 0x21) >> 1;
     65             OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1);
     66             OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
     67         }
     68         else if (c >= 0xe000 && c < 0xe758) {
     69             /* User-defined area */
     70             c1 = (Py_UCS4)(c - 0xe000) / 188;
     71             c2 = (Py_UCS4)(c - 0xe000) % 188;
     72             OUTBYTE1(c1 + 0xf0);
     73             OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
     74         }
     75         else
     76             return 1;
     77 
     78         NEXT(1, 2);
     79     }
     80 
     81     return 0;
     82 }
     83 
     84 DECODER(cp932)
     85 {
     86     while (inleft > 0) {
     87         unsigned char c = INBYTE1, c2;
     88         Py_UCS4 decoded;
     89 
     90         if (c <= 0x80) {
     91             OUTCHAR(c);
     92             NEXT_IN(1);
     93             continue;
     94         }
     95         else if (c >= 0xa0 && c <= 0xdf) {
     96             if (c == 0xa0)
     97                 OUTCHAR(0xf8f0); /* half-width katakana */
     98             else
     99                 OUTCHAR(0xfec0 + c);
    100             NEXT_IN(1);
    101             continue;
    102         }
    103         else if (c >= 0xfd/* && c <= 0xff*/) {
    104             /* Windows compatibility */
    105             OUTCHAR(0xf8f1 - 0xfd + c);
    106             NEXT_IN(1);
    107             continue;
    108         }
    109 
    110         REQUIRE_INBUF(2);
    111         c2 = INBYTE2;
    112 
    113         if (TRYMAP_DEC(cp932ext, decoded, c, c2))
    114             OUTCHAR(decoded);
    115         else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
    116             if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
    117                 return 1;
    118 
    119             c = (c < 0xe0 ? c - 0x81 : c - 0xc1);
    120             c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
    121             c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
    122             c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
    123 
    124             if (TRYMAP_DEC(jisx0208, decoded, c, c2))
    125                 OUTCHAR(decoded);
    126             else
    127                 return 1;
    128         }
    129         else if (c >= 0xf0 && c <= 0xf9) {
    130             if ((c2 >= 0x40 && c2 <= 0x7e) ||
    131                 (c2 >= 0x80 && c2 <= 0xfc))
    132                 OUTCHAR(0xe000 + 188 * (c - 0xf0) +
    133                     (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  * EUC-JIS-2004 codec
    149  */
    150 
    151 ENCODER(euc_jis_2004)
    152 {
    153     while (*inpos < inlen) {
    154         Py_UCS4 c = INCHAR1;
    155         DBCHAR code;
    156         Py_ssize_t insize;
    157 
    158         if (c < 0x80) {
    159             WRITEBYTE1(c);
    160             NEXT(1, 1);
    161             continue;
    162         }
    163 
    164         insize = 1;
    165 
    166         if (c <= 0xFFFF) {
    167             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                         if (flags & MBENC_FLUSH) {
    172                             code = find_pairencmap(
    173                                 (ucs2_t)c, 0,
    174                               jisx0213_pair_encmap,
    175                                 JISX0213_ENCPAIRS);
    176                             if (code == DBCINV)
    177                                 return 1;
    178                         }
    179                         else
    180                             return MBERR_TOOFEW;
    181                     }
    182                     else {
    183                         Py_UCS4 c2 = INCHAR2;
    184                         code = find_pairencmap(
    185                             (ucs2_t)c, c2,
    186                             jisx0213_pair_encmap,
    187                             JISX0213_ENCPAIRS);
    188                         if (code == DBCINV) {
    189                             code = find_pairencmap(
    190                                 (ucs2_t)c, 0,
    191                               jisx0213_pair_encmap,
    192                                 JISX0213_ENCPAIRS);
    193                             if (code == DBCINV)
    194                                 return 1;
    195                         } else
    196                             insize = 2;
    197                     }
    198                 }
    199             }
    200             else if (TRYMAP_ENC(jisxcommon, code, c))
    201                 ;
    202             else if (c >= 0xff61 && c <= 0xff9f) {
    203                 /* JIS X 0201 half-width katakana */
    204                 WRITEBYTE2(0x8e, c - 0xfec0);
    205                 NEXT(1, 2);
    206                 continue;
    207             }
    208             else if (c == 0xff3c)
    209                 /* F/W REVERSE SOLIDUS (see NOTES) */
    210                 code = 0x2140;
    211             else if (c == 0xff5e)
    212                 /* F/W TILDE (see NOTES) */
    213                 code = 0x2232;
    214             else
    215                 return 1;
    216         }
    217         else if (c >> 16 == EMPBASE >> 16) {
    218             EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
    219             else if (TRYMAP_ENC(jisx0213_emp, code, c & 0xffff))
    220                 ;
    221             else
    222                 return insize;
    223         }
    224         else
    225             return insize;
    226 
    227         if (code & 0x8000) {
    228             /* Codeset 2 */
    229             WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80);
    230             NEXT(insize, 3);
    231         } else {
    232             /* Codeset 1 */
    233             WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80);
    234             NEXT(insize, 2);
    235         }
    236     }
    237 
    238     return 0;
    239 }
    240 
    241 DECODER(euc_jis_2004)
    242 {
    243     while (inleft > 0) {
    244         unsigned char c = INBYTE1;
    245         Py_UCS4 code, decoded;
    246 
    247         if (c < 0x80) {
    248             OUTCHAR(c);
    249             NEXT_IN(1);
    250             continue;
    251         }
    252 
    253         if (c == 0x8e) {
    254             /* JIS X 0201 half-width katakana */
    255             unsigned char c2;
    256 
    257             REQUIRE_INBUF(2);
    258             c2 = INBYTE2;
    259             if (c2 >= 0xa1 && c2 <= 0xdf) {
    260                 OUTCHAR(0xfec0 + c2);
    261                 NEXT_IN(2);
    262             }
    263             else
    264                 return 1;
    265         }
    266         else if (c == 0x8f) {
    267             unsigned char c2, c3;
    268 
    269             REQUIRE_INBUF(3);
    270             c2 = INBYTE2 ^ 0x80;
    271             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             else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c2, c3))
    276                 OUTCHAR(decoded);
    277             else if (TRYMAP_DEC(jisx0213_2_emp, code, c2, c3)) {
    278                 OUTCHAR(EMPBASE | code);
    279                 NEXT_IN(3);
    280                 continue;
    281             }
    282             else if (TRYMAP_DEC(jisx0212, decoded, c2, c3))
    283                 OUTCHAR(decoded);
    284             else
    285                 return 1;
    286             NEXT_IN(3);
    287         }
    288         else {
    289             unsigned char c2;
    290 
    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             else if (c == 0x21 && c2 == 0x40)
    298                 OUTCHAR(0xff3c);
    299             else if (c == 0x22 && c2 == 0x32)
    300                 OUTCHAR(0xff5e);
    301             else if (TRYMAP_DEC(jisx0208, decoded, c, c2))
    302                 OUTCHAR(decoded);
    303             else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c, c2))
    304                 OUTCHAR(decoded);
    305             else if (TRYMAP_DEC(jisx0213_1_emp, code, c, c2)) {
    306                 OUTCHAR(EMPBASE | code);
    307                 NEXT_IN(2);
    308                 continue;
    309             }
    310             else if (TRYMAP_DEC(jisx0213_pair, code, c, c2)) {
    311                 OUTCHAR2(code >> 16, code & 0xffff);
    312                 NEXT_IN(2);
    313                 continue;
    314             }
    315             else
    316                 return 1;
    317             NEXT_IN(2);
    318         }
    319     }
    320 
    321     return 0;
    322 }
    323 
    324 
    325 /*
    326  * EUC-JP codec
    327  */
    328 
    329 ENCODER(euc_jp)
    330 {
    331     while (*inpos < inlen) {
    332         Py_UCS4 c = INCHAR1;
    333         DBCHAR code;
    334 
    335         if (c < 0x80) {
    336             WRITEBYTE1((unsigned char)c);
    337             NEXT(1, 1);
    338             continue;
    339         }
    340 
    341         if (c > 0xFFFF)
    342             return 1;
    343 
    344         if (TRYMAP_ENC(jisxcommon, code, c))
    345             ;
    346         else if (c >= 0xff61 && c <= 0xff9f) {
    347             /* JIS X 0201 half-width katakana */
    348             WRITEBYTE2(0x8e, c - 0xfec0);
    349             NEXT(1, 2);
    350             continue;
    351         }
    352 #ifndef STRICT_BUILD
    353         else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */
    354             code = 0x2140;
    355         else if (c == 0xa5) { /* YEN SIGN */
    356             WRITEBYTE1(0x5c);
    357             NEXT(1, 1);
    358             continue;
    359         } else if (c == 0x203e) { /* OVERLINE */
    360             WRITEBYTE1(0x7e);
    361             NEXT(1, 1);
    362             continue;
    363         }
    364 #endif
    365         else
    366             return 1;
    367 
    368         if (code & 0x8000) {
    369             /* JIS X 0212 */
    370             WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80);
    371             NEXT(1, 3);
    372         } else {
    373             /* JIS X 0208 */
    374             WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80);
    375             NEXT(1, 2);
    376         }
    377     }
    378 
    379     return 0;
    380 }
    381 
    382 DECODER(euc_jp)
    383 {
    384     while (inleft > 0) {
    385         unsigned char c = INBYTE1;
    386         Py_UCS4 decoded;
    387 
    388         if (c < 0x80) {
    389             OUTCHAR(c);
    390             NEXT_IN(1);
    391             continue;
    392         }
    393 
    394         if (c == 0x8e) {
    395             /* JIS X 0201 half-width katakana */
    396             unsigned char c2;
    397 
    398             REQUIRE_INBUF(2);
    399             c2 = INBYTE2;
    400             if (c2 >= 0xa1 && c2 <= 0xdf) {
    401                 OUTCHAR(0xfec0 + c2);
    402                 NEXT_IN(2);
    403             }
    404             else
    405                 return 1;
    406         }
    407         else if (c == 0x8f) {
    408             unsigned char c2, c3;
    409 
    410             REQUIRE_INBUF(3);
    411             c2 = INBYTE2;
    412             c3 = INBYTE3;
    413             /* JIS X 0212 */
    414             if (TRYMAP_DEC(jisx0212, decoded, c2 ^ 0x80, c3 ^ 0x80)) {
    415                 OUTCHAR(decoded);
    416                 NEXT_IN(3);
    417             }
    418             else
    419                 return 1;
    420         }
    421         else {
    422             unsigned char c2;
    423 
    424             REQUIRE_INBUF(2);
    425             c2 = INBYTE2;
    426             /* JIS X 0208 */
    427 #ifndef STRICT_BUILD
    428             if (c == 0xa1 && c2 == 0xc0)
    429                 /* FULL-WIDTH REVERSE SOLIDUS */
    430                 OUTCHAR(0xff3c);
    431             else
    432 #endif
    433             if (TRYMAP_DEC(jisx0208, decoded, c ^ 0x80, c2 ^ 0x80))
    434                 OUTCHAR(decoded);
    435             else
    436                 return 1;
    437             NEXT_IN(2);
    438         }
    439     }
    440 
    441     return 0;
    442 }
    443 
    444 
    445 /*
    446  * SHIFT_JIS codec
    447  */
    448 
    449 ENCODER(shift_jis)
    450 {
    451     while (*inpos < inlen) {
    452         Py_UCS4 c = INCHAR1;
    453         DBCHAR code;
    454         unsigned char c1, c2;
    455 
    456 #ifdef STRICT_BUILD
    457         JISX0201_R_ENCODE(c, code)
    458 #else
    459         if (c < 0x80)
    460             code = c;
    461         else if (c == 0x00a5)
    462             code = 0x5c; /* YEN SIGN */
    463         else if (c == 0x203e)
    464             code = 0x7e; /* OVERLINE */
    465 #endif
    466         else JISX0201_K_ENCODE(c, code)
    467         else if (c > 0xFFFF)
    468             return 1;
    469         else
    470             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             continue;
    478         }
    479 
    480         REQUIRE_OUTBUF(2);
    481 
    482         if (code == NOCHAR) {
    483             if (TRYMAP_ENC(jisxcommon, code, c))
    484                 ;
    485 #ifndef STRICT_BUILD
    486             else if (c == 0xff3c)
    487                 code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
    488 #endif
    489             else
    490                 return 1;
    491 
    492             if (code & 0x8000) /* MSB set: JIS X 0212 */
    493                 return 1;
    494         }
    495 
    496         c1 = code >> 8;
    497         c2 = code & 0xff;
    498         c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
    499         c1 = (c1 - 0x21) >> 1;
    500         OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1);
    501         OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
    502         NEXT(1, 2);
    503     }
    504 
    505     return 0;
    506 }
    507 
    508 DECODER(shift_jis)
    509 {
    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         if (c < 0x80)
    518             OUTCHAR(c);
    519 #endif
    520         else JISX0201_K_DECODE(c, writer)
    521         else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
    522             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             c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
    530             c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
    531             c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1) + 0x21);
    532             c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
    533 
    534 #ifndef STRICT_BUILD
    535             if (c1 == 0x21 && c2 == 0x40) {
    536                 /* FULL-WIDTH REVERSE SOLIDUS */
    537                 OUTCHAR(0xff3c);
    538                 NEXT_IN(2);
    539                 continue;
    540             }
    541 #endif
    542             if (TRYMAP_DEC(jisx0208, decoded, c1, c2)) {
    543                 OUTCHAR(decoded);
    544                 NEXT_IN(2);
    545                 continue;
    546             }
    547             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  * SHIFT_JIS-2004 codec
    562  */
    563 
    564 ENCODER(shift_jis_2004)
    565 {
    566     while (*inpos < inlen) {
    567         Py_UCS4 c = INCHAR1;
    568         DBCHAR code = NOCHAR;
    569         int c1, c2;
    570         Py_ssize_t insize;
    571 
    572         JISX0201_ENCODE(c, code)
    573 
    574         if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
    575             WRITEBYTE1((unsigned char)code);
    576             NEXT(1, 1);
    577             continue;
    578         }
    579 
    580         REQUIRE_OUTBUF(2);
    581         insize = 1;
    582 
    583         if (code == NOCHAR) {
    584             if (c <= 0xffff) {
    585                 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                             if (flags & MBENC_FLUSH) {
    590                             code = find_pairencmap
    591                                 ((ucs2_t)c, 0,
    592                               jisx0213_pair_encmap,
    593                                 JISX0213_ENCPAIRS);
    594                             if (code == DBCINV)
    595                                 return 1;
    596                             }
    597                             else
    598                                 return MBERR_TOOFEW;
    599                         }
    600                         else {
    601                             Py_UCS4 ch2 = INCHAR2;
    602                             code = find_pairencmap(
    603                                 (ucs2_t)c, ch2,
    604                               jisx0213_pair_encmap,
    605                                 JISX0213_ENCPAIRS);
    606                             if (code == DBCINV) {
    607                             code = find_pairencmap(
    608                                 (ucs2_t)c, 0,
    609                               jisx0213_pair_encmap,
    610                                 JISX0213_ENCPAIRS);
    611                             if (code == DBCINV)
    612                                 return 1;
    613                             }
    614                             else
    615                                 insize = 2;
    616                         }
    617                     }
    618                 }
    619                 else if (TRYMAP_ENC(jisxcommon, code, c)) {
    620                     /* abandon JIS X 0212 codes */
    621                     if (code & 0x8000)
    622                         return 1;
    623                 }
    624                 else
    625                     return 1;
    626             }
    627             else if (c >> 16 == EMPBASE >> 16) {
    628                 EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
    629                 else if (TRYMAP_ENC(jisx0213_emp, code, c&0xffff))
    630                     ;
    631                 else
    632                     return insize;
    633             }
    634             else
    635                 return insize;
    636         }
    637 
    638         c1 = code >> 8;
    639         c2 = (code & 0xff) - 0x21;
    640 
    641         if (c1 & 0x80) {
    642             /* Plane 2 */
    643             if (c1 >= 0xee)
    644                 c1 -= 0x87;
    645             else if (c1 >= 0xac || c1 == 0xa8)
    646                 c1 -= 0x49;
    647             else
    648                 c1 -= 0x43;
    649         }
    650         else {
    651             /* Plane 1 */
    652             c1 -= 0x21;
    653         }
    654 
    655         if (c1 & 1)
    656             c2 += 0x5e;
    657         c1 >>= 1;
    658         OUTBYTE1(c1 + (c1 < 0x1f ? 0x81 : 0xc1));
    659         OUTBYTE2(c2 + (c2 < 0x3f ? 0x40 : 0x41));
    660 
    661         NEXT(insize, 2);
    662     }
    663 
    664     return 0;
    665 }
    666 
    667 DECODER(shift_jis_2004)
    668 {
    669     while (inleft > 0) {
    670         unsigned char c = INBYTE1;
    671 
    672         JISX0201_DECODE(c, writer)
    673         else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
    674             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             c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
    683             c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
    684             c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1));
    685             c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
    686 
    687             if (c1 < 0x5e) { /* Plane 1 */
    688                 c1 += 0x21;
    689                 EMULATE_JISX0213_2000_DECODE_PLANE1(writer,
    690                                 c1, c2)
    691                 else if (TRYMAP_DEC(jisx0208, decoded, c1, c2))
    692                     OUTCHAR(decoded);
    693                 else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c1, c2))
    694                     OUTCHAR(decoded);
    695                 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                 if (c1 >= 0x67)
    705                     c1 += 0x07;
    706                 else if (c1 >= 0x63 || c1 == 0x5f)
    707                     c1 -= 0x37;
    708                 else
    709                     c1 -= 0x3d;
    710 
    711                 EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
    712                                 c1, c2)
    713                 else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c1, c2))
    714                     OUTCHAR(decoded);
    715                 else if (TRYMAP_DEC(jisx0213_2_emp, code, c1, c2)) {
    716                     OUTCHAR(EMPBASE | code);
    717                     NEXT_IN(2);
    718                     continue;
    719                 }
    720                 else
    721                     return 1;
    722                 NEXT_IN(2);
    723             }
    724             continue;
    725         }
    726         else
    727             return 1;
    728 
    729         NEXT_IN(1); /* JIS X 0201 */
    730     }
    731 
    732     return 0;
    733 }
    734 
    735 
    736 BEGIN_MAPPINGS_LIST
    737   MAPPING_DECONLY(jisx0208)
    738   MAPPING_DECONLY(jisx0212)
    739   MAPPING_ENCONLY(jisxcommon)
    740   MAPPING_DECONLY(jisx0213_1_bmp)
    741   MAPPING_DECONLY(jisx0213_2_bmp)
    742   MAPPING_ENCONLY(jisx0213_bmp)
    743   MAPPING_DECONLY(jisx0213_1_emp)
    744   MAPPING_DECONLY(jisx0213_2_emp)
    745   MAPPING_ENCONLY(jisx0213_emp)
    746   MAPPING_ENCDEC(jisx0213_pair)
    747   MAPPING_ENCDEC(cp932ext)
    748 END_MAPPINGS_LIST
    749 
    750 BEGIN_CODECS_LIST
    751   CODEC_STATELESS(shift_jis)
    752   CODEC_STATELESS(cp932)
    753   CODEC_STATELESS(euc_jp)
    754   CODEC_STATELESS(shift_jis_2004)
    755   CODEC_STATELESS(euc_jis_2004)
    756   { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) },
    757   { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) },
    758 END_CODECS_LIST
    759 
    760 I_AM_A_MODULE_FOR(jp)
    761