blob: a08aa1593a7ad6f7e18cb16f38e2c9bc280e51f3 [file] [log] [blame]
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00001/*
2 * _codecs_jp.c: Codecs collection for Japanese encodings
3 *
4 * Written by Hye-Shik Chang <perky@FreeBSD.org>
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +00005 */
6
7#define USING_BINARY_PAIR_SEARCH
8#define EMPBASE 0x20000
9
10#include "cjkcodecs.h"
11#include "mappings_jp.h"
12#include "mappings_jisx0213_pair.h"
13#include "alg_jisx0201.h"
14#include "emu_jisx0213_2000.h"
15
16/*
17 * CP932 codec
18 */
19
20ENCODER(cp932)
21{
Victor Stinnerd9491262013-04-14 02:06:32 +020022 while (*inpos < inlen) {
23 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000024 DBCHAR code;
25 unsigned char c1, c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000026
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000027 if (c <= 0x80) {
Victor Stinnerd9491262013-04-14 02:06:32 +020028 WRITEBYTE1((unsigned char)c)
29 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 continue;
31 }
32 else if (c >= 0xff61 && c <= 0xff9f) {
Victor Stinnerd9491262013-04-14 02:06:32 +020033 WRITEBYTE1(c - 0xfec0)
34 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 continue;
36 }
37 else if (c >= 0xf8f0 && c <= 0xf8f3) {
38 /* Windows compatibility */
39 REQUIRE_OUTBUF(1)
40 if (c == 0xf8f0)
Victor Stinnerd9491262013-04-14 02:06:32 +020041 OUTBYTE1(0xa0)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 else
Victor Stinnerd9491262013-04-14 02:06:32 +020043 OUTBYTE1(c - 0xfef1 + 0xfd)
44 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000045 continue;
46 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000047
Victor Stinnerd9491262013-04-14 02:06:32 +020048 if (c > 0xFFFF)
49 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000050 REQUIRE_OUTBUF(2)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000051
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000052 TRYMAP_ENC(cp932ext, code, c) {
Victor Stinnerd9491262013-04-14 02:06:32 +020053 OUTBYTE1(code >> 8)
54 OUTBYTE2(code & 0xff)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 }
56 else TRYMAP_ENC(jisxcommon, code, c) {
57 if (code & 0x8000) /* MSB set: JIS X 0212 */
58 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000059
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000060 /* JIS X 0208 */
61 c1 = code >> 8;
62 c2 = code & 0xff;
63 c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
64 c1 = (c1 - 0x21) >> 1;
Victor Stinnerd9491262013-04-14 02:06:32 +020065 OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
66 OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000067 }
68 else if (c >= 0xe000 && c < 0xe758) {
69 /* User-defined area */
Victor Stinnera0dd0212013-04-11 22:09:04 +020070 c1 = (Py_UCS4)(c - 0xe000) / 188;
71 c2 = (Py_UCS4)(c - 0xe000) % 188;
Victor Stinnerd9491262013-04-14 02:06:32 +020072 OUTBYTE1(c1 + 0xf0)
73 OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000074 }
75 else
76 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000077
Victor Stinnerd9491262013-04-14 02:06:32 +020078 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000079 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000080
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000081 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000082}
83
84DECODER(cp932)
85{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000086 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +020087 unsigned char c = INBYTE1, c2;
Victor Stinner11bdf912013-10-28 23:18:39 +010088 Py_UCS4 decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000089
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000090 if (c <= 0x80) {
Victor Stinnera0dd0212013-04-11 22:09:04 +020091 OUTCHAR(c);
92 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000093 continue;
94 }
95 else if (c >= 0xa0 && c <= 0xdf) {
96 if (c == 0xa0)
Victor Stinnera0dd0212013-04-11 22:09:04 +020097 OUTCHAR(0xf8f0); /* half-width katakana */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000098 else
Victor Stinnera0dd0212013-04-11 22:09:04 +020099 OUTCHAR(0xfec0 + c);
100 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000101 continue;
102 }
103 else if (c >= 0xfd/* && c <= 0xff*/) {
104 /* Windows compatibility */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200105 OUTCHAR(0xf8f1 - 0xfd + c);
106 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000107 continue;
108 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000109
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000110 REQUIRE_INBUF(2)
Victor Stinnerd9491262013-04-14 02:06:32 +0200111 c2 = INBYTE2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000112
Victor Stinner11bdf912013-10-28 23:18:39 +0100113 if (TRYMAP_DEC(cp932ext, decoded, c, c2))
114 OUTCHAR(decoded);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000115 else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
116 if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
Victor Stinner2cded9c2011-07-08 01:45:13 +0200117 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000118
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000119 c = (c < 0xe0 ? c - 0x81 : c - 0xc1);
120 c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
121 c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
122 c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000123
Victor Stinner11bdf912013-10-28 23:18:39 +0100124 if (TRYMAP_DEC(jisx0208, decoded, c, c2))
125 OUTCHAR(decoded);
126 else
127 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000128 }
129 else if (c >= 0xf0 && c <= 0xf9) {
130 if ((c2 >= 0x40 && c2 <= 0x7e) ||
131 (c2 >= 0x80 && c2 <= 0xfc))
Victor Stinnera0dd0212013-04-11 22:09:04 +0200132 OUTCHAR(0xe000 + 188 * (c - 0xf0) +
133 (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41));
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000134 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200135 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000136 }
137 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200138 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000139
Victor Stinnera0dd0212013-04-11 22:09:04 +0200140 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000141 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000142
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000143 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000144}
145
146
147/*
148 * EUC-JIS-2004 codec
149 */
150
151ENCODER(euc_jis_2004)
152{
Victor Stinnerd9491262013-04-14 02:06:32 +0200153 while (*inpos < inlen) {
154 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000155 DBCHAR code;
156 Py_ssize_t insize;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000157
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000158 if (c < 0x80) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200159 WRITEBYTE1(c)
160 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000161 continue;
162 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000163
Victor Stinnerd9491262013-04-14 02:06:32 +0200164 insize = 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000165
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000166 if (c <= 0xFFFF) {
167 EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
168 else TRYMAP_ENC(jisx0213_bmp, code, c) {
169 if (code == MULTIC) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200170 if (inlen - *inpos < 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000171 if (flags & MBENC_FLUSH) {
172 code = find_pairencmap(
173 (ucs2_t)c, 0,
174 jisx0213_pair_encmap,
175 JISX0213_ENCPAIRS);
176 if (code == DBCINV)
177 return 1;
178 }
179 else
180 return MBERR_TOOFEW;
181 }
182 else {
Victor Stinnerd9491262013-04-14 02:06:32 +0200183 Py_UCS4 c2 = INCHAR2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000184 code = find_pairencmap(
Victor Stinnerd9491262013-04-14 02:06:32 +0200185 (ucs2_t)c, c2,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000186 jisx0213_pair_encmap,
187 JISX0213_ENCPAIRS);
188 if (code == DBCINV) {
189 code = find_pairencmap(
190 (ucs2_t)c, 0,
191 jisx0213_pair_encmap,
192 JISX0213_ENCPAIRS);
193 if (code == DBCINV)
194 return 1;
195 } else
196 insize = 2;
197 }
198 }
199 }
200 else TRYMAP_ENC(jisxcommon, code, c);
201 else if (c >= 0xff61 && c <= 0xff9f) {
202 /* JIS X 0201 half-width katakana */
Victor Stinnerd9491262013-04-14 02:06:32 +0200203 WRITEBYTE2(0x8e, c - 0xfec0)
204 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000205 continue;
206 }
207 else if (c == 0xff3c)
208 /* F/W REVERSE SOLIDUS (see NOTES) */
209 code = 0x2140;
210 else if (c == 0xff5e)
211 /* F/W TILDE (see NOTES) */
212 code = 0x2232;
213 else
214 return 1;
215 }
216 else if (c >> 16 == EMPBASE >> 16) {
217 EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
218 else TRYMAP_ENC(jisx0213_emp, code, c & 0xffff);
219 else return insize;
220 }
221 else
222 return insize;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000223
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000224 if (code & 0x8000) {
225 /* Codeset 2 */
Victor Stinnerd9491262013-04-14 02:06:32 +0200226 WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
227 NEXT(insize, 3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000228 } else {
229 /* Codeset 1 */
Victor Stinnerd9491262013-04-14 02:06:32 +0200230 WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
231 NEXT(insize, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000232 }
233 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000234
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000236}
237
238DECODER(euc_jis_2004)
239{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000240 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200241 unsigned char c = INBYTE1;
Victor Stinner11bdf912013-10-28 23:18:39 +0100242 Py_UCS4 code, decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000243
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000244 if (c < 0x80) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200245 OUTCHAR(c);
246 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 continue;
248 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000249
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 if (c == 0x8e) {
251 /* JIS X 0201 half-width katakana */
252 unsigned char c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000253
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000254 REQUIRE_INBUF(2)
Victor Stinnerd9491262013-04-14 02:06:32 +0200255 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000256 if (c2 >= 0xa1 && c2 <= 0xdf) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200257 OUTCHAR(0xfec0 + c2);
258 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 }
260 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200261 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 }
263 else if (c == 0x8f) {
264 unsigned char c2, c3;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000265
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000266 REQUIRE_INBUF(3)
Victor Stinnerd9491262013-04-14 02:06:32 +0200267 c2 = INBYTE2 ^ 0x80;
268 c3 = INBYTE3 ^ 0x80;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000269
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000270 /* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200271 EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c2, c3)
Victor Stinner11bdf912013-10-28 23:18:39 +0100272 else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c2, c3))
273 OUTCHAR(decoded);
274 else if (TRYMAP_DEC(jisx0213_2_emp, code, c2, c3)) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200275 OUTCHAR(EMPBASE | code);
276 NEXT_IN(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000277 continue;
278 }
Victor Stinner11bdf912013-10-28 23:18:39 +0100279 else if (TRYMAP_DEC(jisx0212, decoded, c2, c3))
280 OUTCHAR(decoded);
Victor Stinner2cded9c2011-07-08 01:45:13 +0200281 else return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200282 NEXT_IN(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000283 }
284 else {
285 unsigned char c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000286
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 REQUIRE_INBUF(2)
288 c ^= 0x80;
Victor Stinnerd9491262013-04-14 02:06:32 +0200289 c2 = INBYTE2 ^ 0x80;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000290
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000291 /* JIS X 0213 Plane 1 */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200292 EMULATE_JISX0213_2000_DECODE_PLANE1(writer, c, c2)
293 else if (c == 0x21 && c2 == 0x40) OUTCHAR(0xff3c);
294 else if (c == 0x22 && c2 == 0x32) OUTCHAR(0xff5e);
Victor Stinner11bdf912013-10-28 23:18:39 +0100295 else if (TRYMAP_DEC(jisx0208, decoded, c, c2))
296 OUTCHAR(decoded);
297 else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c, c2))
298 OUTCHAR(decoded);
299 else if (TRYMAP_DEC(jisx0213_1_emp, code, c, c2)) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200300 OUTCHAR(EMPBASE | code);
301 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000302 continue;
303 }
Victor Stinner11bdf912013-10-28 23:18:39 +0100304 else if (TRYMAP_DEC(jisx0213_pair, code, c, c2)) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200305 OUTCHAR2(code >> 16, code & 0xffff);
306 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000307 continue;
308 }
Victor Stinner2cded9c2011-07-08 01:45:13 +0200309 else return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200310 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000311 }
312 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000313
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000314 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000315}
316
317
318/*
319 * EUC-JP codec
320 */
321
322ENCODER(euc_jp)
323{
Victor Stinnerd9491262013-04-14 02:06:32 +0200324 while (*inpos < inlen) {
325 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000326 DBCHAR code;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000327
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000328 if (c < 0x80) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200329 WRITEBYTE1((unsigned char)c)
330 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000331 continue;
332 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000333
Victor Stinnerd9491262013-04-14 02:06:32 +0200334 if (c > 0xFFFF)
335 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000336
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000337 TRYMAP_ENC(jisxcommon, code, c);
338 else if (c >= 0xff61 && c <= 0xff9f) {
339 /* JIS X 0201 half-width katakana */
Victor Stinnerd9491262013-04-14 02:06:32 +0200340 WRITEBYTE2(0x8e, c - 0xfec0)
341 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000342 continue;
343 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000344#ifndef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000345 else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */
346 code = 0x2140;
347 else if (c == 0xa5) { /* YEN SIGN */
Victor Stinnerd9491262013-04-14 02:06:32 +0200348 WRITEBYTE1(0x5c);
349 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 continue;
351 } else if (c == 0x203e) { /* OVERLINE */
Victor Stinnerd9491262013-04-14 02:06:32 +0200352 WRITEBYTE1(0x7e);
353 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000354 continue;
355 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000356#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000357 else
358 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000359
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000360 if (code & 0x8000) {
361 /* JIS X 0212 */
Victor Stinnerd9491262013-04-14 02:06:32 +0200362 WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
363 NEXT(1, 3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000364 } else {
365 /* JIS X 0208 */
Victor Stinnerd9491262013-04-14 02:06:32 +0200366 WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
367 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 }
369 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000370
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000371 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000372}
373
374DECODER(euc_jp)
375{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200377 unsigned char c = INBYTE1;
Victor Stinner11bdf912013-10-28 23:18:39 +0100378 Py_UCS4 decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000379
Victor Stinner5dfe3bb2011-06-03 23:34:09 +0200380 if (c < 0x80) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200381 OUTCHAR(c);
382 NEXT_IN(1);
Victor Stinner5dfe3bb2011-06-03 23:34:09 +0200383 continue;
384 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000385
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000386 if (c == 0x8e) {
387 /* JIS X 0201 half-width katakana */
388 unsigned char c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000389
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000390 REQUIRE_INBUF(2)
Victor Stinnerd9491262013-04-14 02:06:32 +0200391 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000392 if (c2 >= 0xa1 && c2 <= 0xdf) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200393 OUTCHAR(0xfec0 + c2);
394 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000395 }
396 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200397 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000398 }
399 else if (c == 0x8f) {
400 unsigned char c2, c3;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000401
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000402 REQUIRE_INBUF(3)
Victor Stinnerd9491262013-04-14 02:06:32 +0200403 c2 = INBYTE2;
404 c3 = INBYTE3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000405 /* JIS X 0212 */
Victor Stinner11bdf912013-10-28 23:18:39 +0100406 if (TRYMAP_DEC(jisx0212, decoded, c2 ^ 0x80, c3 ^ 0x80)) {
407 OUTCHAR(decoded);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200408 NEXT_IN(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000409 }
410 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200411 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000412 }
413 else {
414 unsigned char c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000415
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000416 REQUIRE_INBUF(2)
Victor Stinnerd9491262013-04-14 02:06:32 +0200417 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000418 /* JIS X 0208 */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000419#ifndef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 if (c == 0xa1 && c2 == 0xc0)
421 /* FULL-WIDTH REVERSE SOLIDUS */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200422 OUTCHAR(0xff3c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000423 else
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000424#endif
Victor Stinner11bdf912013-10-28 23:18:39 +0100425 if (TRYMAP_DEC(jisx0208, decoded, c ^ 0x80, c2 ^ 0x80))
426 OUTCHAR(decoded);
427 else
428 return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200429 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000430 }
431 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000432
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000433 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000434}
435
436
437/*
438 * SHIFT_JIS codec
439 */
440
441ENCODER(shift_jis)
442{
Victor Stinnerd9491262013-04-14 02:06:32 +0200443 while (*inpos < inlen) {
444 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000445 DBCHAR code;
446 unsigned char c1, c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000447
448#ifdef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000449 JISX0201_R_ENCODE(c, code)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000450#else
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000451 if (c < 0x80) code = c;
452 else if (c == 0x00a5) code = 0x5c; /* YEN SIGN */
453 else if (c == 0x203e) code = 0x7e; /* OVERLINE */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000454#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000455 else JISX0201_K_ENCODE(c, code)
Victor Stinnerd9491262013-04-14 02:06:32 +0200456 else if (c > 0xFFFF)
457 return 1;
458 else
459 code = NOCHAR;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000460
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000461 if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
462 REQUIRE_OUTBUF(1)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000463
Victor Stinnerd9491262013-04-14 02:06:32 +0200464 OUTBYTE1((unsigned char)code)
465 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 continue;
467 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000468
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000469 REQUIRE_OUTBUF(2)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000470
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000471 if (code == NOCHAR) {
472 TRYMAP_ENC(jisxcommon, code, c);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000473#ifndef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000474 else if (c == 0xff3c)
475 code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000476#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 else
478 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000479
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000480 if (code & 0x8000) /* MSB set: JIS X 0212 */
481 return 1;
482 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000483
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000484 c1 = code >> 8;
485 c2 = code & 0xff;
486 c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
487 c1 = (c1 - 0x21) >> 1;
Victor Stinnerd9491262013-04-14 02:06:32 +0200488 OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
489 OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
490 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000491 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000492
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000493 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000494}
495
496DECODER(shift_jis)
497{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000498 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200499 unsigned char c = INBYTE1;
Victor Stinner11bdf912013-10-28 23:18:39 +0100500 Py_UCS4 decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000501
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000502#ifdef STRICT_BUILD
Victor Stinnera0dd0212013-04-11 22:09:04 +0200503 JISX0201_R_DECODE(c, writer)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000504#else
Victor Stinnera0dd0212013-04-11 22:09:04 +0200505 if (c < 0x80) OUTCHAR(c);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000506#endif
Victor Stinnera0dd0212013-04-11 22:09:04 +0200507 else JISX0201_K_DECODE(c, writer)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000508 else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
509 unsigned char c1, c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000510
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000511 REQUIRE_INBUF(2)
Victor Stinnerd9491262013-04-14 02:06:32 +0200512 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000513 if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
Victor Stinner2cded9c2011-07-08 01:45:13 +0200514 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000515
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000516 c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
517 c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
518 c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1) + 0x21);
519 c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000520
521#ifndef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000522 if (c1 == 0x21 && c2 == 0x40) {
523 /* FULL-WIDTH REVERSE SOLIDUS */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200524 OUTCHAR(0xff3c);
525 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 continue;
527 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000528#endif
Victor Stinner11bdf912013-10-28 23:18:39 +0100529 if (TRYMAP_DEC(jisx0208, decoded, c1, c2)) {
530 OUTCHAR(decoded);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200531 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000532 continue;
533 }
534 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200535 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000536 }
537 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200538 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000539
Victor Stinnera0dd0212013-04-11 22:09:04 +0200540 NEXT_IN(1); /* JIS X 0201 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000541 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000542
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000543 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000544}
545
546
547/*
548 * SHIFT_JIS-2004 codec
549 */
550
551ENCODER(shift_jis_2004)
552{
Victor Stinnerd9491262013-04-14 02:06:32 +0200553 while (*inpos < inlen) {
554 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000555 DBCHAR code = NOCHAR;
556 int c1, c2;
557 Py_ssize_t insize;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000558
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000559 JISX0201_ENCODE(c, code)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000560
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000561 if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200562 WRITEBYTE1((unsigned char)code)
563 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000564 continue;
565 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000566
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000567 REQUIRE_OUTBUF(2)
Victor Stinnerd9491262013-04-14 02:06:32 +0200568 insize = 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000569
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000570 if (code == NOCHAR) {
571 if (c <= 0xffff) {
572 EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
573 else TRYMAP_ENC(jisx0213_bmp, code, c) {
574 if (code == MULTIC) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200575 if (inlen - *inpos < 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000576 if (flags & MBENC_FLUSH) {
577 code = find_pairencmap
578 ((ucs2_t)c, 0,
579 jisx0213_pair_encmap,
580 JISX0213_ENCPAIRS);
581 if (code == DBCINV)
582 return 1;
583 }
584 else
585 return MBERR_TOOFEW;
586 }
587 else {
Victor Stinnerd9491262013-04-14 02:06:32 +0200588 Py_UCS4 ch2 = INCHAR2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 code = find_pairencmap(
Victor Stinnerd9491262013-04-14 02:06:32 +0200590 (ucs2_t)c, ch2,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000591 jisx0213_pair_encmap,
592 JISX0213_ENCPAIRS);
593 if (code == DBCINV) {
594 code = find_pairencmap(
595 (ucs2_t)c, 0,
596 jisx0213_pair_encmap,
597 JISX0213_ENCPAIRS);
598 if (code == DBCINV)
599 return 1;
600 }
601 else
602 insize = 2;
603 }
604 }
605 }
606 else TRYMAP_ENC(jisxcommon, code, c) {
607 /* abandon JIS X 0212 codes */
608 if (code & 0x8000)
609 return 1;
610 }
611 else return 1;
612 }
613 else if (c >> 16 == EMPBASE >> 16) {
614 EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
615 else TRYMAP_ENC(jisx0213_emp, code, c&0xffff);
616 else return insize;
617 }
618 else
619 return insize;
620 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000621
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000622 c1 = code >> 8;
623 c2 = (code & 0xff) - 0x21;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000624
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000625 if (c1 & 0x80) { /* Plane 2 */
626 if (c1 >= 0xee) c1 -= 0x87;
627 else if (c1 >= 0xac || c1 == 0xa8) c1 -= 0x49;
628 else c1 -= 0x43;
629 }
630 else /* Plane 1 */
631 c1 -= 0x21;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000632
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 if (c1 & 1) c2 += 0x5e;
634 c1 >>= 1;
Victor Stinnerd9491262013-04-14 02:06:32 +0200635 OUTBYTE1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))
636 OUTBYTE2(c2 + (c2 < 0x3f ? 0x40 : 0x41))
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000637
Victor Stinnerd9491262013-04-14 02:06:32 +0200638 NEXT(insize, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000639 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000640
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000641 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000642}
643
644DECODER(shift_jis_2004)
645{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000646 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200647 unsigned char c = INBYTE1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000648
Victor Stinnera0dd0212013-04-11 22:09:04 +0200649 JISX0201_DECODE(c, writer)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000650 else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
651 unsigned char c1, c2;
Victor Stinner11bdf912013-10-28 23:18:39 +0100652 Py_UCS4 code, decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000653
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000654 REQUIRE_INBUF(2)
Victor Stinnerd9491262013-04-14 02:06:32 +0200655 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000656 if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
Victor Stinner2cded9c2011-07-08 01:45:13 +0200657 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000658
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000659 c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
660 c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
661 c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1));
662 c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 if (c1 < 0x5e) { /* Plane 1 */
665 c1 += 0x21;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200666 EMULATE_JISX0213_2000_DECODE_PLANE1(writer,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000667 c1, c2)
Victor Stinner11bdf912013-10-28 23:18:39 +0100668 else if (TRYMAP_DEC(jisx0208, decoded, c1, c2))
669 OUTCHAR(decoded);
670 else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c1, c2))
671 OUTCHAR(decoded);
672 else if (TRYMAP_DEC(jisx0213_1_emp, code, c1, c2))
Victor Stinnera0dd0212013-04-11 22:09:04 +0200673 OUTCHAR(EMPBASE | code);
Victor Stinner11bdf912013-10-28 23:18:39 +0100674 else if (TRYMAP_DEC(jisx0213_pair, code, c1, c2))
Victor Stinnera0dd0212013-04-11 22:09:04 +0200675 OUTCHAR2(code >> 16, code & 0xffff);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000676 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200677 return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200678 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 }
680 else { /* Plane 2 */
681 if (c1 >= 0x67) c1 += 0x07;
682 else if (c1 >= 0x63 || c1 == 0x5f) c1 -= 0x37;
683 else c1 -= 0x3d;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000684
Victor Stinnera0dd0212013-04-11 22:09:04 +0200685 EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000686 c1, c2)
Victor Stinner11bdf912013-10-28 23:18:39 +0100687 else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c1, c2))
688 OUTCHAR(decoded);
689 else if (TRYMAP_DEC(jisx0213_2_emp, code, c1, c2)) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200690 OUTCHAR(EMPBASE | code);
691 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000692 continue;
693 }
694 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200695 return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200696 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000697 }
698 continue;
699 }
700 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200701 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000702
Victor Stinnera0dd0212013-04-11 22:09:04 +0200703 NEXT_IN(1); /* JIS X 0201 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000704 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000705
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000706 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000707}
708
709
710BEGIN_MAPPINGS_LIST
711 MAPPING_DECONLY(jisx0208)
712 MAPPING_DECONLY(jisx0212)
713 MAPPING_ENCONLY(jisxcommon)
714 MAPPING_DECONLY(jisx0213_1_bmp)
715 MAPPING_DECONLY(jisx0213_2_bmp)
716 MAPPING_ENCONLY(jisx0213_bmp)
717 MAPPING_DECONLY(jisx0213_1_emp)
718 MAPPING_DECONLY(jisx0213_2_emp)
719 MAPPING_ENCONLY(jisx0213_emp)
720 MAPPING_ENCDEC(jisx0213_pair)
721 MAPPING_ENCDEC(cp932ext)
722END_MAPPINGS_LIST
723
724BEGIN_CODECS_LIST
725 CODEC_STATELESS(shift_jis)
726 CODEC_STATELESS(cp932)
727 CODEC_STATELESS(euc_jp)
728 CODEC_STATELESS(shift_jis_2004)
729 CODEC_STATELESS(euc_jis_2004)
730 { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) },
731 { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) },
732END_CODECS_LIST
733
734I_AM_A_MODULE_FOR(jp)