Home | History | Annotate | Download | only in cjkcodecs
      1 /*
      2  * _codecs_tw.c: Codecs collection for Taiwan's encodings
      3  *
      4  * Written by Hye-Shik Chang <perky (at) FreeBSD.org>
      5  */
      6 
      7 #include "cjkcodecs.h"
      8 #include "mappings_tw.h"
      9 
     10 /*
     11  * BIG5 codec
     12  */
     13 
     14 ENCODER(big5)
     15 {
     16     while (*inpos < inlen) {
     17         Py_UCS4 c = INCHAR1;
     18         DBCHAR code;
     19 
     20         if (c < 0x80) {
     21             REQUIRE_OUTBUF(1);
     22             **outbuf = (unsigned char)c;
     23             NEXT(1, 1);
     24             continue;
     25         }
     26 
     27         if (c > 0xFFFF)
     28             return 1;
     29 
     30         REQUIRE_OUTBUF(2);
     31 
     32         if (TRYMAP_ENC(big5, code, c))
     33             ;
     34         else
     35             return 1;
     36 
     37         OUTBYTE1(code >> 8);
     38         OUTBYTE2(code & 0xFF);
     39         NEXT(1, 2);
     40     }
     41 
     42     return 0;
     43 }
     44 
     45 DECODER(big5)
     46 {
     47     while (inleft > 0) {
     48         unsigned char c = INBYTE1;
     49         Py_UCS4 decoded;
     50 
     51         if (c < 0x80) {
     52             OUTCHAR(c);
     53             NEXT_IN(1);
     54             continue;
     55         }
     56 
     57         REQUIRE_INBUF(2);
     58         if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
     59             OUTCHAR(decoded);
     60             NEXT_IN(2);
     61         }
     62         else return 1;
     63     }
     64 
     65     return 0;
     66 }
     67 
     68 
     69 /*
     70  * CP950 codec
     71  */
     72 
     73 ENCODER(cp950)
     74 {
     75     while (*inpos < inlen) {
     76         Py_UCS4 c = INCHAR1;
     77         DBCHAR code;
     78 
     79         if (c < 0x80) {
     80             WRITEBYTE1((unsigned char)c);
     81             NEXT(1, 1);
     82             continue;
     83         }
     84 
     85         if (c > 0xFFFF)
     86             return 1;
     87 
     88         REQUIRE_OUTBUF(2);
     89         if (TRYMAP_ENC(cp950ext, code, c))
     90             ;
     91         else if (TRYMAP_ENC(big5, code, c))
     92             ;
     93         else
     94             return 1;
     95 
     96         OUTBYTE1(code >> 8);
     97         OUTBYTE2(code & 0xFF);
     98         NEXT(1, 2);
     99     }
    100 
    101     return 0;
    102 }
    103 
    104 DECODER(cp950)
    105 {
    106     while (inleft > 0) {
    107         unsigned char c = INBYTE1;
    108         Py_UCS4 decoded;
    109 
    110         if (c < 0x80) {
    111             OUTCHAR(c);
    112             NEXT_IN(1);
    113             continue;
    114         }
    115 
    116         REQUIRE_INBUF(2);
    117 
    118         if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2))
    119             OUTCHAR(decoded);
    120         else if (TRYMAP_DEC(big5, decoded, c, INBYTE2))
    121             OUTCHAR(decoded);
    122         else
    123             return 1;
    124 
    125         NEXT_IN(2);
    126     }
    127 
    128     return 0;
    129 }
    130 
    131 
    132 
    133 BEGIN_MAPPINGS_LIST
    134   MAPPING_ENCDEC(big5)
    135   MAPPING_ENCDEC(cp950ext)
    136 END_MAPPINGS_LIST
    137 
    138 BEGIN_CODECS_LIST
    139   CODEC_STATELESS(big5)
    140   CODEC_STATELESS(cp950)
    141 END_CODECS_LIST
    142 
    143 I_AM_A_MODULE_FOR(tw)
    144