blob: dcb56f12d513ea46855115077c54b5383b42ef6a [file] [log] [blame]
Hye-Shik Chang3e2a3062004-01-17 14:29:29 +00001/*
2 * _cp950.c: the CP950 codec
3 *
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
5 * $CJKCodecs: _cp950.c,v 1.2 2003/12/31 05:46:55 perky Exp $
6 */
7
8#include "codeccommon.h"
9
10ENCMAP(big5)
11ENCMAP(cp950ext)
12DECMAP(big5)
13DECMAP(cp950ext)
14
15ENCODER(cp950)
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 TRYMAP_ENC(cp950ext, code, c);
30 else TRYMAP_ENC(big5, code, c);
31 else return 1;
32
33 OUT1(code >> 8)
34 OUT2(code & 0xFF)
35 NEXT(1, 2)
36 }
37
38 return 0;
39}
40
41DECODER(cp950)
42{
43 while (inleft > 0) {
44 unsigned char c = IN1;
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
56 TRYMAP_DEC(cp950ext, **outbuf, c, IN2);
57 else TRYMAP_DEC(big5, **outbuf, c, IN2);
58 else return 2;
59
60 NEXT(2, 1)
61 }
62
63 return 0;
64}
65
66#include "codecentry.h"
67BEGIN_CODEC_REGISTRY(cp950)
68 MAPOPEN(zh_TW)
69 IMPORTMAP_ENCDEC(big5)
70 IMPORTMAP_ENCDEC(cp950ext)
71 MAPCLOSE()
72END_CODEC_REGISTRY(cp950)