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