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 (inleft > 0) {
     17         Py_UNICODE c = **inbuf;
     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         UCS4INVALID(c)
     27 
     28         REQUIRE_OUTBUF(2)
     29 
     30         TRYMAP_ENC(big5, code, c);
     31         else return 1;
     32 
     33         OUT1(code >> 8)
     34         OUT2(code & 0xFF)
     35         NEXT(1, 2)
     36     }
     37 
     38     return 0;
     39 }
     40 
     41 DECODER(big5)
     42 {
     43     while (inleft > 0) {
     44         unsigned char c = IN1;
     45 
     46         REQUIRE_OUTBUF(1)
     47 
     48         if (c < 0x80) {
     49             OUT1(c)
     50             NEXT(1, 1)
     51             continue;
     52         }
     53 
     54         REQUIRE_INBUF(2)
     55         TRYMAP_DEC(big5, **outbuf, c, IN2) {
     56             NEXT(2, 1)
     57         }
     58         else return 2;
     59     }
     60 
     61     return 0;
     62 }
     63 
     64 
     65 /*
     66  * CP950 codec
     67  */
     68 
     69 ENCODER(cp950)
     70 {
     71     while (inleft > 0) {
     72         Py_UNICODE c = IN1;
     73         DBCHAR code;
     74 
     75         if (c < 0x80) {
     76             WRITE1((unsigned char)c)
     77             NEXT(1, 1)
     78             continue;
     79         }
     80         UCS4INVALID(c)
     81 
     82         REQUIRE_OUTBUF(2)
     83         TRYMAP_ENC(cp950ext, code, c);
     84         else TRYMAP_ENC(big5, code, c);
     85         else return 1;
     86 
     87         OUT1(code >> 8)
     88         OUT2(code & 0xFF)
     89         NEXT(1, 2)
     90     }
     91 
     92     return 0;
     93 }
     94 
     95 DECODER(cp950)
     96 {
     97     while (inleft > 0) {
     98         unsigned char c = IN1;
     99 
    100         REQUIRE_OUTBUF(1)
    101 
    102         if (c < 0x80) {
    103             OUT1(c)
    104             NEXT(1, 1)
    105             continue;
    106         }
    107 
    108         REQUIRE_INBUF(2)
    109 
    110         TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
    111         else TRYMAP_DEC(big5, **outbuf, c, IN2);
    112         else return 2;
    113 
    114         NEXT(2, 1)
    115     }
    116 
    117     return 0;
    118 }
    119 
    120 
    121 
    122 BEGIN_MAPPINGS_LIST
    123   MAPPING_ENCDEC(big5)
    124   MAPPING_ENCDEC(cp950ext)
    125 END_MAPPINGS_LIST
    126 
    127 BEGIN_CODECS_LIST
    128   CODEC_STATELESS(big5)
    129   CODEC_STATELESS(cp950)
    130 END_CODECS_LIST
    131 
    132 I_AM_A_MODULE_FOR(tw)
    133