1/*
2 * _codecs_tw.c: Codecs collection for Taiwan's encodings
3 *
4 * Written by Hye-Shik Chang <[email protected]>
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