blob: 765986098701c62d19b8ddaed7d3d1c85c6b2ee9 [file] [log] [blame]
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001/*
2 * _gb2312.c: the GB2312 codec
3 *
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
5 * $CJKCodecs: _gb2312.c,v 1.2 2003/12/31 05:46:55 perky Exp $
6 */
7
8#include "codeccommon.h"
9
10ENCMAP(gbcommon)
11DECMAP(gb2312)
12
13ENCODER(gb2312)
14{
15 while (inleft > 0) {
16 Py_UNICODE c = IN1;
17 DBCHAR code;
18
19 if (c < 0x80) {
Hye-Shik Changd210a5b2004-01-23 14:36:17 +000020 WRITE1((unsigned char)c)
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +000021 NEXT(1, 1)
22 continue;
23 }
24 UCS4INVALID(c)
25
26 RESERVE_OUTBUF(2)
27 TRYMAP_ENC(gbcommon, code, c);
28 else return 1;
29
30 if (code & 0x8000) /* MSB set: GBK */
31 return 1;
32
33 OUT1((code >> 8) | 0x80)
34 OUT2((code & 0xFF) | 0x80)
35 NEXT(1, 2)
36 }
37
38 return 0;
39}
40
41DECODER(gb2312)
42{
43 while (inleft > 0) {
44 unsigned char c = **inbuf;
45
46 RESERVE_OUTBUF(1)
47
48 if (c < 0x80) {
49 OUT1(c)
50 NEXT(1, 1)
51 continue;
52 }
53
54 RESERVE_INBUF(2)
55 TRYMAP_DEC(gb2312, **outbuf, c ^ 0x80, IN2 ^ 0x80) {
56 NEXT(2, 1)
57 } else return 2;
58 }
59
60 return 0;
61}
62
63#include "codecentry.h"
64BEGIN_CODEC_REGISTRY(gb2312)
65 MAPOPEN(zh_CN)
66 IMPORTMAP_DEC(gb2312)
67 IMPORTMAP_ENC(gbcommon)
68 MAPCLOSE()
69END_CODEC_REGISTRY(gb2312)