Line data Source code
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 0 : ENCODER(big5)
15 : {
16 0 : while (inleft > 0) {
17 0 : Py_UNICODE c = **inbuf;
18 : DBCHAR code;
19 :
20 0 : if (c < 0x80) {
21 0 : REQUIRE_OUTBUF(1)
22 0 : **outbuf = (unsigned char)c;
23 0 : NEXT(1, 1)
24 0 : continue;
25 : }
26 0 : UCS4INVALID(c)
27 :
28 0 : REQUIRE_OUTBUF(2)
29 :
30 0 : TRYMAP_ENC(big5, code, c);
31 0 : else return 1;
32 :
33 0 : OUT1(code >> 8)
34 0 : OUT2(code & 0xFF)
35 0 : NEXT(1, 2)
36 : }
37 :
38 0 : return 0;
39 : }
40 :
41 0 : DECODER(big5)
42 : {
43 0 : while (inleft > 0) {
44 0 : unsigned char c = IN1;
45 :
46 0 : REQUIRE_OUTBUF(1)
47 :
48 0 : if (c < 0x80) {
49 0 : OUT1(c)
50 0 : NEXT(1, 1)
51 0 : continue;
52 : }
53 :
54 0 : REQUIRE_INBUF(2)
55 0 : TRYMAP_DEC(big5, **outbuf, c, IN2) {
56 0 : NEXT(2, 1)
57 : }
58 0 : else return 1;
59 : }
60 :
61 0 : return 0;
62 : }
63 :
64 :
65 : /*
66 : * CP950 codec
67 : */
68 :
69 0 : ENCODER(cp950)
70 : {
71 0 : while (inleft > 0) {
72 0 : Py_UNICODE c = IN1;
73 : DBCHAR code;
74 :
75 0 : if (c < 0x80) {
76 0 : WRITE1((unsigned char)c)
77 0 : NEXT(1, 1)
78 0 : continue;
79 : }
80 0 : UCS4INVALID(c)
81 :
82 0 : REQUIRE_OUTBUF(2)
83 0 : TRYMAP_ENC(cp950ext, code, c);
84 0 : else TRYMAP_ENC(big5, code, c);
85 0 : else return 1;
86 :
87 0 : OUT1(code >> 8)
88 0 : OUT2(code & 0xFF)
89 0 : NEXT(1, 2)
90 : }
91 :
92 0 : return 0;
93 : }
94 :
95 0 : DECODER(cp950)
96 : {
97 0 : while (inleft > 0) {
98 0 : unsigned char c = IN1;
99 :
100 0 : REQUIRE_OUTBUF(1)
101 :
102 0 : if (c < 0x80) {
103 0 : OUT1(c)
104 0 : NEXT(1, 1)
105 0 : continue;
106 : }
107 :
108 0 : REQUIRE_INBUF(2)
109 :
110 0 : TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
111 0 : else TRYMAP_DEC(big5, **outbuf, c, IN2);
112 0 : else return 1;
113 :
114 0 : NEXT(2, 1)
115 : }
116 :
117 0 : 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 0 : I_AM_A_MODULE_FOR(tw)
|