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