Line data Source code
1 : /*
2 : * _codecs_jp.c: Codecs collection for Japanese encodings
3 : *
4 : * Written by Hye-Shik Chang <perky@FreeBSD.org>
5 : */
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 :
20 0 : ENCODER(cp932)
21 : {
22 0 : while (inleft > 0) {
23 0 : Py_UNICODE c = IN1;
24 : DBCHAR code;
25 : unsigned char c1, c2;
26 :
27 0 : if (c <= 0x80) {
28 0 : WRITE1((unsigned char)c)
29 0 : NEXT(1, 1)
30 0 : continue;
31 : }
32 0 : else if (c >= 0xff61 && c <= 0xff9f) {
33 0 : WRITE1(c - 0xfec0)
34 0 : NEXT(1, 1)
35 0 : continue;
36 : }
37 0 : else if (c >= 0xf8f0 && c <= 0xf8f3) {
38 : /* Windows compatibility */
39 0 : REQUIRE_OUTBUF(1)
40 0 : if (c == 0xf8f0)
41 0 : OUT1(0xa0)
42 : else
43 0 : OUT1(c - 0xfef1 + 0xfd)
44 0 : NEXT(1, 1)
45 0 : continue;
46 : }
47 :
48 0 : UCS4INVALID(c)
49 0 : REQUIRE_OUTBUF(2)
50 :
51 0 : TRYMAP_ENC(cp932ext, code, c) {
52 0 : OUT1(code >> 8)
53 0 : OUT2(code & 0xff)
54 : }
55 0 : else TRYMAP_ENC(jisxcommon, code, c) {
56 0 : if (code & 0x8000) /* MSB set: JIS X 0212 */
57 0 : return 1;
58 :
59 : /* JIS X 0208 */
60 0 : c1 = code >> 8;
61 0 : c2 = code & 0xff;
62 0 : c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
63 0 : c1 = (c1 - 0x21) >> 1;
64 0 : OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
65 0 : OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
66 : }
67 0 : else if (c >= 0xe000 && c < 0xe758) {
68 : /* User-defined area */
69 0 : c1 = (Py_UNICODE)(c - 0xe000) / 188;
70 0 : c2 = (Py_UNICODE)(c - 0xe000) % 188;
71 0 : OUT1(c1 + 0xf0)
72 0 : OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
73 : }
74 : else
75 0 : return 1;
76 :
77 0 : NEXT(1, 2)
78 : }
79 :
80 0 : return 0;
81 : }
82 :
83 0 : DECODER(cp932)
84 : {
85 0 : while (inleft > 0) {
86 0 : unsigned char c = IN1, c2;
87 :
88 0 : REQUIRE_OUTBUF(1)
89 0 : if (c <= 0x80) {
90 0 : OUT1(c)
91 0 : NEXT(1, 1)
92 0 : continue;
93 : }
94 0 : else if (c >= 0xa0 && c <= 0xdf) {
95 0 : if (c == 0xa0)
96 0 : OUT1(0xf8f0) /* half-width katakana */
97 : else
98 0 : OUT1(0xfec0 + c)
99 0 : NEXT(1, 1)
100 0 : continue;
101 : }
102 0 : else if (c >= 0xfd/* && c <= 0xff*/) {
103 : /* Windows compatibility */
104 0 : OUT1(0xf8f1 - 0xfd + c)
105 0 : NEXT(1, 1)
106 0 : continue;
107 : }
108 :
109 0 : REQUIRE_INBUF(2)
110 0 : c2 = IN2;
111 :
112 0 : TRYMAP_DEC(cp932ext, **outbuf, c, c2);
113 0 : else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
114 0 : if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
115 0 : return 1;
116 :
117 0 : c = (c < 0xe0 ? c - 0x81 : c - 0xc1);
118 0 : c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
119 0 : c = (2 * c + (c2 < 0x5e ? 0 : 1) + 0x21);
120 0 : c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
121 :
122 0 : TRYMAP_DEC(jisx0208, **outbuf, c, c2);
123 0 : else return 1;
124 : }
125 0 : else if (c >= 0xf0 && c <= 0xf9) {
126 0 : if ((c2 >= 0x40 && c2 <= 0x7e) ||
127 0 : (c2 >= 0x80 && c2 <= 0xfc))
128 0 : OUT1(0xe000 + 188 * (c - 0xf0) +
129 : (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41))
130 : else
131 0 : return 1;
132 : }
133 : else
134 0 : return 1;
135 :
136 0 : NEXT(2, 1)
137 : }
138 :
139 0 : return 0;
140 : }
141 :
142 :
143 : /*
144 : * EUC-JIS-2004 codec
145 : */
146 :
147 0 : ENCODER(euc_jis_2004)
148 : {
149 0 : while (inleft > 0) {
150 0 : ucs4_t c = IN1;
151 : DBCHAR code;
152 : Py_ssize_t insize;
153 :
154 0 : if (c < 0x80) {
155 0 : WRITE1(c)
156 0 : NEXT(1, 1)
157 0 : continue;
158 : }
159 :
160 : DECODE_SURROGATE(c)
161 0 : insize = GET_INSIZE(c);
162 :
163 0 : if (c <= 0xFFFF) {
164 0 : EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
165 0 : else TRYMAP_ENC(jisx0213_bmp, code, c) {
166 0 : if (code == MULTIC) {
167 0 : if (inleft < 2) {
168 0 : if (flags & MBENC_FLUSH) {
169 0 : code = find_pairencmap(
170 0 : (ucs2_t)c, 0,
171 : jisx0213_pair_encmap,
172 : JISX0213_ENCPAIRS);
173 0 : if (code == DBCINV)
174 0 : return 1;
175 : }
176 : else
177 0 : return MBERR_TOOFEW;
178 : }
179 : else {
180 0 : code = find_pairencmap(
181 0 : (ucs2_t)c, (*inbuf)[1],
182 : jisx0213_pair_encmap,
183 : JISX0213_ENCPAIRS);
184 0 : if (code == DBCINV) {
185 0 : code = find_pairencmap(
186 0 : (ucs2_t)c, 0,
187 : jisx0213_pair_encmap,
188 : JISX0213_ENCPAIRS);
189 0 : if (code == DBCINV)
190 0 : return 1;
191 : } else
192 0 : insize = 2;
193 : }
194 : }
195 : }
196 0 : else TRYMAP_ENC(jisxcommon, code, c);
197 0 : else if (c >= 0xff61 && c <= 0xff9f) {
198 : /* JIS X 0201 half-width katakana */
199 0 : WRITE2(0x8e, c - 0xfec0)
200 0 : NEXT(1, 2)
201 0 : continue;
202 : }
203 0 : else if (c == 0xff3c)
204 : /* F/W REVERSE SOLIDUS (see NOTES) */
205 0 : code = 0x2140;
206 0 : else if (c == 0xff5e)
207 : /* F/W TILDE (see NOTES) */
208 0 : code = 0x2232;
209 : else
210 0 : return 1;
211 : }
212 0 : else if (c >> 16 == EMPBASE >> 16) {
213 0 : EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
214 0 : else TRYMAP_ENC(jisx0213_emp, code, c & 0xffff);
215 0 : else return insize;
216 : }
217 : else
218 0 : return insize;
219 :
220 0 : if (code & 0x8000) {
221 : /* Codeset 2 */
222 0 : WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
223 0 : NEXT(insize, 3)
224 : } else {
225 : /* Codeset 1 */
226 0 : WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
227 0 : NEXT(insize, 2)
228 : }
229 : }
230 :
231 0 : return 0;
232 : }
233 :
234 0 : DECODER(euc_jis_2004)
235 : {
236 0 : while (inleft > 0) {
237 0 : unsigned char c = IN1;
238 : ucs4_t code;
239 :
240 0 : REQUIRE_OUTBUF(1)
241 :
242 0 : if (c < 0x80) {
243 0 : OUT1(c)
244 0 : NEXT(1, 1)
245 0 : continue;
246 : }
247 :
248 0 : if (c == 0x8e) {
249 : /* JIS X 0201 half-width katakana */
250 : unsigned char c2;
251 :
252 0 : REQUIRE_INBUF(2)
253 0 : c2 = IN2;
254 0 : if (c2 >= 0xa1 && c2 <= 0xdf) {
255 0 : OUT1(0xfec0 + c2)
256 0 : NEXT(2, 1)
257 : }
258 : else
259 0 : return 1;
260 : }
261 0 : else if (c == 0x8f) {
262 : unsigned char c2, c3;
263 :
264 0 : REQUIRE_INBUF(3)
265 0 : c2 = IN2 ^ 0x80;
266 0 : c3 = IN3 ^ 0x80;
267 :
268 : /* JIS X 0213 Plane 2 or JIS X 0212 (see NOTES) */
269 0 : EMULATE_JISX0213_2000_DECODE_PLANE2(**outbuf, c2, c3)
270 0 : else TRYMAP_DEC(jisx0213_2_bmp, **outbuf, c2, c3) ;
271 0 : else TRYMAP_DEC(jisx0213_2_emp, code, c2, c3) {
272 0 : WRITEUCS4(EMPBASE | code)
273 0 : NEXT_IN(3)
274 0 : continue;
275 : }
276 0 : else TRYMAP_DEC(jisx0212, **outbuf, c2, c3) ;
277 0 : else return 1;
278 0 : NEXT(3, 1)
279 : }
280 : else {
281 : unsigned char c2;
282 :
283 0 : REQUIRE_INBUF(2)
284 0 : c ^= 0x80;
285 0 : c2 = IN2 ^ 0x80;
286 :
287 : /* JIS X 0213 Plane 1 */
288 0 : EMULATE_JISX0213_2000_DECODE_PLANE1(**outbuf, c, c2)
289 0 : else if (c == 0x21 && c2 == 0x40) **outbuf = 0xff3c;
290 0 : else if (c == 0x22 && c2 == 0x32) **outbuf = 0xff5e;
291 0 : else TRYMAP_DEC(jisx0208, **outbuf, c, c2);
292 0 : else TRYMAP_DEC(jisx0213_1_bmp, **outbuf, c, c2);
293 0 : else TRYMAP_DEC(jisx0213_1_emp, code, c, c2) {
294 0 : WRITEUCS4(EMPBASE | code)
295 0 : NEXT_IN(2)
296 0 : continue;
297 : }
298 0 : else TRYMAP_DEC(jisx0213_pair, code, c, c2) {
299 0 : WRITE2(code >> 16, code & 0xffff)
300 0 : NEXT(2, 2)
301 0 : continue;
302 : }
303 0 : else return 1;
304 0 : NEXT(2, 1)
305 : }
306 : }
307 :
308 0 : return 0;
309 : }
310 :
311 :
312 : /*
313 : * EUC-JP codec
314 : */
315 :
316 0 : ENCODER(euc_jp)
317 : {
318 0 : while (inleft > 0) {
319 0 : Py_UNICODE c = IN1;
320 : DBCHAR code;
321 :
322 0 : if (c < 0x80) {
323 0 : WRITE1((unsigned char)c)
324 0 : NEXT(1, 1)
325 0 : continue;
326 : }
327 :
328 0 : UCS4INVALID(c)
329 :
330 0 : TRYMAP_ENC(jisxcommon, code, c);
331 0 : else if (c >= 0xff61 && c <= 0xff9f) {
332 : /* JIS X 0201 half-width katakana */
333 0 : WRITE2(0x8e, c - 0xfec0)
334 0 : NEXT(1, 2)
335 0 : continue;
336 : }
337 : #ifndef STRICT_BUILD
338 0 : else if (c == 0xff3c) /* FULL-WIDTH REVERSE SOLIDUS */
339 0 : code = 0x2140;
340 0 : else if (c == 0xa5) { /* YEN SIGN */
341 0 : WRITE1(0x5c);
342 0 : NEXT(1, 1)
343 0 : continue;
344 0 : } else if (c == 0x203e) { /* OVERLINE */
345 0 : WRITE1(0x7e);
346 0 : NEXT(1, 1)
347 0 : continue;
348 : }
349 : #endif
350 : else
351 0 : return 1;
352 :
353 0 : if (code & 0x8000) {
354 : /* JIS X 0212 */
355 0 : WRITE3(0x8f, code >> 8, (code & 0xFF) | 0x80)
356 0 : NEXT(1, 3)
357 : } else {
358 : /* JIS X 0208 */
359 0 : WRITE2((code >> 8) | 0x80, (code & 0xFF) | 0x80)
360 0 : NEXT(1, 2)
361 : }
362 : }
363 :
364 0 : return 0;
365 : }
366 :
367 0 : DECODER(euc_jp)
368 : {
369 0 : while (inleft > 0) {
370 0 : unsigned char c = IN1;
371 :
372 0 : REQUIRE_OUTBUF(1)
373 :
374 0 : if (c < 0x80) {
375 0 : OUT1(c)
376 0 : NEXT(1, 1)
377 0 : continue;
378 : }
379 :
380 0 : if (c == 0x8e) {
381 : /* JIS X 0201 half-width katakana */
382 : unsigned char c2;
383 :
384 0 : REQUIRE_INBUF(2)
385 0 : c2 = IN2;
386 0 : if (c2 >= 0xa1 && c2 <= 0xdf) {
387 0 : OUT1(0xfec0 + c2)
388 0 : NEXT(2, 1)
389 : }
390 : else
391 0 : return 1;
392 : }
393 0 : else if (c == 0x8f) {
394 : unsigned char c2, c3;
395 :
396 0 : REQUIRE_INBUF(3)
397 0 : c2 = IN2;
398 0 : c3 = IN3;
399 : /* JIS X 0212 */
400 0 : TRYMAP_DEC(jisx0212, **outbuf, c2 ^ 0x80, c3 ^ 0x80) {
401 0 : NEXT(3, 1)
402 : }
403 : else
404 0 : return 1;
405 : }
406 : else {
407 : unsigned char c2;
408 :
409 0 : REQUIRE_INBUF(2)
410 0 : c2 = IN2;
411 : /* JIS X 0208 */
412 : #ifndef STRICT_BUILD
413 0 : if (c == 0xa1 && c2 == 0xc0)
414 : /* FULL-WIDTH REVERSE SOLIDUS */
415 0 : **outbuf = 0xff3c;
416 : else
417 : #endif
418 0 : TRYMAP_DEC(jisx0208, **outbuf,
419 : c ^ 0x80, c2 ^ 0x80) ;
420 0 : else return 1;
421 0 : NEXT(2, 1)
422 : }
423 : }
424 :
425 0 : return 0;
426 : }
427 :
428 :
429 : /*
430 : * SHIFT_JIS codec
431 : */
432 :
433 0 : ENCODER(shift_jis)
434 : {
435 0 : while (inleft > 0) {
436 0 : Py_UNICODE c = IN1;
437 : DBCHAR code;
438 : unsigned char c1, c2;
439 :
440 : #ifdef STRICT_BUILD
441 : JISX0201_R_ENCODE(c, code)
442 : #else
443 0 : if (c < 0x80) code = c;
444 0 : else if (c == 0x00a5) code = 0x5c; /* YEN SIGN */
445 0 : else if (c == 0x203e) code = 0x7e; /* OVERLINE */
446 : #endif
447 0 : else JISX0201_K_ENCODE(c, code)
448 0 : else UCS4INVALID(c)
449 0 : else code = NOCHAR;
450 :
451 0 : if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
452 0 : REQUIRE_OUTBUF(1)
453 :
454 0 : OUT1((unsigned char)code)
455 0 : NEXT(1, 1)
456 0 : continue;
457 : }
458 :
459 0 : REQUIRE_OUTBUF(2)
460 :
461 0 : if (code == NOCHAR) {
462 0 : TRYMAP_ENC(jisxcommon, code, c);
463 : #ifndef STRICT_BUILD
464 0 : else if (c == 0xff3c)
465 0 : code = 0x2140; /* FULL-WIDTH REVERSE SOLIDUS */
466 : #endif
467 : else
468 0 : return 1;
469 :
470 0 : if (code & 0x8000) /* MSB set: JIS X 0212 */
471 0 : return 1;
472 : }
473 :
474 0 : c1 = code >> 8;
475 0 : c2 = code & 0xff;
476 0 : c2 = (((c1 - 0x21) & 1) ? 0x5e : 0) + (c2 - 0x21);
477 0 : c1 = (c1 - 0x21) >> 1;
478 0 : OUT1(c1 < 0x1f ? c1 + 0x81 : c1 + 0xc1)
479 0 : OUT2(c2 < 0x3f ? c2 + 0x40 : c2 + 0x41)
480 0 : NEXT(1, 2)
481 : }
482 :
483 0 : return 0;
484 : }
485 :
486 0 : DECODER(shift_jis)
487 : {
488 0 : while (inleft > 0) {
489 0 : unsigned char c = IN1;
490 :
491 0 : REQUIRE_OUTBUF(1)
492 :
493 : #ifdef STRICT_BUILD
494 : JISX0201_R_DECODE(c, **outbuf)
495 : #else
496 0 : if (c < 0x80) **outbuf = c;
497 : #endif
498 0 : else JISX0201_K_DECODE(c, **outbuf)
499 0 : else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xea)){
500 : unsigned char c1, c2;
501 :
502 0 : REQUIRE_INBUF(2)
503 0 : c2 = IN2;
504 0 : if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
505 0 : return 1;
506 :
507 0 : c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
508 0 : c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
509 0 : c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1) + 0x21);
510 0 : c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
511 :
512 : #ifndef STRICT_BUILD
513 0 : if (c1 == 0x21 && c2 == 0x40) {
514 : /* FULL-WIDTH REVERSE SOLIDUS */
515 0 : OUT1(0xff3c)
516 0 : NEXT(2, 1)
517 0 : continue;
518 : }
519 : #endif
520 0 : TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {
521 0 : NEXT(2, 1)
522 0 : continue;
523 : }
524 : else
525 0 : return 1;
526 : }
527 : else
528 0 : return 1;
529 :
530 0 : NEXT(1, 1) /* JIS X 0201 */
531 : }
532 :
533 0 : return 0;
534 : }
535 :
536 :
537 : /*
538 : * SHIFT_JIS-2004 codec
539 : */
540 :
541 0 : ENCODER(shift_jis_2004)
542 : {
543 0 : while (inleft > 0) {
544 0 : ucs4_t c = IN1;
545 0 : DBCHAR code = NOCHAR;
546 : int c1, c2;
547 : Py_ssize_t insize;
548 :
549 0 : JISX0201_ENCODE(c, code)
550 : else DECODE_SURROGATE(c)
551 :
552 0 : if (code < 0x80 || (code >= 0xa1 && code <= 0xdf)) {
553 0 : WRITE1((unsigned char)code)
554 0 : NEXT(1, 1)
555 0 : continue;
556 : }
557 :
558 0 : REQUIRE_OUTBUF(2)
559 0 : insize = GET_INSIZE(c);
560 :
561 0 : if (code == NOCHAR) {
562 0 : if (c <= 0xffff) {
563 0 : EMULATE_JISX0213_2000_ENCODE_BMP(code, c)
564 0 : else TRYMAP_ENC(jisx0213_bmp, code, c) {
565 0 : if (code == MULTIC) {
566 0 : if (inleft < 2) {
567 0 : if (flags & MBENC_FLUSH) {
568 0 : code = find_pairencmap
569 0 : ((ucs2_t)c, 0,
570 : jisx0213_pair_encmap,
571 : JISX0213_ENCPAIRS);
572 0 : if (code == DBCINV)
573 0 : return 1;
574 : }
575 : else
576 0 : return MBERR_TOOFEW;
577 : }
578 : else {
579 0 : code = find_pairencmap(
580 0 : (ucs2_t)c, IN2,
581 : jisx0213_pair_encmap,
582 : JISX0213_ENCPAIRS);
583 0 : if (code == DBCINV) {
584 0 : code = find_pairencmap(
585 0 : (ucs2_t)c, 0,
586 : jisx0213_pair_encmap,
587 : JISX0213_ENCPAIRS);
588 0 : if (code == DBCINV)
589 0 : return 1;
590 : }
591 : else
592 0 : insize = 2;
593 : }
594 : }
595 : }
596 0 : else TRYMAP_ENC(jisxcommon, code, c) {
597 : /* abandon JIS X 0212 codes */
598 0 : if (code & 0x8000)
599 0 : return 1;
600 : }
601 0 : else return 1;
602 : }
603 0 : else if (c >> 16 == EMPBASE >> 16) {
604 0 : EMULATE_JISX0213_2000_ENCODE_EMP(code, c)
605 0 : else TRYMAP_ENC(jisx0213_emp, code, c&0xffff);
606 0 : else return insize;
607 : }
608 : else
609 0 : return insize;
610 : }
611 :
612 0 : c1 = code >> 8;
613 0 : c2 = (code & 0xff) - 0x21;
614 :
615 0 : if (c1 & 0x80) { /* Plane 2 */
616 0 : if (c1 >= 0xee) c1 -= 0x87;
617 0 : else if (c1 >= 0xac || c1 == 0xa8) c1 -= 0x49;
618 0 : else c1 -= 0x43;
619 : }
620 : else /* Plane 1 */
621 0 : c1 -= 0x21;
622 :
623 0 : if (c1 & 1) c2 += 0x5e;
624 0 : c1 >>= 1;
625 0 : OUT1(c1 + (c1 < 0x1f ? 0x81 : 0xc1))
626 0 : OUT2(c2 + (c2 < 0x3f ? 0x40 : 0x41))
627 :
628 0 : NEXT(insize, 2)
629 : }
630 :
631 0 : return 0;
632 : }
633 :
634 0 : DECODER(shift_jis_2004)
635 : {
636 0 : while (inleft > 0) {
637 0 : unsigned char c = IN1;
638 :
639 0 : REQUIRE_OUTBUF(1)
640 0 : JISX0201_DECODE(c, **outbuf)
641 0 : else if ((c >= 0x81 && c <= 0x9f) || (c >= 0xe0 && c <= 0xfc)){
642 : unsigned char c1, c2;
643 : ucs4_t code;
644 :
645 0 : REQUIRE_INBUF(2)
646 0 : c2 = IN2;
647 0 : if (c2 < 0x40 || (c2 > 0x7e && c2 < 0x80) || c2 > 0xfc)
648 0 : return 1;
649 :
650 0 : c1 = (c < 0xe0 ? c - 0x81 : c - 0xc1);
651 0 : c2 = (c2 < 0x80 ? c2 - 0x40 : c2 - 0x41);
652 0 : c1 = (2 * c1 + (c2 < 0x5e ? 0 : 1));
653 0 : c2 = (c2 < 0x5e ? c2 : c2 - 0x5e) + 0x21;
654 :
655 0 : if (c1 < 0x5e) { /* Plane 1 */
656 0 : c1 += 0x21;
657 0 : EMULATE_JISX0213_2000_DECODE_PLANE1(**outbuf,
658 : c1, c2)
659 0 : else TRYMAP_DEC(jisx0208, **outbuf, c1, c2) {
660 0 : NEXT_OUT(1)
661 : }
662 0 : else TRYMAP_DEC(jisx0213_1_bmp, **outbuf,
663 : c1, c2) {
664 0 : NEXT_OUT(1)
665 : }
666 0 : else TRYMAP_DEC(jisx0213_1_emp, code, c1, c2) {
667 0 : WRITEUCS4(EMPBASE | code)
668 : }
669 0 : else TRYMAP_DEC(jisx0213_pair, code, c1, c2) {
670 0 : WRITE2(code >> 16, code & 0xffff)
671 0 : NEXT_OUT(2)
672 : }
673 : else
674 0 : return 1;
675 0 : NEXT_IN(2)
676 : }
677 : else { /* Plane 2 */
678 0 : if (c1 >= 0x67) c1 += 0x07;
679 0 : else if (c1 >= 0x63 || c1 == 0x5f) c1 -= 0x37;
680 0 : else c1 -= 0x3d;
681 :
682 0 : EMULATE_JISX0213_2000_DECODE_PLANE2(**outbuf,
683 : c1, c2)
684 0 : else TRYMAP_DEC(jisx0213_2_bmp, **outbuf,
685 : c1, c2) ;
686 0 : else TRYMAP_DEC(jisx0213_2_emp, code, c1, c2) {
687 0 : WRITEUCS4(EMPBASE | code)
688 0 : NEXT_IN(2)
689 0 : continue;
690 : }
691 : else
692 0 : return 1;
693 0 : NEXT(2, 1)
694 : }
695 0 : continue;
696 : }
697 : else
698 0 : return 1;
699 :
700 0 : NEXT(1, 1) /* JIS X 0201 */
701 : }
702 :
703 0 : return 0;
704 : }
705 :
706 :
707 : BEGIN_MAPPINGS_LIST
708 : MAPPING_DECONLY(jisx0208)
709 : MAPPING_DECONLY(jisx0212)
710 : MAPPING_ENCONLY(jisxcommon)
711 : MAPPING_DECONLY(jisx0213_1_bmp)
712 : MAPPING_DECONLY(jisx0213_2_bmp)
713 : MAPPING_ENCONLY(jisx0213_bmp)
714 : MAPPING_DECONLY(jisx0213_1_emp)
715 : MAPPING_DECONLY(jisx0213_2_emp)
716 : MAPPING_ENCONLY(jisx0213_emp)
717 : MAPPING_ENCDEC(jisx0213_pair)
718 : MAPPING_ENCDEC(cp932ext)
719 : END_MAPPINGS_LIST
720 :
721 : BEGIN_CODECS_LIST
722 : CODEC_STATELESS(shift_jis)
723 : CODEC_STATELESS(cp932)
724 : CODEC_STATELESS(euc_jp)
725 : CODEC_STATELESS(shift_jis_2004)
726 : CODEC_STATELESS(euc_jis_2004)
727 : { "euc_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(euc_jis_2004) },
728 : { "shift_jisx0213", (void *)2000, NULL, _STATELESS_METHODS(shift_jis_2004) },
729 : END_CODECS_LIST
730 :
731 0 : I_AM_A_MODULE_FOR(jp)
|