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