blob: 38cf7239b4b81abfbd9916cf0d32628ef6762dce [file] [log] [blame]
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001/*
2 * _codecs_tw.c: Codecs collection for Taiwan's encodings
3 *
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00005 */
6
7#include "cjkcodecs.h"
8#include "mappings_tw.h"
9
10/*
11 * BIG5 codec
12 */
13
14ENCODER(big5)
15{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000016 while (inleft > 0) {
17 Py_UNICODE c = **inbuf;
18 DBCHAR code;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000019
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000020 if (c < 0x80) {
21 REQUIRE_OUTBUF(1)
22 **outbuf = (unsigned char)c;
23 NEXT(1, 1)
24 continue;
25 }
26 UCS4INVALID(c)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000027
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000028 REQUIRE_OUTBUF(2)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000029
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 TRYMAP_ENC(big5, code, c);
31 else return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000032
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000033 OUT1(code >> 8)
34 OUT2(code & 0xFF)
35 NEXT(1, 2)
36 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000037
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000038 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000039}
40
41DECODER(big5)
42{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000043 while (inleft > 0) {
44 unsigned char c = IN1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000045
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000046 REQUIRE_OUTBUF(1)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048 if (c < 0x80) {
49 OUT1(c)
50 NEXT(1, 1)
51 continue;
52 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000053
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000054 REQUIRE_INBUF(2)
55 TRYMAP_DEC(big5, **outbuf, c, IN2) {
56 NEXT(2, 1)
57 }
58 else return 2;
59 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000060
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000061 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000062}
63
64
65/*
66 * CP950 codec
67 */
68
69ENCODER(cp950)
70{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000071 while (inleft > 0) {
72 Py_UNICODE c = IN1;
73 DBCHAR code;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000074
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000075 if (c < 0x80) {
76 WRITE1((unsigned char)c)
77 NEXT(1, 1)
78 continue;
79 }
80 UCS4INVALID(c)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000081
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000082 REQUIRE_OUTBUF(2)
83 TRYMAP_ENC(cp950ext, code, c);
84 else TRYMAP_ENC(big5, code, c);
85 else return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000086
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000087 OUT1(code >> 8)
88 OUT2(code & 0xFF)
89 NEXT(1, 2)
90 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000091
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000092 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000093}
94
95DECODER(cp950)
96{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000097 while (inleft > 0) {
98 unsigned char c = IN1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000099
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000100 REQUIRE_OUTBUF(1)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000101
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000102 if (c < 0x80) {
103 OUT1(c)
104 NEXT(1, 1)
105 continue;
106 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000107
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000108 REQUIRE_INBUF(2)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
111 else TRYMAP_DEC(big5, **outbuf, c, IN2);
112 else return 2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000113
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000114 NEXT(2, 1)
115 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000116
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000117 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000118}
119
120
121
122BEGIN_MAPPINGS_LIST
123 MAPPING_ENCDEC(big5)
124 MAPPING_ENCDEC(cp950ext)
125END_MAPPINGS_LIST
126
127BEGIN_CODECS_LIST
128 CODEC_STATELESS(big5)
129 CODEC_STATELESS(cp950)
130END_CODECS_LIST
131
132I_AM_A_MODULE_FOR(tw)