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