/* * _codecs_tw.c: Codecs collection for Taiwan's encodings * * Written by Hye-Shik Chang */ #include "cjkcodecs.h" #include "mappings_tw.h" /* * BIG5 codec */ ENCODER(big5) { while (*inpos < inlen) { Py_UCS4 c = INCHAR1; DBCHAR code; if (c < 0x80) { REQUIRE_OUTBUF(1); **outbuf = (unsigned char)c; NEXT(1, 1); continue; } if (c > 0xFFFF) return 1; REQUIRE_OUTBUF(2); if (TRYMAP_ENC(big5, code, c)) ; else return 1; OUTBYTE1(code >> 8); OUTBYTE2(code & 0xFF); NEXT(1, 2); } return 0; } DECODER(big5) { while (inleft > 0) { unsigned char c = INBYTE1; Py_UCS4 decoded; if (c < 0x80) { OUTCHAR(c); NEXT_IN(1); continue; } REQUIRE_INBUF(2); if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) { OUTCHAR(decoded); NEXT_IN(2); } else return 1; } return 0; } /* * CP950 codec */ ENCODER(cp950) { while (*inpos < inlen) { Py_UCS4 c = INCHAR1; DBCHAR code; if (c < 0x80) { WRITEBYTE1((unsigned char)c); NEXT(1, 1); continue; } if (c > 0xFFFF) return 1; REQUIRE_OUTBUF(2); if (TRYMAP_ENC(cp950ext, code, c)) ; else if (TRYMAP_ENC(big5, code, c)) ; else return 1; OUTBYTE1(code >> 8); OUTBYTE2(code & 0xFF); NEXT(1, 2); } return 0; } DECODER(cp950) { while (inleft > 0) { unsigned char c = INBYTE1; Py_UCS4 decoded; if (c < 0x80) { OUTCHAR(c); NEXT_IN(1); continue; } REQUIRE_INBUF(2); if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2)) OUTCHAR(decoded); else if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) OUTCHAR(decoded); else return 1; NEXT_IN(2); } return 0; } BEGIN_MAPPINGS_LIST MAPPING_ENCDEC(big5) MAPPING_ENCDEC(cp950ext) END_MAPPINGS_LIST BEGIN_CODECS_LIST CODEC_STATELESS(big5) CODEC_STATELESS(cp950) END_CODECS_LIST I_AM_A_MODULE_FOR(tw)