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
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