blob: 2c7788a645813c279ef4a6f380c187847ce7b6dd [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 Stinner14c9fea2013-10-29 00:19:27 +010028 WRITEBYTE1((unsigned char)c);
Victor Stinnerd9491262013-04-14 02:06:32 +020029 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000030 continue;
31 }
32 else if (c >= 0xff61 && c <= 0xff9f) {
Victor Stinner14c9fea2013-10-29 00:19:27 +010033 WRITEBYTE1(c - 0xfec0);
Victor Stinnerd9491262013-04-14 02:06:32 +020034 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000035 continue;
36 }
37 else if (c >= 0xf8f0 && c <= 0xf8f3) {
38 /* Windows compatibility */
Victor Stinner14c9fea2013-10-29 00:19:27 +010039 REQUIRE_OUTBUF(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000040 if (c == 0xf8f0)
Victor Stinner14c9fea2013-10-29 00:19:27 +010041 OUTBYTE1(0xa0);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000042 else
Victor Stinner14c9fea2013-10-29 00:19:27 +010043 OUTBYTE1(c - 0xfef1 + 0xfd);
Victor Stinnerd9491262013-04-14 02:06:32 +020044 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;
Victor Stinner14c9fea2013-10-29 00:19:27 +010050 REQUIRE_OUTBUF(2);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +000051
Victor Stinnerbd97ac32013-10-28 23:54:13 +010052 if (TRYMAP_ENC(cp932ext, code, c)) {
Victor Stinner14c9fea2013-10-29 00:19:27 +010053 OUTBYTE1(code >> 8);
54 OUTBYTE2(code & 0xff);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000055 }
Victor Stinnerbd97ac32013-10-28 23:54:13 +010056 else if (TRYMAP_ENC(jisxcommon, code, c)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +000057 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 Stinner14c9fea2013-10-29 00:19:27 +010065 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 Stinner14c9fea2013-10-29 00:19:27 +010072 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
Victor Stinner28c63f72013-10-29 00:59:44 +0100110 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 Stinner14c9fea2013-10-29 00:19:27 +0100159 WRITEBYTE1(c);
Victor Stinnerd9491262013-04-14 02:06:32 +0200160 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)
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100168 else if (TRYMAP_ENC(jisx0213_bmp, code, c)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000169 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 }
Victor Stinner146a2ed2013-10-29 00:09:41 +0100200 else if (TRYMAP_ENC(jisxcommon, code, c))
201 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000202 else if (c >= 0xff61 && c <= 0xff9f) {
203 /* JIS X 0201 half-width katakana */
Victor Stinner14c9fea2013-10-29 00:19:27 +0100204 WRITEBYTE2(0x8e, c - 0xfec0);
Victor Stinnerd9491262013-04-14 02:06:32 +0200205 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000206 continue;
207 }
208 else if (c == 0xff3c)
209 /* F/W REVERSE SOLIDUS (see NOTES) */
210 code = 0x2140;
211 else if (c == 0xff5e)
212 /* F/W TILDE (see NOTES) */
213 code = 0x2232;
214 else
215 return 1;
216 }
217 else if (c >> 16 == EMPBASE >> 16) {
218 EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
Victor Stinner146a2ed2013-10-29 00:09:41 +0100219 else if (TRYMAP_ENC(jisx0213_emp, code, c & 0xffff))
220 ;
221 else
222 return insize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000223 }
224 else
225 return insize;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000226
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000227 if (code & 0x8000) {
228 /* Codeset 2 */
Victor Stinner14c9fea2013-10-29 00:19:27 +0100229 WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80);
Victor Stinnerd9491262013-04-14 02:06:32 +0200230 NEXT(insize, 3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000231 } else {
232 /* Codeset 1 */
Victor Stinner14c9fea2013-10-29 00:19:27 +0100233 WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80);
Victor Stinnerd9491262013-04-14 02:06:32 +0200234 NEXT(insize, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000235 }
236 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000237
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000238 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000239}
240
241DECODER(euc_jis_2004)
242{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000243 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200244 unsigned char c = INBYTE1;
Victor Stinner11bdf912013-10-28 23:18:39 +0100245 Py_UCS4 code, decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000246
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000247 if (c < 0x80) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200248 OUTCHAR(c);
249 NEXT_IN(1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000250 continue;
251 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000252
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000253 if (c == 0x8e) {
254 /* JIS X 0201 half-width katakana */
255 unsigned char c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000256
Victor Stinner28c63f72013-10-29 00:59:44 +0100257 REQUIRE_INBUF(2);
Victor Stinnerd9491262013-04-14 02:06:32 +0200258 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000259 if (c2 >= 0xa1 && c2 <= 0xdf) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200260 OUTCHAR(0xfec0 + c2);
261 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000262 }
263 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200264 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000265 }
266 else if (c == 0x8f) {
267 unsigned char c2, c3;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000268
Victor Stinner28c63f72013-10-29 00:59:44 +0100269 REQUIRE_INBUF(3);
Victor Stinnerd9491262013-04-14 02:06:32 +0200270 c2 = INBYTE2 ^ 0x80;
271 c3 = INBYTE3 ^ 0x80;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000272
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000273 /* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200274 EMULATE_JISX0213_2000_DECODE_PLANE2(writer, c2, c3)
Victor Stinner11bdf912013-10-28 23:18:39 +0100275 else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c2, c3))
276 OUTCHAR(decoded);
277 else if (TRYMAP_DEC(jisx0213_2_emp, code, c2, c3)) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200278 OUTCHAR(EMPBASE | code);
279 NEXT_IN(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000280 continue;
281 }
Victor Stinner11bdf912013-10-28 23:18:39 +0100282 else if (TRYMAP_DEC(jisx0212, decoded, c2, c3))
283 OUTCHAR(decoded);
Victor Stinner146a2ed2013-10-29 00:09:41 +0100284 else
285 return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200286 NEXT_IN(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000287 }
288 else {
289 unsigned char c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000290
Victor Stinner28c63f72013-10-29 00:59:44 +0100291 REQUIRE_INBUF(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000292 c ^= 0x80;
Victor Stinnerd9491262013-04-14 02:06:32 +0200293 c2 = INBYTE2 ^ 0x80;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000294
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000295 /* JIS X 0213 Plane 1 */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200296 EMULATE_JISX0213_2000_DECODE_PLANE1(writer, c, c2)
Victor Stinner146a2ed2013-10-29 00:09:41 +0100297 else if (c == 0x21 && c2 == 0x40)
298 OUTCHAR(0xff3c);
299 else if (c == 0x22 && c2 == 0x32)
300 OUTCHAR(0xff5e);
Victor Stinner11bdf912013-10-28 23:18:39 +0100301 else if (TRYMAP_DEC(jisx0208, decoded, c, c2))
302 OUTCHAR(decoded);
303 else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c, c2))
304 OUTCHAR(decoded);
305 else if (TRYMAP_DEC(jisx0213_1_emp, code, c, c2)) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200306 OUTCHAR(EMPBASE | code);
307 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000308 continue;
309 }
Victor Stinner11bdf912013-10-28 23:18:39 +0100310 else if (TRYMAP_DEC(jisx0213_pair, code, c, c2)) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200311 OUTCHAR2(code >> 16, code & 0xffff);
312 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000313 continue;
314 }
Victor Stinner146a2ed2013-10-29 00:09:41 +0100315 else
316 return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200317 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000318 }
319 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000320
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000321 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000322}
323
324
325/*
326 * EUC-JP codec
327 */
328
329ENCODER(euc_jp)
330{
Victor Stinnerd9491262013-04-14 02:06:32 +0200331 while (*inpos < inlen) {
332 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000333 DBCHAR code;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000334
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000335 if (c < 0x80) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100336 WRITEBYTE1((unsigned char)c);
Victor Stinnerd9491262013-04-14 02:06:32 +0200337 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000338 continue;
339 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000340
Victor Stinnerd9491262013-04-14 02:06:32 +0200341 if (c > 0xFFFF)
342 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000343
Victor Stinner146a2ed2013-10-29 00:09:41 +0100344 if (TRYMAP_ENC(jisxcommon, code, c))
345 ;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000346 else if (c >= 0xff61 && c <= 0xff9f) {
347 /* JIS X 0201 half-width katakana */
Victor Stinner14c9fea2013-10-29 00:19:27 +0100348 WRITEBYTE2(0x8e, c - 0xfec0);
Victor Stinnerd9491262013-04-14 02:06:32 +0200349 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000350 continue;
351 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000352#ifndef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000353 else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */
354 code = 0x2140;
355 else if (c == 0xa5) { /* YEN SIGN */
Victor Stinnerd9491262013-04-14 02:06:32 +0200356 WRITEBYTE1(0x5c);
357 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000358 continue;
359 } else if (c == 0x203e) { /* OVERLINE */
Victor Stinnerd9491262013-04-14 02:06:32 +0200360 WRITEBYTE1(0x7e);
361 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000362 continue;
363 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000364#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000365 else
366 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000367
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000368 if (code & 0x8000) {
369 /* JIS X 0212 */
Victor Stinner14c9fea2013-10-29 00:19:27 +0100370 WRITEBYTE3(0x8f, code >> 8, (code & 0xFF) | 0x80);
Victor Stinnerd9491262013-04-14 02:06:32 +0200371 NEXT(1, 3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000372 } else {
373 /* JIS X 0208 */
Victor Stinner14c9fea2013-10-29 00:19:27 +0100374 WRITEBYTE2((code >> 8) | 0x80, (code & 0xFF) | 0x80);
Victor Stinnerd9491262013-04-14 02:06:32 +0200375 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000376 }
377 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000378
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000379 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000380}
381
382DECODER(euc_jp)
383{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000384 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200385 unsigned char c = INBYTE1;
Victor Stinner11bdf912013-10-28 23:18:39 +0100386 Py_UCS4 decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000387
Victor Stinner5dfe3bb2011-06-03 23:34:09 +0200388 if (c < 0x80) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200389 OUTCHAR(c);
390 NEXT_IN(1);
Victor Stinner5dfe3bb2011-06-03 23:34:09 +0200391 continue;
392 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000393
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000394 if (c == 0x8e) {
395 /* JIS X 0201 half-width katakana */
396 unsigned char c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000397
Victor Stinner28c63f72013-10-29 00:59:44 +0100398 REQUIRE_INBUF(2);
Victor Stinnerd9491262013-04-14 02:06:32 +0200399 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000400 if (c2 >= 0xa1 && c2 <= 0xdf) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200401 OUTCHAR(0xfec0 + c2);
402 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000403 }
404 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200405 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000406 }
407 else if (c == 0x8f) {
408 unsigned char c2, c3;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000409
Victor Stinner28c63f72013-10-29 00:59:44 +0100410 REQUIRE_INBUF(3);
Victor Stinnerd9491262013-04-14 02:06:32 +0200411 c2 = INBYTE2;
412 c3 = INBYTE3;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000413 /* JIS X 0212 */
Victor Stinner11bdf912013-10-28 23:18:39 +0100414 if (TRYMAP_DEC(jisx0212, decoded, c2 ^ 0x80, c3 ^ 0x80)) {
415 OUTCHAR(decoded);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200416 NEXT_IN(3);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000417 }
418 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200419 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000420 }
421 else {
422 unsigned char c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000423
Victor Stinner28c63f72013-10-29 00:59:44 +0100424 REQUIRE_INBUF(2);
Victor Stinnerd9491262013-04-14 02:06:32 +0200425 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000426 /* JIS X 0208 */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000427#ifndef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000428 if (c == 0xa1 && c2 == 0xc0)
429 /* FULL-WIDTH REVERSE SOLIDUS */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200430 OUTCHAR(0xff3c);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000431 else
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000432#endif
Victor Stinner11bdf912013-10-28 23:18:39 +0100433 if (TRYMAP_DEC(jisx0208, decoded, c ^ 0x80, c2 ^ 0x80))
434 OUTCHAR(decoded);
435 else
436 return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200437 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000438 }
439 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000440
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000441 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000442}
443
444
445/*
446 * SHIFT_JIS codec
447 */
448
449ENCODER(shift_jis)
450{
Victor Stinnerd9491262013-04-14 02:06:32 +0200451 while (*inpos < inlen) {
452 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000453 DBCHAR code;
454 unsigned char c1, c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000455
456#ifdef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000457 JISX0201_R_ENCODE(c, code)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000458#else
Victor Stinner146a2ed2013-10-29 00:09:41 +0100459 if (c < 0x80)
460 code = c;
461 else if (c == 0x00a5)
462 code = 0x5c; /* YEN SIGN */
463 else if (c == 0x203e)
464 code = 0x7e; /* OVERLINE */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000465#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000466 else JISX0201_K_ENCODE(c, code)
Victor Stinnerd9491262013-04-14 02:06:32 +0200467 else if (c > 0xFFFF)
468 return 1;
469 else
470 code = NOCHAR;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000471
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000472 if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100473 REQUIRE_OUTBUF(1);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000474
Victor Stinner14c9fea2013-10-29 00:19:27 +0100475 OUTBYTE1((unsigned char)code);
Victor Stinnerd9491262013-04-14 02:06:32 +0200476 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000477 continue;
478 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000479
Victor Stinner14c9fea2013-10-29 00:19:27 +0100480 REQUIRE_OUTBUF(2);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000481
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000482 if (code == NOCHAR) {
Victor Stinner146a2ed2013-10-29 00:09:41 +0100483 if (TRYMAP_ENC(jisxcommon, code, c))
484 ;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000485#ifndef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000486 else if (c == 0xff3c)
487 code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000488#endif
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000489 else
490 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000491
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000492 if (code & 0x8000) /* MSB set: JIS X 0212 */
493 return 1;
494 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000495
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000496 c1 = code >> 8;
497 c2 = code & 0xff;
498 c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
499 c1 = (c1 - 0x21) >> 1;
Victor Stinner14c9fea2013-10-29 00:19:27 +0100500 OUTBYTE1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1);
501 OUTBYTE2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41);
Victor Stinnerd9491262013-04-14 02:06:32 +0200502 NEXT(1, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000503 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000504
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000505 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000506}
507
508DECODER(shift_jis)
509{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000510 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200511 unsigned char c = INBYTE1;
Victor Stinner11bdf912013-10-28 23:18:39 +0100512 Py_UCS4 decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000513
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000514#ifdef STRICT_BUILD
Victor Stinnera0dd0212013-04-11 22:09:04 +0200515 JISX0201_R_DECODE(c, writer)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000516#else
Victor Stinner146a2ed2013-10-29 00:09:41 +0100517 if (c < 0x80)
518 OUTCHAR(c);
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000519#endif
Victor Stinnera0dd0212013-04-11 22:09:04 +0200520 else JISX0201_K_DECODE(c, writer)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000521 else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
522 unsigned char c1, c2;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000523
Victor Stinner28c63f72013-10-29 00:59:44 +0100524 REQUIRE_INBUF(2);
Victor Stinnerd9491262013-04-14 02:06:32 +0200525 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000526 if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
Victor Stinner2cded9c2011-07-08 01:45:13 +0200527 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000528
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000529 c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
530 c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
531 c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1) + 0x21);
532 c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000533
534#ifndef STRICT_BUILD
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000535 if (c1 == 0x21 && c2 == 0x40) {
536 /* FULL-WIDTH REVERSE SOLIDUS */
Victor Stinnera0dd0212013-04-11 22:09:04 +0200537 OUTCHAR(0xff3c);
538 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000539 continue;
540 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000541#endif
Victor Stinner11bdf912013-10-28 23:18:39 +0100542 if (TRYMAP_DEC(jisx0208, decoded, c1, c2)) {
543 OUTCHAR(decoded);
Victor Stinnera0dd0212013-04-11 22:09:04 +0200544 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000545 continue;
546 }
547 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200548 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000549 }
550 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200551 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000552
Victor Stinnera0dd0212013-04-11 22:09:04 +0200553 NEXT_IN(1); /* JIS X 0201 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000554 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000555
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000556 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000557}
558
559
560/*
561 * SHIFT_JIS-2004 codec
562 */
563
564ENCODER(shift_jis_2004)
565{
Victor Stinnerd9491262013-04-14 02:06:32 +0200566 while (*inpos < inlen) {
567 Py_UCS4 c = INCHAR1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000568 DBCHAR code = NOCHAR;
569 int c1, c2;
570 Py_ssize_t insize;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000571
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000572 JISX0201_ENCODE(c, code)
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000573
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000574 if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
Victor Stinner14c9fea2013-10-29 00:19:27 +0100575 WRITEBYTE1((unsigned char)code);
Victor Stinnerd9491262013-04-14 02:06:32 +0200576 NEXT(1, 1);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000577 continue;
578 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000579
Victor Stinner14c9fea2013-10-29 00:19:27 +0100580 REQUIRE_OUTBUF(2);
Victor Stinnerd9491262013-04-14 02:06:32 +0200581 insize = 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000582
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000583 if (code == NOCHAR) {
584 if (c <= 0xffff) {
585 EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100586 else if (TRYMAP_ENC(jisx0213_bmp, code, c)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000587 if (code == MULTIC) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200588 if (inlen - *inpos < 2) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000589 if (flags & MBENC_FLUSH) {
590 code = find_pairencmap
591 ((ucs2_t)c, 0,
592 jisx0213_pair_encmap,
593 JISX0213_ENCPAIRS);
594 if (code == DBCINV)
595 return 1;
596 }
597 else
598 return MBERR_TOOFEW;
599 }
600 else {
Victor Stinnerd9491262013-04-14 02:06:32 +0200601 Py_UCS4 ch2 = INCHAR2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000602 code = find_pairencmap(
Victor Stinnerd9491262013-04-14 02:06:32 +0200603 (ucs2_t)c, ch2,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000604 jisx0213_pair_encmap,
605 JISX0213_ENCPAIRS);
606 if (code == DBCINV) {
607 code = find_pairencmap(
608 (ucs2_t)c, 0,
609 jisx0213_pair_encmap,
610 JISX0213_ENCPAIRS);
611 if (code == DBCINV)
612 return 1;
613 }
614 else
615 insize = 2;
616 }
617 }
618 }
Victor Stinnerbd97ac32013-10-28 23:54:13 +0100619 else if (TRYMAP_ENC(jisxcommon, code, c)) {
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000620 /* abandon JIS X 0212 codes */
621 if (code & 0x8000)
622 return 1;
623 }
Victor Stinner146a2ed2013-10-29 00:09:41 +0100624 else
625 return 1;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000626 }
627 else if (c >> 16 == EMPBASE >> 16) {
628 EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
Victor Stinner146a2ed2013-10-29 00:09:41 +0100629 else if (TRYMAP_ENC(jisx0213_emp, code, c&0xffff))
630 ;
631 else
632 return insize;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000633 }
634 else
635 return insize;
636 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000637
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000638 c1 = code >> 8;
639 c2 = (code & 0xff) - 0x21;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000640
Victor Stinner28c63f72013-10-29 00:59:44 +0100641 if (c1 & 0x80) {
642 /* Plane 2 */
Victor Stinner146a2ed2013-10-29 00:09:41 +0100643 if (c1 >= 0xee)
644 c1 -= 0x87;
645 else if (c1 >= 0xac || c1 == 0xa8)
646 c1 -= 0x49;
647 else
648 c1 -= 0x43;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000649 }
Victor Stinner146a2ed2013-10-29 00:09:41 +0100650 else {
651 /* Plane 1 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000652 c1 -= 0x21;
Victor Stinner146a2ed2013-10-29 00:09:41 +0100653 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000654
Victor Stinner146a2ed2013-10-29 00:09:41 +0100655 if (c1 & 1)
656 c2 += 0x5e;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000657 c1 >>= 1;
Victor Stinner14c9fea2013-10-29 00:19:27 +0100658 OUTBYTE1(c1 + (c1 < 0x1f ? 0x81 : 0xc1));
659 OUTBYTE2(c2 + (c2 < 0x3f ? 0x40 : 0x41));
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000660
Victor Stinnerd9491262013-04-14 02:06:32 +0200661 NEXT(insize, 2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000662 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000663
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000664 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000665}
666
667DECODER(shift_jis_2004)
668{
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000669 while (inleft > 0) {
Victor Stinnerd9491262013-04-14 02:06:32 +0200670 unsigned char c = INBYTE1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000671
Victor Stinnera0dd0212013-04-11 22:09:04 +0200672 JISX0201_DECODE(c, writer)
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000673 else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
674 unsigned char c1, c2;
Victor Stinner11bdf912013-10-28 23:18:39 +0100675 Py_UCS4 code, decoded;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000676
Victor Stinner28c63f72013-10-29 00:59:44 +0100677 REQUIRE_INBUF(2);
Victor Stinnerd9491262013-04-14 02:06:32 +0200678 c2 = INBYTE2;
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000679 if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
Victor Stinner2cded9c2011-07-08 01:45:13 +0200680 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000681
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000682 c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
683 c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
684 c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1));
685 c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000686
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000687 if (c1 < 0x5e) { /* Plane 1 */
688 c1 += 0x21;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200689 EMULATE_JISX0213_2000_DECODE_PLANE1(writer,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000690 c1, c2)
Victor Stinner11bdf912013-10-28 23:18:39 +0100691 else if (TRYMAP_DEC(jisx0208, decoded, c1, c2))
692 OUTCHAR(decoded);
693 else if (TRYMAP_DEC(jisx0213_1_bmp, decoded, c1, c2))
694 OUTCHAR(decoded);
695 else if (TRYMAP_DEC(jisx0213_1_emp, code, c1, c2))
Victor Stinnera0dd0212013-04-11 22:09:04 +0200696 OUTCHAR(EMPBASE | code);
Victor Stinner11bdf912013-10-28 23:18:39 +0100697 else if (TRYMAP_DEC(jisx0213_pair, code, c1, c2))
Victor Stinnera0dd0212013-04-11 22:09:04 +0200698 OUTCHAR2(code >> 16, code & 0xffff);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000699 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200700 return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200701 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000702 }
703 else { /* Plane 2 */
Victor Stinner146a2ed2013-10-29 00:09:41 +0100704 if (c1 >= 0x67)
705 c1 += 0x07;
706 else if (c1 >= 0x63 || c1 == 0x5f)
707 c1 -= 0x37;
708 else
709 c1 -= 0x3d;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000710
Victor Stinnera0dd0212013-04-11 22:09:04 +0200711 EMULATE_JISX0213_2000_DECODE_PLANE2(writer,
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000712 c1, c2)
Victor Stinner11bdf912013-10-28 23:18:39 +0100713 else if (TRYMAP_DEC(jisx0213_2_bmp, decoded, c1, c2))
714 OUTCHAR(decoded);
715 else if (TRYMAP_DEC(jisx0213_2_emp, code, c1, c2)) {
Victor Stinnera0dd0212013-04-11 22:09:04 +0200716 OUTCHAR(EMPBASE | code);
717 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000718 continue;
719 }
720 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200721 return 1;
Victor Stinnera0dd0212013-04-11 22:09:04 +0200722 NEXT_IN(2);
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000723 }
724 continue;
725 }
726 else
Victor Stinner2cded9c2011-07-08 01:45:13 +0200727 return 1;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000728
Victor Stinnera0dd0212013-04-11 22:09:04 +0200729 NEXT_IN(1); /* JIS X 0201 */
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000730 }
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000731
Antoine Pitrouf95a1b32010-05-09 15:52:27 +0000732 return 0;
Hye-Shik Chang2bb146f2004-07-18 03:06:29 +0000733}
734
735
736BEGIN_MAPPINGS_LIST
737 MAPPING_DECONLY(jisx0208)
738 MAPPING_DECONLY(jisx0212)
739 MAPPING_ENCONLY(jisxcommon)
740 MAPPING_DECONLY(jisx0213_1_bmp)
741 MAPPING_DECONLY(jisx0213_2_bmp)
742 MAPPING_ENCONLY(jisx0213_bmp)
743 MAPPING_DECONLY(jisx0213_1_emp)
744 MAPPING_DECONLY(jisx0213_2_emp)
745 MAPPING_ENCONLY(jisx0213_emp)
746 MAPPING_ENCDEC(jisx0213_pair)
747 MAPPING_ENCDEC(cp932ext)
748END_MAPPINGS_LIST
749
750BEGIN_CODECS_LIST
751 CODEC_STATELESS(shift_jis)
752 CODEC_STATELESS(cp932)
753 CODEC_STATELESS(euc_jp)
754 CODEC_STATELESS(shift_jis_2004)
755 CODEC_STATELESS(euc_jis_2004)
756 { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) },
757 { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) },
758END_CODECS_LIST
759
760I_AM_A_MODULE_FOR(jp)