LCOV - code coverage report
Current view: top level - libreoffice/workdir/unxlngi6.pro/UnpackedTarball/python3/Modules/cjkcodecs - _codecs_jp.c (source / functions) Hit Total Coverage
Test: libreoffice_filtered.info Lines: 0 386 0.0 %
Date: 2012-12-17 Functions: 0 11 0.0 %
Legend: Lines: hit not hit

          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)

Generated by: LCOV version 1.10