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 (inleft > 0) { 17 Py_UNICODE c = **inbuf; 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 UCS4INVALID(c) 27 28 REQUIRE_OUTBUF(2) 29 30 TRYMAP_ENC(big5, code, c); 31 else return 1; 32 33 OUT1(code >> 8) 34 OUT2(code & 0xFF) 35 NEXT(1, 2) 36 } 37 38 return 0; 39 } 40 41 DECODER(big5) 42 { 43 while (inleft > 0) { 44 unsigned char c = IN1; 45 46 REQUIRE_OUTBUF(1) 47 48 if (c < 0x80) { 49 OUT1(c) 50 NEXT(1, 1) 51 continue; 52 } 53 54 REQUIRE_INBUF(2) 55 TRYMAP_DEC(big5, **outbuf, c, IN2) { 56 NEXT(2, 1) 57 } 58 else return 2; 59 } 60 61 return 0; 62 } 63 64 65 /* 66 * CP950 codec 67 */ 68 69 ENCODER(cp950) 70 { 71 while (inleft > 0) { 72 Py_UNICODE c = IN1; 73 DBCHAR code; 74 75 if (c < 0x80) { 76 WRITE1((unsigned char)c) 77 NEXT(1, 1) 78 continue; 79 } 80 UCS4INVALID(c) 81 82 REQUIRE_OUTBUF(2) 83 TRYMAP_ENC(cp950ext, code, c); 84 else TRYMAP_ENC(big5, code, c); 85 else return 1; 86 87 OUT1(code >> 8) 88 OUT2(code & 0xFF) 89 NEXT(1, 2) 90 } 91 92 return 0; 93 } 94 95 DECODER(cp950) 96 { 97 while (inleft > 0) { 98 unsigned char c = IN1; 99 100 REQUIRE_OUTBUF(1) 101 102 if (c < 0x80) { 103 OUT1(c) 104 NEXT(1, 1) 105 continue; 106 } 107 108 REQUIRE_INBUF(2) 109 110 TRYMAP_DEC(cp950ext, **outbuf, c, IN2); 111 else TRYMAP_DEC(big5, **outbuf, c, IN2); 112 else return 2; 113 114 NEXT(2, 1) 115 } 116 117 return 0; 118 } 119 120 121 122 BEGIN_MAPPINGS_LIST 123 MAPPING_ENCDEC(big5) 124 MAPPING_ENCDEC(cp950ext) 125 END_MAPPINGS_LIST 126 127 BEGIN_CODECS_LIST 128 CODEC_STATELESS(big5) 129 CODEC_STATELESS(cp950) 130 END_CODECS_LIST 131 132 I_AM_A_MODULE_FOR(tw) 133