123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143 |
- /*
- * _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(2)
- MAPPING_ENCDEC(big5)
- MAPPING_ENCDEC(cp950ext)
- END_MAPPINGS_LIST
- BEGIN_CODECS_LIST(2)
- CODEC_STATELESS(big5)
- CODEC_STATELESS(cp950)
- END_CODECS_LIST
- I_AM_A_MODULE_FOR(tw)
|