Viewing file: _codecs_tw.c (2.3 KB) -rw-r--r-- Select action/file-type: (+) | (+) | (+) | Code (+) | Session (+) | (+) | SDB (+) | (+) | (+) | (+) | (+) | (+) |
/* * _codecs_tw.c: Codecs collection for Taiwan's encodings * * Written by Hye-Shik Chang <perky@FreeBSD.org> */
#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)
|