Issue #5262: Improved fix.
[python.git] / Modules / cjkcodecs / _codecs_tw.c
blob8ccbca1df0b6053331f77bd24ea26094b842c10f
1 /*
2 * _codecs_tw.c: Codecs collection for Taiwan's encodings
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
5 */
7 #include "cjkcodecs.h"
8 #include "mappings_tw.h"
11 * BIG5 codec
14 ENCODER(big5)
16 while (inleft > 0) {
17 Py_UNICODE c = **inbuf;
18 DBCHAR code;
20 if (c < 0x80) {
21 REQUIRE_OUTBUF(1)
22 **outbuf = (unsigned char)c;
23 NEXT(1, 1)
24 continue;
26 UCS4INVALID(c)
28 REQUIRE_OUTBUF(2)
30 TRYMAP_ENC(big5, code, c);
31 else return 1;
33 OUT1(code >> 8)
34 OUT2(code & 0xFF)
35 NEXT(1, 2)
38 return 0;
41 DECODER(big5)
43 while (inleft > 0) {
44 unsigned char c = IN1;
46 REQUIRE_OUTBUF(1)
48 if (c < 0x80) {
49 OUT1(c)
50 NEXT(1, 1)
51 continue;
54 REQUIRE_INBUF(2)
55 TRYMAP_DEC(big5, **outbuf, c, IN2) {
56 NEXT(2, 1)
58 else return 2;
61 return 0;
66 * CP950 codec
69 ENCODER(cp950)
71 while (inleft > 0) {
72 Py_UNICODE c = IN1;
73 DBCHAR code;
75 if (c < 0x80) {
76 WRITE1((unsigned char)c)
77 NEXT(1, 1)
78 continue;
80 UCS4INVALID(c)
82 REQUIRE_OUTBUF(2)
83 TRYMAP_ENC(cp950ext, code, c);
84 else TRYMAP_ENC(big5, code, c);
85 else return 1;
87 OUT1(code >> 8)
88 OUT2(code & 0xFF)
89 NEXT(1, 2)
92 return 0;
95 DECODER(cp950)
97 while (inleft > 0) {
98 unsigned char c = IN1;
100 REQUIRE_OUTBUF(1)
102 if (c < 0x80) {
103 OUT1(c)
104 NEXT(1, 1)
105 continue;
108 REQUIRE_INBUF(2)
110 TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
111 else TRYMAP_DEC(big5, **outbuf, c, IN2);
112 else return 2;
114 NEXT(2, 1)
117 return 0;
122 BEGIN_MAPPINGS_LIST
123 MAPPING_ENCDEC(big5)
124 MAPPING_ENCDEC(cp950ext)
125 END_MAPPINGS_LIST
127 BEGIN_CODECS_LIST
128 CODEC_STATELESS(big5)
129 CODEC_STATELESS(cp950)
130 END_CODECS_LIST
132 I_AM_A_MODULE_FOR(tw)