_codecs_jp.c 20 KB

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