Branch data 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 : 18153 : ENCODER(big5)
15 : : {
16 [ + + ]: 79309 : while (*inpos < inlen) {
17 : 61284 : Py_UCS4 c = INCHAR1;
18 : : DBCHAR code;
19 : :
20 [ + + ]: 61284 : if (c < 0x80) {
21 [ + + ]: 27258 : REQUIRE_OUTBUF(1);
22 : 27257 : **outbuf = (unsigned char)c;
23 : 27257 : NEXT(1, 1);
24 : 27257 : continue;
25 : : }
26 : :
27 [ - + ]: 34026 : if (c > 0xFFFF)
28 : 0 : return 1;
29 : :
30 [ - + ]: 34026 : REQUIRE_OUTBUF(2);
31 : :
32 [ + + + - : 34026 : if (TRYMAP_ENC(big5, code, c))
+ - + + ]
33 : : ;
34 : : else
35 : 127 : return 1;
36 : :
37 : 33899 : OUTBYTE1(code >> 8);
38 : 33899 : OUTBYTE2(code & 0xFF);
39 : 33899 : NEXT(1, 2);
40 : : }
41 : :
42 : 18025 : return 0;
43 : : }
44 : :
45 : 21149 : DECODER(big5)
46 : : {
47 [ + + ]: 88408 : while (inleft > 0) {
48 : 69164 : unsigned char c = INBYTE1;
49 : : Py_UCS4 decoded;
50 : :
51 [ + + ]: 69164 : if (c < 0x80) {
52 [ - + ]: 32741 : OUTCHAR(c);
53 : 32741 : NEXT_IN(1);
54 : 32741 : continue;
55 : : }
56 : :
57 [ + + ]: 36423 : REQUIRE_INBUF(2);
58 [ + + + - : 34603 : if (TRYMAP_DEC(big5, decoded, c, INBYTE2)) {
+ + + - ]
59 [ - + ]: 34518 : OUTCHAR(decoded);
60 : 34518 : NEXT_IN(2);
61 : : }
62 : 85 : else return 1;
63 : : }
64 : :
65 : 19244 : return 0;
66 : : }
67 : :
68 : :
69 : : /*
70 : : * CP950 codec
71 : : */
72 : :
73 : 13774 : ENCODER(cp950)
74 : : {
75 [ + + ]: 28785 : while (*inpos < inlen) {
76 : 15111 : Py_UCS4 c = INCHAR1;
77 : : DBCHAR code;
78 : :
79 [ + + ]: 15111 : if (c < 0x80) {
80 [ - + ]: 1520 : WRITEBYTE1((unsigned char)c);
81 : 1520 : NEXT(1, 1);
82 : 1520 : continue;
83 : : }
84 : :
85 [ - + ]: 13591 : if (c > 0xFFFF)
86 : 0 : return 1;
87 : :
88 [ - + ]: 13591 : REQUIRE_OUTBUF(2);
89 [ + + + + : 13591 : if (TRYMAP_ENC(cp950ext, code, c))
+ + + + ]
90 : : ;
91 [ + + + - : 13544 : else if (TRYMAP_ENC(big5, code, c))
+ - + - ]
92 : : ;
93 : : else
94 : 100 : return 1;
95 : :
96 : 13491 : OUTBYTE1(code >> 8);
97 : 13491 : OUTBYTE2(code & 0xFF);
98 : 13491 : NEXT(1, 2);
99 : : }
100 : :
101 : 13674 : return 0;
102 : : }
103 : :
104 : 13753 : DECODER(cp950)
105 : : {
106 [ + + ]: 33816 : while (inleft > 0) {
107 : 20140 : unsigned char c = INBYTE1;
108 : : Py_UCS4 decoded;
109 : :
110 [ + + ]: 20140 : if (c < 0x80) {
111 [ - + ]: 6480 : OUTCHAR(c);
112 : 6480 : NEXT_IN(1);
113 : 6480 : continue;
114 : : }
115 : :
116 [ + + ]: 13660 : REQUIRE_INBUF(2);
117 : :
118 [ + + + + : 13658 : if (TRYMAP_DEC(cp950ext, decoded, c, INBYTE2))
+ + + + ]
119 [ - + ]: 47 : OUTCHAR(decoded);
120 [ + + + - : 13611 : else if (TRYMAP_DEC(big5, decoded, c, INBYTE2))
+ - + - ]
121 [ - + ]: 13536 : OUTCHAR(decoded);
122 : : else
123 : 75 : return 1;
124 : :
125 : 13583 : NEXT_IN(2);
126 : : }
127 : :
128 : 13676 : 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 : 9 : I_AM_A_MODULE_FOR(tw)
|