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 
ENCODER(big5)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 
DECODER(big5)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 
ENCODER(cp950)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 
DECODER(cp950)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