equal
deleted
inserted
replaced
|
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 |
|
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) |