blob: 1ce4218f3089d082ed9816933039c02d078d505b [file] [log] [blame]
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001/*
2 * _codecs_iso2022.c: Codecs collection for ISO-2022 encodings.
3 *
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00005 */
6
7#define USING_IMPORTED_MAPS
8#define USING_BINARY_PAIR_SEARCH
9#define EXTERN_JISX0213_PAIR
10#define EMULATE_JISX0213_2000_ENCODE_INVALID MAP_UNMAPPABLE
11#define EMULATE_JISX0213_2000_DECODE_INVALID MAP_UNMAPPABLE
12
13#include "cjkcodecs.h"
14#include "alg_jisx0201.h"
15#include "emu_jisx0213_2000.h"
16#include "mappings_jisx0213_pair.h"
17
18/* STATE
19
20 state->c[0-3]
21
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000022 00000000
23 ||^^^^^|
24 |+-----+---- G0-3 Character Set
25 +----------- Is G0-3 double byte?
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000026
27 state->c[4]
28
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000029 00000000
30 ||
31 |+---- Locked-Shift?
32 +----- ESC Throughout
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000033*/
34
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035#define ESC 0x1B
36#define SO 0x0E
37#define SI 0x0F
38#define LF 0x0A
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000039
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040#define MAX_ESCSEQLEN 16
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000041
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042#define CHARSET_ISO8859_1 'A'
43#define CHARSET_ASCII 'B'
44#define CHARSET_ISO8859_7 'F'
45#define CHARSET_JISX0201_K 'I'
46#define CHARSET_JISX0201_R 'J'
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000047
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000048#define CHARSET_GB2312 ('A'|CHARSET_DBCS)
49#define CHARSET_JISX0208 ('B'|CHARSET_DBCS)
50#define CHARSET_KSX1001 ('C'|CHARSET_DBCS)
51#define CHARSET_JISX0212 ('D'|CHARSET_DBCS)
52#define CHARSET_GB2312_8565 ('E'|CHARSET_DBCS)
53#define CHARSET_CNS11643_1 ('G'|CHARSET_DBCS)
54#define CHARSET_CNS11643_2 ('H'|CHARSET_DBCS)
55#define CHARSET_JISX0213_2000_1 ('O'|CHARSET_DBCS)
56#define CHARSET_JISX0213_2 ('P'|CHARSET_DBCS)
57#define CHARSET_JISX0213_2004_1 ('Q'|CHARSET_DBCS)
58#define CHARSET_JISX0208_O ('@'|CHARSET_DBCS)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060#define CHARSET_DBCS 0x80
61#define ESCMARK(mark) ((mark) & 0x7f)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000062
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000063#define IS_ESCEND(c) (((c) >= 'A' && (c) <= 'Z') || (c) == '@')
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000064#define IS_ISO2022ESC(c2) \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000065 ((c2) == '(' || (c2) == ')' || (c2) == '$' || \
66 (c2) == '.' || (c2) == '&')
67 /* this is not a complete list of ISO-2022 escape sequence headers.
68 * but, it's enough to implement CJK instances of iso-2022. */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000069
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000070#define MAP_UNMAPPABLE 0xFFFF
71#define MAP_MULTIPLE_AVAIL 0xFFFE /* for JIS X 0213 */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000072
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000073#define F_SHIFTED 0x01
74#define F_ESCTHROUGHOUT 0x02
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000075
Victor Stinner28c63f72013-10-29 00:59:44 +010076#define STATE_SETG(dn, v) do { ((state)->c[dn]) = (v); } while (0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000077#define STATE_GETG(dn) ((state)->c[dn])
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000078
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079#define STATE_G0 STATE_GETG(0)
80#define STATE_G1 STATE_GETG(1)
81#define STATE_G2 STATE_GETG(2)
82#define STATE_G3 STATE_GETG(3)
83#define STATE_SETG0(v) STATE_SETG(0, v)
84#define STATE_SETG1(v) STATE_SETG(1, v)
85#define STATE_SETG2(v) STATE_SETG(2, v)
86#define STATE_SETG3(v) STATE_SETG(3, v)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000087
Victor Stinner28c63f72013-10-29 00:59:44 +010088#define STATE_SETFLAG(f) do { ((state)->c[4]) |= (f); } while (0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000089#define STATE_GETFLAG(f) ((state)->c[4] & (f))
Victor Stinner28c63f72013-10-29 00:59:44 +010090#define STATE_CLEARFLAG(f) do { ((state)->c[4]) &= ~(f); } while (0)
91#define STATE_CLEARFLAGS() do { ((state)->c[4]) = 0; } while (0)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000092
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093#define ISO2022_CONFIG ((const struct iso2022_config *)config)
94#define CONFIG_ISSET(flag) (ISO2022_CONFIG->flags & (flag))
95#define CONFIG_DESIGNATIONS (ISO2022_CONFIG->designations)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000096
97/* iso2022_config.flags */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098#define NO_SHIFT 0x01
99#define USE_G2 0x02
100#define USE_JISX0208_EXT 0x04
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000101
102/*-*- internal data structures -*-*/
103
104typedef int (*iso2022_init_func)(void);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200105typedef Py_UCS4 (*iso2022_decode_func)(const unsigned char *data);
106typedef DBCHAR (*iso2022_encode_func)(const Py_UCS4 *data, Py_ssize_t *length);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000107
108struct iso2022_designation {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000109 unsigned char mark;
110 unsigned char plane;
111 unsigned char width;
112 iso2022_init_func initializer;
113 iso2022_decode_func decoder;
114 iso2022_encode_func encoder;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000115};
116
117struct iso2022_config {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000118 int flags;
119 const struct iso2022_designation *designations; /* non-ascii desigs */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000120};
121
122/*-*- iso-2022 codec implementation -*-*/
123
124CODEC_INIT(iso2022)
125{
Brett Cannonb94767f2011-02-22 20:15:44 +0000126 const struct iso2022_designation *desig;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000127 for (desig = CONFIG_DESIGNATIONS; desig->mark; desig++)
128 if (desig->initializer != NULL && desig->initializer() != 0)
129 return -1;
130 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000131}
132
133ENCODER_INIT(iso2022)
134{
Victor Stinner28c63f72013-10-29 00:59:44 +0100135 STATE_CLEARFLAGS();
136 STATE_SETG0(CHARSET_ASCII);
137 STATE_SETG1(CHARSET_ASCII);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000138 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000139}
140
141ENCODER_RESET(iso2022)
142{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 if (STATE_GETFLAG(F_SHIFTED)) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100144 WRITEBYTE1(SI);
Victor Stinnerd9491262013-04-14 02:06:32 +0200145 NEXT_OUT(1);
Victor Stinner28c63f72013-10-29 00:59:44 +0100146 STATE_CLEARFLAG(F_SHIFTED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000147 }
148 if (STATE_G0 != CHARSET_ASCII) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100149 WRITEBYTE3(ESC, '(', 'B');
Victor Stinnerd9491262013-04-14 02:06:32 +0200150 NEXT_OUT(3);
Victor Stinner28c63f72013-10-29 00:59:44 +0100151 STATE_SETG0(CHARSET_ASCII);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000152 }
153 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000154}
155
156ENCODER(iso2022)
157{
Victor Stinnerd9491262013-04-14 02:06:32 +0200158 while (*inpos < inlen) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000159 const struct iso2022_designation *dsg;
160 DBCHAR encoded;
Victor Stinnerd9491262013-04-14 02:06:32 +0200161 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000162 Py_ssize_t insize;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000163
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000164 if (c < 0x80) {
165 if (STATE_G0 != CHARSET_ASCII) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100166 WRITEBYTE3(ESC, '(', 'B');
Victor Stinner28c63f72013-10-29 00:59:44 +0100167 STATE_SETG0(CHARSET_ASCII);
Victor Stinnerd9491262013-04-14 02:06:32 +0200168 NEXT_OUT(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 }
170 if (STATE_GETFLAG(F_SHIFTED)) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100171 WRITEBYTE1(SI);
Victor Stinner28c63f72013-10-29 00:59:44 +0100172 STATE_CLEARFLAG(F_SHIFTED);
Victor Stinnerd9491262013-04-14 02:06:32 +0200173 NEXT_OUT(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000174 }
Victor Stinner14c9fea2013-10-29 00:19:27 +0100175 WRITEBYTE1((unsigned char)c);
Victor Stinnerd9491262013-04-14 02:06:32 +0200176 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000177 continue;
178 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000179
Victor Stinnerd9491262013-04-14 02:06:32 +0200180 insize = 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000181
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000182 encoded = MAP_UNMAPPABLE;
183 for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) {
184 Py_ssize_t length = 1;
185 encoded = dsg->encoder(&c, &length);
186 if (encoded == MAP_MULTIPLE_AVAIL) {
187 /* this implementation won't work for pair
188 * of non-bmp characters. */
Victor Stinnerd9491262013-04-14 02:06:32 +0200189 if (inlen - *inpos < 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000190 if (!(flags & MBENC_FLUSH))
191 return MBERR_TOOFEW;
192 length = -1;
193 }
194 else
195 length = 2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000196 encoded = dsg->encoder(&c, &length);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000197 if (encoded != MAP_UNMAPPABLE) {
198 insize = length;
199 break;
200 }
201 }
202 else if (encoded != MAP_UNMAPPABLE)
203 break;
204 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000205
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 if (!dsg->mark)
207 return 1;
208 assert(dsg->width == 1 || dsg->width == 2);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000209
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000210 switch (dsg->plane) {
211 case 0: /* G0 */
212 if (STATE_GETFLAG(F_SHIFTED)) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100213 WRITEBYTE1(SI);
Victor Stinner28c63f72013-10-29 00:59:44 +0100214 STATE_CLEARFLAG(F_SHIFTED);
Victor Stinnerd9491262013-04-14 02:06:32 +0200215 NEXT_OUT(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000216 }
217 if (STATE_G0 != dsg->mark) {
218 if (dsg->width == 1) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100219 WRITEBYTE3(ESC, '(', ESCMARK(dsg->mark));
Victor Stinner28c63f72013-10-29 00:59:44 +0100220 STATE_SETG0(dsg->mark);
Victor Stinnerd9491262013-04-14 02:06:32 +0200221 NEXT_OUT(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000222 }
223 else if (dsg->mark == CHARSET_JISX0208) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100224 WRITEBYTE3(ESC, '$', ESCMARK(dsg->mark));
Victor Stinner28c63f72013-10-29 00:59:44 +0100225 STATE_SETG0(dsg->mark);
Victor Stinnerd9491262013-04-14 02:06:32 +0200226 NEXT_OUT(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 }
228 else {
Victor Stinnerd9491262013-04-14 02:06:32 +0200229 WRITEBYTE4(ESC, '$', '(',
Victor Stinner14c9fea2013-10-29 00:19:27 +0100230 ESCMARK(dsg->mark));
Victor Stinner28c63f72013-10-29 00:59:44 +0100231 STATE_SETG0(dsg->mark);
Victor Stinnerd9491262013-04-14 02:06:32 +0200232 NEXT_OUT(4);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000233 }
234 }
235 break;
236 case 1: /* G1 */
237 if (STATE_G1 != dsg->mark) {
238 if (dsg->width == 1) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100239 WRITEBYTE3(ESC, ')', ESCMARK(dsg->mark));
Victor Stinner28c63f72013-10-29 00:59:44 +0100240 STATE_SETG1(dsg->mark);
Victor Stinnerd9491262013-04-14 02:06:32 +0200241 NEXT_OUT(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000242 }
243 else {
Victor Stinner28c63f72013-10-29 00:59:44 +0100244 WRITEBYTE4(ESC, '$', ')', ESCMARK(dsg->mark));
245 STATE_SETG1(dsg->mark);
Victor Stinnerd9491262013-04-14 02:06:32 +0200246 NEXT_OUT(4);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 }
248 }
249 if (!STATE_GETFLAG(F_SHIFTED)) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100250 WRITEBYTE1(SO);
Victor Stinner28c63f72013-10-29 00:59:44 +0100251 STATE_SETFLAG(F_SHIFTED);
Victor Stinnerd9491262013-04-14 02:06:32 +0200252 NEXT_OUT(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 }
254 break;
255 default: /* G2 and G3 is not supported: no encoding in
256 * CJKCodecs are using them yet */
257 return MBERR_INTERNAL;
258 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000259
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000260 if (dsg->width == 1) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100261 WRITEBYTE1((unsigned char)encoded);
Victor Stinnerd9491262013-04-14 02:06:32 +0200262 NEXT_OUT(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000263 }
264 else {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100265 WRITEBYTE2(encoded >> 8, encoded & 0xff);
Victor Stinnerd9491262013-04-14 02:06:32 +0200266 NEXT_OUT(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000267 }
Victor Stinnerd9491262013-04-14 02:06:32 +0200268 NEXT_INCHAR(insize);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000269 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000270
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000271 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000272}
273
274DECODER_INIT(iso2022)
275{
Victor Stinner28c63f72013-10-29 00:59:44 +0100276 STATE_CLEARFLAGS();
277 STATE_SETG0(CHARSET_ASCII);
278 STATE_SETG1(CHARSET_ASCII);
279 STATE_SETG2(CHARSET_ASCII);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000281}
282
283DECODER_RESET(iso2022)
284{
Victor Stinner28c63f72013-10-29 00:59:44 +0100285 STATE_SETG0(CHARSET_ASCII);
286 STATE_CLEARFLAG(F_SHIFTED);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000288}
289
Hye-Shik Chang4b96c132006-03-04 16:08:19 +0000290static Py_ssize_t
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000291iso2022processesc(const void *config, MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 const unsigned char **inbuf, Py_ssize_t *inleft)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000293{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000294 unsigned char charset, designation;
Serhiy Storchaka53fa8b22015-02-16 09:40:12 +0200295 Py_ssize_t i, esclen = 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000296
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000297 for (i = 1;i < MAX_ESCSEQLEN;i++) {
298 if (i >= *inleft)
299 return MBERR_TOOFEW;
300 if (IS_ESCEND((*inbuf)[i])) {
301 esclen = i + 1;
302 break;
303 }
304 else if (CONFIG_ISSET(USE_JISX0208_EXT) && i+1 < *inleft &&
Victor Stinner28c63f72013-10-29 00:59:44 +0100305 (*inbuf)[i] == '&' && (*inbuf)[i+1] == '@') {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000306 i += 2;
Victor Stinner28c63f72013-10-29 00:59:44 +0100307 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000309
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000310 switch (esclen) {
Serhiy Storchaka53fa8b22015-02-16 09:40:12 +0200311 case 0:
312 return 1; /* unterminated escape sequence */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 case 3:
Victor Stinnerd9491262013-04-14 02:06:32 +0200314 if (INBYTE2 == '$') {
315 charset = INBYTE3 | CHARSET_DBCS;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000316 designation = 0;
317 }
318 else {
Victor Stinnerd9491262013-04-14 02:06:32 +0200319 charset = INBYTE3;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100320 if (INBYTE2 == '(')
321 designation = 0;
322 else if (INBYTE2 == ')')
323 designation = 1;
Victor Stinnerd9491262013-04-14 02:06:32 +0200324 else if (CONFIG_ISSET(USE_G2) && INBYTE2 == '.')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000325 designation = 2;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100326 else
327 return 3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 }
329 break;
330 case 4:
Victor Stinnerd9491262013-04-14 02:06:32 +0200331 if (INBYTE2 != '$')
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000332 return 4;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000333
Victor Stinnerd9491262013-04-14 02:06:32 +0200334 charset = INBYTE4 | CHARSET_DBCS;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100335 if (INBYTE3 == '(')
336 designation = 0;
337 else if (INBYTE3 == ')')
338 designation = 1;
339 else
340 return 4;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000341 break;
342 case 6: /* designation with prefix */
343 if (CONFIG_ISSET(USE_JISX0208_EXT) &&
344 (*inbuf)[3] == ESC && (*inbuf)[4] == '$' &&
345 (*inbuf)[5] == 'B') {
346 charset = 'B' | CHARSET_DBCS;
347 designation = 0;
348 }
349 else
350 return 6;
351 break;
352 default:
353 return esclen;
354 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000355
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000356 /* raise error when the charset is not designated for this encoding */
357 if (charset != CHARSET_ASCII) {
358 const struct iso2022_designation *dsg;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000359
Victor Stinner28c63f72013-10-29 00:59:44 +0100360 for (dsg = CONFIG_DESIGNATIONS; dsg->mark; dsg++) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000361 if (dsg->mark == charset)
362 break;
Victor Stinner28c63f72013-10-29 00:59:44 +0100363 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 if (!dsg->mark)
365 return esclen;
366 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000367
Victor Stinner28c63f72013-10-29 00:59:44 +0100368 STATE_SETG(designation, charset);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000369 *inleft -= esclen;
370 (*inbuf) += esclen;
371 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000372}
373
Victor Stinner14c9fea2013-10-29 00:19:27 +0100374#define ISO8859_7_DECODE(c, writer) \
375 if ((c) < 0xa0) { \
376 OUTCHAR(c); \
377 } else if ((c) < 0xc0 && (0x288f3bc9L & (1L << ((c)-0xa0)))) { \
378 OUTCHAR(c); \
379 } else if ((c) >= 0xb4 && (c) <= 0xfe && ((c) >= 0xd4 || \
380 (0xbffffd77L & (1L << ((c)-0xb4))))) { \
381 OUTCHAR(0x02d0 + (c)); \
382 } else if ((c) == 0xa1) { \
383 OUTCHAR(0x2018); \
384 } else if ((c) == 0xa2) { \
385 OUTCHAR(0x2019); \
386 } else if ((c) == 0xaf) { \
387 OUTCHAR(0x2015); \
388 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000389
Hye-Shik Chang4b96c132006-03-04 16:08:19 +0000390static Py_ssize_t
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000391iso2022processg2(const void *config, MultibyteCodec_State *state,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 const unsigned char **inbuf, Py_ssize_t *inleft,
Victor Stinnera0dd0212013-04-11 22:09:04 +0200393 _PyUnicodeWriter *writer)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000394{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 /* not written to use encoder, decoder functions because only few
396 * encodings use G2 designations in CJKCodecs */
397 if (STATE_G2 == CHARSET_ISO8859_1) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200398 if (INBYTE3 < 0x80)
399 OUTCHAR(INBYTE3 + 0x80);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 else
401 return 3;
402 }
403 else if (STATE_G2 == CHARSET_ISO8859_7) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200404 ISO8859_7_DECODE(INBYTE3 ^ 0x80, writer)
Victor Stinner146a2ed2013-10-29 00:09:41 +0100405 else
406 return 3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000407 }
408 else if (STATE_G2 == CHARSET_ASCII) {
Victor Stinner146a2ed2013-10-29 00:09:41 +0100409 if (INBYTE3 & 0x80)
410 return 3;
411 else
412 OUTCHAR(INBYTE3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 }
414 else
415 return MBERR_INTERNAL;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000416
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 (*inbuf) += 3;
418 *inleft -= 3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000419 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000420}
421
422DECODER(iso2022)
423{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000424 const struct iso2022_designation *dsgcache = NULL;
Hye-Shik Changf5a149a2004-08-19 17:49:56 +0000425
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200427 unsigned char c = INBYTE1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 Py_ssize_t err;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000429
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 if (STATE_GETFLAG(F_ESCTHROUGHOUT)) {
431 /* ESC throughout mode:
432 * for non-iso2022 escape sequences */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200433 OUTCHAR(c); /* assume as ISO-8859-1 */
434 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000435 if (IS_ESCEND(c)) {
Victor Stinner28c63f72013-10-29 00:59:44 +0100436 STATE_CLEARFLAG(F_ESCTHROUGHOUT);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000437 }
438 continue;
439 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 switch (c) {
442 case ESC:
Victor Stinner28c63f72013-10-29 00:59:44 +0100443 REQUIRE_INBUF(2);
Victor Stinnerd9491262013-04-14 02:06:32 +0200444 if (IS_ISO2022ESC(INBYTE2)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 err = iso2022processesc(config, state,
446 inbuf, &inleft);
447 if (err != 0)
448 return err;
449 }
Victor Stinnerd9491262013-04-14 02:06:32 +0200450 else if (CONFIG_ISSET(USE_G2) && INBYTE2 == 'N') {/* SS2 */
Victor Stinner28c63f72013-10-29 00:59:44 +0100451 REQUIRE_INBUF(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000452 err = iso2022processg2(config, state,
Victor Stinnera0dd0212013-04-11 22:09:04 +0200453 inbuf, &inleft, writer);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000454 if (err != 0)
455 return err;
456 }
457 else {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200458 OUTCHAR(ESC);
Victor Stinner28c63f72013-10-29 00:59:44 +0100459 STATE_SETFLAG(F_ESCTHROUGHOUT);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200460 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 }
462 break;
463 case SI:
464 if (CONFIG_ISSET(NO_SHIFT))
465 goto bypass;
Victor Stinner28c63f72013-10-29 00:59:44 +0100466 STATE_CLEARFLAG(F_SHIFTED);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200467 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000468 break;
469 case SO:
470 if (CONFIG_ISSET(NO_SHIFT))
471 goto bypass;
Victor Stinner28c63f72013-10-29 00:59:44 +0100472 STATE_SETFLAG(F_SHIFTED);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200473 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 break;
475 case LF:
Victor Stinner28c63f72013-10-29 00:59:44 +0100476 STATE_CLEARFLAG(F_SHIFTED);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200477 OUTCHAR(LF);
478 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000479 break;
480 default:
481 if (c < 0x20) /* C0 */
482 goto bypass;
483 else if (c >= 0x80)
484 return 1;
485 else {
486 const struct iso2022_designation *dsg;
487 unsigned char charset;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200488 Py_UCS4 decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000489
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000490 if (STATE_GETFLAG(F_SHIFTED))
491 charset = STATE_G1;
492 else
493 charset = STATE_G0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000494
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000495 if (charset == CHARSET_ASCII) {
Victor Stinner28c63f72013-10-29 00:59:44 +0100496bypass:
497 OUTCHAR(c);
498 NEXT_IN(1);
499 break;
500 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000501
Victor Stinner28c63f72013-10-29 00:59:44 +0100502 if (dsgcache != NULL &&
503 dsgcache->mark == charset)
504 dsg = dsgcache;
505 else {
506 for (dsg = CONFIG_DESIGNATIONS;
507 dsg->mark != charset
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000508#ifdef Py_DEBUG
Victor Stinner28c63f72013-10-29 00:59:44 +0100509 && dsg->mark != '\0'
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000510#endif
Victor Stinner28c63f72013-10-29 00:59:44 +0100511 ; dsg++)
512 {
513 /* noop */
514 }
515 assert(dsg->mark != '\0');
516 dsgcache = dsg;
517 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000518
Victor Stinner28c63f72013-10-29 00:59:44 +0100519 REQUIRE_INBUF(dsg->width);
520 decoded = dsg->decoder(*inbuf);
521 if (decoded == MAP_UNMAPPABLE)
522 return dsg->width;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000523
Victor Stinner28c63f72013-10-29 00:59:44 +0100524 if (decoded < 0x10000) {
525 OUTCHAR(decoded);
526 }
527 else if (decoded < 0x30000) {
528 OUTCHAR(decoded);
529 }
530 else { /* JIS X 0213 pairs */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200531 OUTCHAR2(decoded >> 16, decoded & 0xffff);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 }
Victor Stinnera0dd0212013-04-11 22:09:04 +0200533 NEXT_IN(dsg->width);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000534 }
535 break;
536 }
537 }
538 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000539}
540
541/*-*- mapping table holders -*-*/
542
543#define ENCMAP(enc) static const encode_map *enc##_encmap = NULL;
544#define DECMAP(enc) static const decode_map *enc##_decmap = NULL;
545
546/* kr */
547ENCMAP(cp949)
548DECMAP(ksx1001)
549
550/* jp */
551ENCMAP(jisxcommon)
552DECMAP(jisx0208)
553DECMAP(jisx0212)
554ENCMAP(jisx0213_bmp)
555DECMAP(jisx0213_1_bmp)
556DECMAP(jisx0213_2_bmp)
557ENCMAP(jisx0213_emp)
558DECMAP(jisx0213_1_emp)
559DECMAP(jisx0213_2_emp)
560
561/* cn */
562ENCMAP(gbcommon)
563DECMAP(gb2312)
564
565/* tw */
566
567/*-*- mapping access functions -*-*/
568
569static int
570ksx1001_init(void)
571{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 static int initialized = 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 if (!initialized && (
575 IMPORT_MAP(kr, cp949, &cp949_encmap, NULL) ||
576 IMPORT_MAP(kr, ksx1001, NULL, &ksx1001_decmap)))
577 return -1;
578 initialized = 1;
579 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000580}
581
Victor Stinnera0dd0212013-04-11 22:09:04 +0200582static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000583ksx1001_decoder(const unsigned char *data)
584{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200585 Py_UCS4 u;
Victor Stinner11bdf912013-10-28 23:18:39 +0100586 if (TRYMAP_DEC(ksx1001, u, data[0], data[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 return u;
588 else
589 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000590}
591
592static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200593ksx1001_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000594{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000595 DBCHAR coded;
596 assert(*length == 1);
597 if (*data < 0x10000) {
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100598 if (TRYMAP_ENC(cp949, coded, *data)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000599 if (!(coded & 0x8000))
600 return coded;
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100601 }
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 }
603 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000604}
605
606static int
607jisx0208_init(void)
608{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000609 static int initialized = 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000610
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000611 if (!initialized && (
612 IMPORT_MAP(jp, jisxcommon, &jisxcommon_encmap, NULL) ||
613 IMPORT_MAP(jp, jisx0208, NULL, &jisx0208_decmap)))
614 return -1;
615 initialized = 1;
616 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000617}
618
Victor Stinnera0dd0212013-04-11 22:09:04 +0200619static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000620jisx0208_decoder(const unsigned char *data)
621{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200622 Py_UCS4 u;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000623 if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
624 return 0xff3c;
Victor Stinner11bdf912013-10-28 23:18:39 +0100625 else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 return u;
627 else
628 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000629}
630
631static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200632jisx0208_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000633{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000634 DBCHAR coded;
635 assert(*length == 1);
636 if (*data < 0x10000) {
637 if (*data == 0xff3c) /* F/W REVERSE SOLIDUS */
638 return 0x2140;
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100639 else if (TRYMAP_ENC(jisxcommon, coded, *data)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000640 if (!(coded & 0x8000))
641 return coded;
642 }
643 }
644 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000645}
646
647static int
648jisx0212_init(void)
649{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 static int initialized = 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000651
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 if (!initialized && (
653 IMPORT_MAP(jp, jisxcommon, &jisxcommon_encmap, NULL) ||
654 IMPORT_MAP(jp, jisx0212, NULL, &jisx0212_decmap)))
655 return -1;
656 initialized = 1;
657 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000658}
659
Victor Stinnera0dd0212013-04-11 22:09:04 +0200660static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000661jisx0212_decoder(const unsigned char *data)
662{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200663 Py_UCS4 u;
Victor Stinner11bdf912013-10-28 23:18:39 +0100664 if (TRYMAP_DEC(jisx0212, u, data[0], data[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000665 return u;
666 else
667 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000668}
669
670static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200671jisx0212_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000672{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 DBCHAR coded;
674 assert(*length == 1);
675 if (*data < 0x10000) {
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100676 if (TRYMAP_ENC(jisxcommon, coded, *data)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000677 if (coded & 0x8000)
678 return coded & 0x7fff;
679 }
680 }
681 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000682}
683
684static int
685jisx0213_init(void)
686{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 static int initialized = 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000688
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000689 if (!initialized && (
690 jisx0208_init() ||
691 IMPORT_MAP(jp, jisx0213_bmp,
692 &jisx0213_bmp_encmap, NULL) ||
693 IMPORT_MAP(jp, jisx0213_1_bmp,
694 NULL, &jisx0213_1_bmp_decmap) ||
695 IMPORT_MAP(jp, jisx0213_2_bmp,
696 NULL, &jisx0213_2_bmp_decmap) ||
697 IMPORT_MAP(jp, jisx0213_emp,
698 &jisx0213_emp_encmap, NULL) ||
699 IMPORT_MAP(jp, jisx0213_1_emp,
700 NULL, &jisx0213_1_emp_decmap) ||
701 IMPORT_MAP(jp, jisx0213_2_emp,
702 NULL, &jisx0213_2_emp_decmap) ||
703 IMPORT_MAP(jp, jisx0213_pair, &jisx0213_pair_encmap,
704 &jisx0213_pair_decmap)))
705 return -1;
706 initialized = 1;
707 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000708}
709
710#define config ((void *)2000)
Victor Stinnera0dd0212013-04-11 22:09:04 +0200711static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000712jisx0213_2000_1_decoder(const unsigned char *data)
713{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200714 Py_UCS4 u;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000715 EMULATE_JISX0213_2000_DECODE_PLANE1(u, data[0], data[1])
716 else if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
717 return 0xff3c;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100718 else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]))
719 ;
720 else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]))
721 ;
Victor Stinner11bdf912013-10-28 23:18:39 +0100722 else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 u |= 0x20000;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100724 else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]))
725 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000726 else
727 return MAP_UNMAPPABLE;
728 return u;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000729}
730
Victor Stinnera0dd0212013-04-11 22:09:04 +0200731static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000732jisx0213_2000_2_decoder(const unsigned char *data)
733{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200734 Py_UCS4 u;
735 EMULATE_JISX0213_2000_DECODE_PLANE2_CHAR(u, data[0], data[1])
Victor Stinner146a2ed2013-10-29 00:09:41 +0100736 if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]))
737 ;
Victor Stinner11bdf912013-10-28 23:18:39 +0100738 else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000739 u |= 0x20000;
740 else
741 return MAP_UNMAPPABLE;
742 return u;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000743}
744#undef config
745
Victor Stinnera0dd0212013-04-11 22:09:04 +0200746static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000747jisx0213_2004_1_decoder(const unsigned char *data)
748{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200749 Py_UCS4 u;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000750 if (data[0] == 0x21 && data[1] == 0x40) /* F/W REVERSE SOLIDUS */
751 return 0xff3c;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100752 else if (TRYMAP_DEC(jisx0208, u, data[0], data[1]))
753 ;
754 else if (TRYMAP_DEC(jisx0213_1_bmp, u, data[0], data[1]))
755 ;
Victor Stinner11bdf912013-10-28 23:18:39 +0100756 else if (TRYMAP_DEC(jisx0213_1_emp, u, data[0], data[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000757 u |= 0x20000;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100758 else if (TRYMAP_DEC(jisx0213_pair, u, data[0], data[1]))
759 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000760 else
761 return MAP_UNMAPPABLE;
762 return u;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000763}
764
Victor Stinnera0dd0212013-04-11 22:09:04 +0200765static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000766jisx0213_2004_2_decoder(const unsigned char *data)
767{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200768 Py_UCS4 u;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100769 if (TRYMAP_DEC(jisx0213_2_bmp, u, data[0], data[1]))
770 ;
Victor Stinner11bdf912013-10-28 23:18:39 +0100771 else if (TRYMAP_DEC(jisx0213_2_emp, u, data[0], data[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000772 u |= 0x20000;
773 else
774 return MAP_UNMAPPABLE;
775 return u;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000776}
777
778static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200779jisx0213_encoder(const Py_UCS4 *data, Py_ssize_t *length, void *config)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000780{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000781 DBCHAR coded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000782
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000783 switch (*length) {
784 case 1: /* first character */
785 if (*data >= 0x10000) {
786 if ((*data) >> 16 == 0x20000 >> 16) {
787 EMULATE_JISX0213_2000_ENCODE_EMP(coded, *data)
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100788 else if (TRYMAP_ENC(jisx0213_emp, coded, (*data) & 0xffff))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000789 return coded;
790 }
791 return MAP_UNMAPPABLE;
792 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000793
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000794 EMULATE_JISX0213_2000_ENCODE_BMP(coded, *data)
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100795 else if (TRYMAP_ENC(jisx0213_bmp, coded, *data)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000796 if (coded == MULTIC)
797 return MAP_MULTIPLE_AVAIL;
798 }
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100799 else if (TRYMAP_ENC(jisxcommon, coded, *data)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000800 if (coded & 0x8000)
801 return MAP_UNMAPPABLE;
802 }
803 else
804 return MAP_UNMAPPABLE;
805 return coded;
Victor Stinner28c63f72013-10-29 00:59:44 +0100806
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000807 case 2: /* second character of unicode pair */
808 coded = find_pairencmap((ucs2_t)data[0], (ucs2_t)data[1],
Victor Stinner28c63f72013-10-29 00:59:44 +0100809 jisx0213_pair_encmap, JISX0213_ENCPAIRS);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000810 if (coded == DBCINV) {
811 *length = 1;
812 coded = find_pairencmap((ucs2_t)data[0], 0,
813 jisx0213_pair_encmap, JISX0213_ENCPAIRS);
814 if (coded == DBCINV)
815 return MAP_UNMAPPABLE;
816 }
817 else
818 return coded;
Victor Stinner28c63f72013-10-29 00:59:44 +0100819
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000820 case -1: /* flush unterminated */
821 *length = 1;
822 coded = find_pairencmap((ucs2_t)data[0], 0,
Victor Stinner28c63f72013-10-29 00:59:44 +0100823 jisx0213_pair_encmap, JISX0213_ENCPAIRS);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000824 if (coded == DBCINV)
825 return MAP_UNMAPPABLE;
826 else
827 return coded;
Victor Stinner28c63f72013-10-29 00:59:44 +0100828 break;
829
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000830 default:
831 return MAP_UNMAPPABLE;
832 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000833}
834
835static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200836jisx0213_2000_1_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000837{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000838 DBCHAR coded = jisx0213_encoder(data, length, (void *)2000);
839 if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
840 return coded;
841 else if (coded & 0x8000)
842 return MAP_UNMAPPABLE;
843 else
844 return coded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000845}
846
847static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200848jisx0213_2000_1_encoder_paironly(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000849{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000850 DBCHAR coded;
851 Py_ssize_t ilength = *length;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000852
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000853 coded = jisx0213_encoder(data, length, (void *)2000);
854 switch (ilength) {
855 case 1:
856 if (coded == MAP_MULTIPLE_AVAIL)
857 return MAP_MULTIPLE_AVAIL;
858 else
859 return MAP_UNMAPPABLE;
860 case 2:
861 if (*length != 2)
862 return MAP_UNMAPPABLE;
863 else
864 return coded;
865 default:
866 return MAP_UNMAPPABLE;
867 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000868}
869
870static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200871jisx0213_2000_2_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000872{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000873 DBCHAR coded = jisx0213_encoder(data, length, (void *)2000);
874 if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
875 return coded;
876 else if (coded & 0x8000)
877 return coded & 0x7fff;
878 else
879 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000880}
881
882static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200883jisx0213_2004_1_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000884{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000885 DBCHAR coded = jisx0213_encoder(data, length, NULL);
886 if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
887 return coded;
888 else if (coded & 0x8000)
889 return MAP_UNMAPPABLE;
890 else
891 return coded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000892}
893
894static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200895jisx0213_2004_1_encoder_paironly(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000896{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000897 DBCHAR coded;
898 Py_ssize_t ilength = *length;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000899
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000900 coded = jisx0213_encoder(data, length, NULL);
901 switch (ilength) {
902 case 1:
903 if (coded == MAP_MULTIPLE_AVAIL)
904 return MAP_MULTIPLE_AVAIL;
905 else
906 return MAP_UNMAPPABLE;
907 case 2:
908 if (*length != 2)
909 return MAP_UNMAPPABLE;
910 else
911 return coded;
912 default:
913 return MAP_UNMAPPABLE;
914 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000915}
916
917static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200918jisx0213_2004_2_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000919{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000920 DBCHAR coded = jisx0213_encoder(data, length, NULL);
921 if (coded == MAP_UNMAPPABLE || coded == MAP_MULTIPLE_AVAIL)
922 return coded;
923 else if (coded & 0x8000)
924 return coded & 0x7fff;
925 else
926 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000927}
928
Victor Stinnera0dd0212013-04-11 22:09:04 +0200929static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000930jisx0201_r_decoder(const unsigned char *data)
931{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200932 Py_UCS4 u;
933 JISX0201_R_DECODE_CHAR(*data, u)
Victor Stinner146a2ed2013-10-29 00:09:41 +0100934 else
935 return MAP_UNMAPPABLE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000936 return u;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000937}
938
939static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200940jisx0201_r_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000941{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000942 DBCHAR coded;
943 JISX0201_R_ENCODE(*data, coded)
Victor Stinner146a2ed2013-10-29 00:09:41 +0100944 else
945 return MAP_UNMAPPABLE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000946 return coded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000947}
948
Victor Stinnera0dd0212013-04-11 22:09:04 +0200949static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000950jisx0201_k_decoder(const unsigned char *data)
951{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200952 Py_UCS4 u;
953 JISX0201_K_DECODE_CHAR(*data ^ 0x80, u)
Victor Stinner146a2ed2013-10-29 00:09:41 +0100954 else
955 return MAP_UNMAPPABLE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000956 return u;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000957}
958
959static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200960jisx0201_k_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000961{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000962 DBCHAR coded;
963 JISX0201_K_ENCODE(*data, coded)
Victor Stinner146a2ed2013-10-29 00:09:41 +0100964 else
965 return MAP_UNMAPPABLE;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000966 return coded - 0x80;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000967}
968
969static int
970gb2312_init(void)
971{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000972 static int initialized = 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000973
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000974 if (!initialized && (
975 IMPORT_MAP(cn, gbcommon, &gbcommon_encmap, NULL) ||
976 IMPORT_MAP(cn, gb2312, NULL, &gb2312_decmap)))
977 return -1;
978 initialized = 1;
979 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000980}
981
Victor Stinnera0dd0212013-04-11 22:09:04 +0200982static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000983gb2312_decoder(const unsigned char *data)
984{
Victor Stinnera0dd0212013-04-11 22:09:04 +0200985 Py_UCS4 u;
Victor Stinner11bdf912013-10-28 23:18:39 +0100986 if (TRYMAP_DEC(gb2312, u, data[0], data[1]))
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000987 return u;
988 else
989 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000990}
991
992static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +0200993gb2312_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000994{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000995 DBCHAR coded;
996 assert(*length == 1);
997 if (*data < 0x10000) {
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100998 if (TRYMAP_ENC(gbcommon, coded, *data)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000999 if (!(coded & 0x8000))
1000 return coded;
1001 }
1002 }
1003 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001004}
1005
1006
Victor Stinnera0dd0212013-04-11 22:09:04 +02001007static Py_UCS4
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001008dummy_decoder(const unsigned char *data)
1009{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001010 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001011}
1012
1013static DBCHAR
Victor Stinnera0dd0212013-04-11 22:09:04 +02001014dummy_encoder(const Py_UCS4 *data, Py_ssize_t *length)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001015{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001016 return MAP_UNMAPPABLE;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001017}
1018
1019/*-*- registry tables -*-*/
1020
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001021#define REGISTRY_KSX1001_G0 { CHARSET_KSX1001, 0, 2, \
1022 ksx1001_init, \
1023 ksx1001_decoder, ksx1001_encoder }
1024#define REGISTRY_KSX1001_G1 { CHARSET_KSX1001, 1, 2, \
1025 ksx1001_init, \
1026 ksx1001_decoder, ksx1001_encoder }
1027#define REGISTRY_JISX0201_R { CHARSET_JISX0201_R, 0, 1, \
1028 NULL, \
1029 jisx0201_r_decoder, jisx0201_r_encoder }
1030#define REGISTRY_JISX0201_K { CHARSET_JISX0201_K, 0, 1, \
1031 NULL, \
1032 jisx0201_k_decoder, jisx0201_k_encoder }
1033#define REGISTRY_JISX0208 { CHARSET_JISX0208, 0, 2, \
1034 jisx0208_init, \
1035 jisx0208_decoder, jisx0208_encoder }
1036#define REGISTRY_JISX0208_O { CHARSET_JISX0208_O, 0, 2, \
1037 jisx0208_init, \
1038 jisx0208_decoder, jisx0208_encoder }
1039#define REGISTRY_JISX0212 { CHARSET_JISX0212, 0, 2, \
1040 jisx0212_init, \
1041 jisx0212_decoder, jisx0212_encoder }
1042#define REGISTRY_JISX0213_2000_1 { CHARSET_JISX0213_2000_1, 0, 2, \
1043 jisx0213_init, \
1044 jisx0213_2000_1_decoder, \
1045 jisx0213_2000_1_encoder }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001046#define REGISTRY_JISX0213_2000_1_PAIRONLY { CHARSET_JISX0213_2000_1, 0, 2, \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001047 jisx0213_init, \
1048 jisx0213_2000_1_decoder, \
1049 jisx0213_2000_1_encoder_paironly }
1050#define REGISTRY_JISX0213_2000_2 { CHARSET_JISX0213_2, 0, 2, \
1051 jisx0213_init, \
1052 jisx0213_2000_2_decoder, \
1053 jisx0213_2000_2_encoder }
1054#define REGISTRY_JISX0213_2004_1 { CHARSET_JISX0213_2004_1, 0, 2, \
1055 jisx0213_init, \
1056 jisx0213_2004_1_decoder, \
1057 jisx0213_2004_1_encoder }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001058#define REGISTRY_JISX0213_2004_1_PAIRONLY { CHARSET_JISX0213_2004_1, 0, 2, \
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001059 jisx0213_init, \
1060 jisx0213_2004_1_decoder, \
1061 jisx0213_2004_1_encoder_paironly }
1062#define REGISTRY_JISX0213_2004_2 { CHARSET_JISX0213_2, 0, 2, \
1063 jisx0213_init, \
1064 jisx0213_2004_2_decoder, \
1065 jisx0213_2004_2_encoder }
1066#define REGISTRY_GB2312 { CHARSET_GB2312, 0, 2, \
1067 gb2312_init, \
1068 gb2312_decoder, gb2312_encoder }
1069#define REGISTRY_CNS11643_1 { CHARSET_CNS11643_1, 1, 2, \
1070 cns11643_init, \
1071 cns11643_1_decoder, cns11643_1_encoder }
1072#define REGISTRY_CNS11643_2 { CHARSET_CNS11643_2, 2, 2, \
1073 cns11643_init, \
1074 cns11643_2_decoder, cns11643_2_encoder }
1075#define REGISTRY_ISO8859_1 { CHARSET_ISO8859_1, 2, 1, \
1076 NULL, dummy_decoder, dummy_encoder }
1077#define REGISTRY_ISO8859_7 { CHARSET_ISO8859_7, 2, 1, \
1078 NULL, dummy_decoder, dummy_encoder }
1079#define REGISTRY_SENTINEL { 0, }
1080#define CONFIGDEF(var, attrs) \
1081 static const struct iso2022_config iso2022_##var##_config = { \
1082 attrs, iso2022_##var##_designations \
1083 };
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001084
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001085static const struct iso2022_designation iso2022_kr_designations[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001086 REGISTRY_KSX1001_G1, REGISTRY_SENTINEL
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001087};
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001088CONFIGDEF(kr, 0)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001089
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001090static const struct iso2022_designation iso2022_jp_designations[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001091 REGISTRY_JISX0208, REGISTRY_JISX0201_R, REGISTRY_JISX0208_O,
1092 REGISTRY_SENTINEL
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001093};
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001094CONFIGDEF(jp, NO_SHIFT | USE_JISX0208_EXT)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001095
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001096static const struct iso2022_designation iso2022_jp_1_designations[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001097 REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_JISX0201_R,
1098 REGISTRY_JISX0208_O, REGISTRY_SENTINEL
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001099};
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001100CONFIGDEF(jp_1, NO_SHIFT | USE_JISX0208_EXT)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001101
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001102static const struct iso2022_designation iso2022_jp_2_designations[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001103 REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_KSX1001_G0,
1104 REGISTRY_GB2312, REGISTRY_JISX0201_R, REGISTRY_JISX0208_O,
1105 REGISTRY_ISO8859_1, REGISTRY_ISO8859_7, REGISTRY_SENTINEL
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001106};
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001107CONFIGDEF(jp_2, NO_SHIFT | USE_G2 | USE_JISX0208_EXT)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001108
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001109static const struct iso2022_designation iso2022_jp_2004_designations[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001110 REGISTRY_JISX0213_2004_1_PAIRONLY, REGISTRY_JISX0208,
1111 REGISTRY_JISX0213_2004_1, REGISTRY_JISX0213_2004_2, REGISTRY_SENTINEL
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001112};
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001113CONFIGDEF(jp_2004, NO_SHIFT | USE_JISX0208_EXT)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001114
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001115static const struct iso2022_designation iso2022_jp_3_designations[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001116 REGISTRY_JISX0213_2000_1_PAIRONLY, REGISTRY_JISX0208,
1117 REGISTRY_JISX0213_2000_1, REGISTRY_JISX0213_2000_2, REGISTRY_SENTINEL
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001118};
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001119CONFIGDEF(jp_3, NO_SHIFT | USE_JISX0208_EXT)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001120
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001121static const struct iso2022_designation iso2022_jp_ext_designations[] = {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001122 REGISTRY_JISX0208, REGISTRY_JISX0212, REGISTRY_JISX0201_R,
1123 REGISTRY_JISX0201_K, REGISTRY_JISX0208_O, REGISTRY_SENTINEL
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001124};
Hye-Shik Changf5a149a2004-08-19 17:49:56 +00001125CONFIGDEF(jp_ext, NO_SHIFT | USE_JISX0208_EXT)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001126
1127
1128BEGIN_MAPPINGS_LIST
1129 /* no mapping table here */
1130END_MAPPINGS_LIST
1131
Antoine Pitrouf95a1b32010-05-09 15:52:27 +00001132#define ISO2022_CODEC(variation) { \
1133 "iso2022_" #variation, \
1134 &iso2022_##variation##_config, \
1135 iso2022_codec_init, \
1136 _STATEFUL_METHODS(iso2022) \
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001137},
1138
1139BEGIN_CODECS_LIST
1140 ISO2022_CODEC(kr)
1141 ISO2022_CODEC(jp)
1142 ISO2022_CODEC(jp_1)
1143 ISO2022_CODEC(jp_2)
1144 ISO2022_CODEC(jp_2004)
1145 ISO2022_CODEC(jp_3)
1146 ISO2022_CODEC(jp_ext)
1147END_CODECS_LIST
1148
1149I_AM_A_MODULE_FOR(iso2022)