1/* 2 * _codecs_tw.c: Codecs collection for Taiwan's encodings 3 * 4 * Written by Hye-Shik Chang <perky@FreeBSD.org> 5 */ 6 7#include "cjkcodecs.h" 8#include "mappings_tw.h" 9 10/* 11 * BIG5 codec 12 */ 13 14ENCODER(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 45DECODER(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 73ENCODER(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 104DECODER(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 133BEGIN_MAPPINGS_LIST 134 MAPPING_ENCDEC(big5) 135 MAPPING_ENCDEC(cp950ext) 136END_MAPPINGS_LIST 137 138BEGIN_CODECS_LIST 139 CODEC_STATELESS(big5) 140 CODEC_STATELESS(cp950) 141END_CODECS_LIST 142 143I_AM_A_MODULE_FOR(tw) 144