Ruby 1.9.3p327(2012-11-10revision37606)
|
00001 /* autogenerated. */ 00002 /* src="transcode-tblgen.rb", len=28123, checksum=30477 */ 00003 /* src="iso2022.trans", len=15906, checksum=38089 */ 00004 00005 #include "transcode_data.h" 00006 00007 00008 00009 static const unsigned char 00010 iso2022_byte_array[1245] = { 00011 #define iso2022jp_decoder_1B_24_offsets 0 00012 64, 66, 00013 1, 0, 1, 00014 00015 #define iso2022jp_decoder_1B_28_offsets 5 00016 66, 74, 00017 1, 0, 0, 0, 0, 0, 0, 0, 1, 00018 00019 #define iso2022jp_decoder_1B_offsets 16 00020 36, 40, 00021 1, 0, 0, 0, 2, 00022 00023 #define iso2022jp_decoder_offsets 23 00024 0, 127, 00025 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 00026 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 00027 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00028 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00029 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00030 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00031 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00032 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00033 00034 #define iso2022jp_decoder_jisx0208_rest_offsets 153 00035 33, 126, 00036 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00037 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00038 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00039 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00040 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00041 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00042 00043 #define iso2022jp_encoder_90_A1toFE_offsets 249 00044 161, 254, 00045 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00046 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00047 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00048 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00049 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00050 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00051 00052 #define iso2022jp_encoder_offsets 345 00053 0, 146, 00054 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 00055 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 00056 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00057 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00058 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00059 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00060 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00061 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00062 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 00063 2, 1, 2, 00064 00065 #define eucjp_to_stateless_iso2022jp_offsets 494 00066 0, 254, 00067 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 00068 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 00069 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00070 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00071 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00072 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00073 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00074 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00075 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 00076 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 00077 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 00078 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 00079 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 00080 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 00081 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 00082 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 00083 00084 #define cp50221_decoder_1B_28_offsets 751 00085 66, 74, 00086 1, 0, 0, 0, 0, 0, 0, 1, 1, 00087 00088 #define cp50221_decoder_offsets 762 00089 0, 223, 00090 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 00091 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 00092 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00093 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00094 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00095 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00096 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00097 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00098 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00099 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 00100 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00104 00105 #define cp50221_encoder_offsets 988 00106 0, 254, 00107 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 00108 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 00109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00110 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 00115 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 00116 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 00117 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 00118 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 00119 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 00120 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 00121 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 00122 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 00123 00124 }; 00125 static const unsigned int 00126 iso2022_word_array[69] = { 00127 #define iso2022jp_decoder_1B_24_infos WORDINDEX2INFO(0) 00128 INVALID, FUNso, 00129 00130 #define iso2022jp_decoder_1B_24 WORDINDEX2INFO(2) 00131 iso2022jp_decoder_1B_24_offsets, 00132 iso2022jp_decoder_1B_24_infos, 00133 00134 #define iso2022jp_decoder_1B_28 WORDINDEX2INFO(4) 00135 iso2022jp_decoder_1B_28_offsets, 00136 iso2022jp_decoder_1B_24_infos, 00137 00138 #define iso2022jp_decoder_1B_infos WORDINDEX2INFO(6) 00139 INVALID, iso2022jp_decoder_1B_24, 00140 iso2022jp_decoder_1B_28, 00141 00142 #define iso2022jp_decoder_1B WORDINDEX2INFO(9) 00143 iso2022jp_decoder_1B_offsets, 00144 iso2022jp_decoder_1B_infos, 00145 00146 #define iso2022jp_decoder_infos WORDINDEX2INFO(11) 00147 FUNsi, INVALID, 00148 iso2022jp_decoder_1B, 00149 00150 #define iso2022jp_decoder WORDINDEX2INFO(14) 00151 iso2022jp_decoder_offsets, 00152 iso2022jp_decoder_infos, 00153 00154 #define iso2022jp_decoder_jisx0208_rest WORDINDEX2INFO(16) 00155 iso2022jp_decoder_jisx0208_rest_offsets, 00156 iso2022jp_decoder_1B_24_infos, 00157 00158 #define iso2022jp_encoder_90_A1toFE WORDINDEX2INFO(18) 00159 iso2022jp_encoder_90_A1toFE_offsets, 00160 iso2022jp_decoder_1B_24_infos, 00161 00162 #define iso2022jp_encoder_90_infos WORDINDEX2INFO(20) 00163 INVALID, iso2022jp_encoder_90_A1toFE, 00164 00165 #define iso2022jp_encoder_90 WORDINDEX2INFO(22) 00166 iso2022jp_encoder_90_A1toFE_offsets, 00167 iso2022jp_encoder_90_infos, 00168 00169 #define iso2022jp_encoder_infos WORDINDEX2INFO(24) 00170 FUNso, INVALID, 00171 iso2022jp_encoder_90, 00172 00173 #define iso2022jp_encoder WORDINDEX2INFO(27) 00174 iso2022jp_encoder_offsets, 00175 iso2022jp_encoder_infos, 00176 00177 #define stateless_iso2022jp_to_eucjp_infos WORDINDEX2INFO(29) 00178 NOMAP, INVALID, 00179 iso2022jp_encoder_90, 00180 00181 #define stateless_iso2022jp_to_eucjp WORDINDEX2INFO(32) 00182 iso2022jp_encoder_offsets, 00183 stateless_iso2022jp_to_eucjp_infos, 00184 00185 #define eucjp_to_stateless_iso2022jp_8E_infos WORDINDEX2INFO(34) 00186 INVALID, UNDEF, 00187 00188 #define eucjp_to_stateless_iso2022jp_8E WORDINDEX2INFO(36) 00189 iso2022jp_encoder_90_A1toFE_offsets, 00190 eucjp_to_stateless_iso2022jp_8E_infos, 00191 00192 #define eucjp_to_stateless_iso2022jp_8F_infos WORDINDEX2INFO(38) 00193 INVALID, eucjp_to_stateless_iso2022jp_8E, 00194 00195 #define eucjp_to_stateless_iso2022jp_8F WORDINDEX2INFO(40) 00196 iso2022jp_encoder_90_A1toFE_offsets, 00197 eucjp_to_stateless_iso2022jp_8F_infos, 00198 00199 #define eucjp_to_stateless_iso2022jp_infos WORDINDEX2INFO(42) 00200 NOMAP, UNDEF, 00201 INVALID, eucjp_to_stateless_iso2022jp_8E, 00202 eucjp_to_stateless_iso2022jp_8F, iso2022jp_encoder_90_A1toFE, 00203 00204 #define eucjp_to_stateless_iso2022jp WORDINDEX2INFO(48) 00205 eucjp_to_stateless_iso2022jp_offsets, 00206 eucjp_to_stateless_iso2022jp_infos, 00207 00208 #define cp50221_decoder_1B_28 WORDINDEX2INFO(50) 00209 cp50221_decoder_1B_28_offsets, 00210 iso2022jp_decoder_1B_24_infos, 00211 00212 #define cp50221_decoder_1B_infos WORDINDEX2INFO(52) 00213 INVALID, iso2022jp_decoder_1B_24, 00214 cp50221_decoder_1B_28, 00215 00216 #define cp50221_decoder_1B WORDINDEX2INFO(55) 00217 iso2022jp_decoder_1B_offsets, 00218 cp50221_decoder_1B_infos, 00219 00220 #define cp50221_decoder_infos WORDINDEX2INFO(57) 00221 FUNsi, FUNso, 00222 cp50221_decoder_1B, INVALID, 00223 00224 #define cp50221_decoder WORDINDEX2INFO(61) 00225 cp50221_decoder_offsets, 00226 cp50221_decoder_infos, 00227 00228 #define cp50221_encoder_infos WORDINDEX2INFO(63) 00229 FUNso, UNDEF, 00230 INVALID, iso2022jp_encoder_90_A1toFE, 00231 00232 #define cp50221_encoder WORDINDEX2INFO(67) 00233 cp50221_encoder_offsets, 00234 cp50221_encoder_infos, 00235 00236 }; 00237 #define TRANSCODE_TABLE_INFO iso2022_byte_array, 1245, iso2022_word_array, 69, ((int)sizeof(unsigned int)) 00238 00239 00240 #define G0_ASCII 0 00241 /* ignore JIS X 0201 latin */ 00242 #define G0_JISX0208_1978 1 00243 #define G0_JISX0208_1983 2 00244 #define G0_JISX0201_KATAKANA 3 00245 00246 #define EMACS_MULE_LEADING_CODE_JISX0208_1978 0220 00247 #define EMACS_MULE_LEADING_CODE_JISX0208_1983 0222 00248 00249 static int 00250 iso2022jp_init(void *statep) 00251 { 00252 unsigned char *sp = statep; 00253 *sp = G0_ASCII; 00254 return 0; 00255 } 00256 00257 static VALUE 00258 fun_si_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l) 00259 { 00260 unsigned char *sp = statep; 00261 if (*sp == G0_ASCII) 00262 return (VALUE)NOMAP; 00263 else if (0x21 <= s[0] && s[0] <= 0x7e) 00264 return (VALUE)iso2022jp_decoder_jisx0208_rest; 00265 else 00266 return (VALUE)INVALID; 00267 } 00268 00269 static ssize_t 00270 fun_so_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l, unsigned char* o, size_t osize) 00271 { 00272 unsigned char *sp = statep; 00273 if (s[0] == 0x1b) { 00274 if (s[1] == '(') { 00275 switch (s[l-1]) { 00276 case 'B': 00277 case 'J': 00278 *sp = G0_ASCII; 00279 break; 00280 } 00281 } 00282 else { 00283 switch (s[l-1]) { 00284 case '@': 00285 *sp = G0_JISX0208_1978; 00286 break; 00287 00288 case 'B': 00289 *sp = G0_JISX0208_1983; 00290 break; 00291 } 00292 } 00293 return 0; 00294 } 00295 else { 00296 if (*sp == G0_JISX0208_1978) 00297 o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1978; 00298 else 00299 o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1983; 00300 o[1] = s[0] | 0x80; 00301 o[2] = s[1] | 0x80; 00302 return 3; 00303 } 00304 } 00305 00306 static const rb_transcoder 00307 rb_iso2022jp_decoder = { 00308 "ISO-2022-JP", "stateless-ISO-2022-JP", iso2022jp_decoder, 00309 TRANSCODE_TABLE_INFO, 00310 1, /* input_unit_length */ 00311 3, /* max_input */ 00312 3, /* max_output */ 00313 asciicompat_decoder, /* asciicompat_type */ 00314 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 00315 NULL, fun_si_iso2022jp_decoder, NULL, fun_so_iso2022jp_decoder 00316 }; 00317 00318 static ssize_t 00319 fun_so_iso2022jp_encoder(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) 00320 { 00321 unsigned char *sp = statep; 00322 unsigned char *output0 = o; 00323 int newstate; 00324 00325 if (l == 1) 00326 newstate = G0_ASCII; 00327 else if (s[0] == EMACS_MULE_LEADING_CODE_JISX0208_1978) 00328 newstate = G0_JISX0208_1978; 00329 else 00330 newstate = G0_JISX0208_1983; 00331 00332 if (*sp != newstate) { 00333 if (newstate == G0_ASCII) { 00334 *o++ = 0x1b; 00335 *o++ = '('; 00336 *o++ = 'B'; 00337 } 00338 else if (newstate == G0_JISX0208_1978) { 00339 *o++ = 0x1b; 00340 *o++ = '$'; 00341 *o++ = '@'; 00342 } 00343 else { 00344 *o++ = 0x1b; 00345 *o++ = '$'; 00346 *o++ = 'B'; 00347 } 00348 *sp = newstate; 00349 } 00350 00351 if (l == 1) { 00352 *o++ = s[0] & 0x7f; 00353 } 00354 else { 00355 *o++ = s[1] & 0x7f; 00356 *o++ = s[2] & 0x7f; 00357 } 00358 00359 return o - output0; 00360 } 00361 00362 static ssize_t 00363 iso2022jp_encoder_reset_sequence_size(void *statep) 00364 { 00365 unsigned char *sp = statep; 00366 if (*sp != G0_ASCII) 00367 return 3; 00368 return 0; 00369 } 00370 00371 static ssize_t 00372 finish_iso2022jp_encoder(void *statep, unsigned char *o, size_t osize) 00373 { 00374 unsigned char *sp = statep; 00375 unsigned char *output0 = o; 00376 00377 if (*sp == G0_ASCII) 00378 return 0; 00379 00380 *o++ = 0x1b; 00381 *o++ = '('; 00382 *o++ = 'B'; 00383 *sp = G0_ASCII; 00384 00385 return o - output0; 00386 } 00387 00388 static const rb_transcoder 00389 rb_iso2022jp_encoder = { 00390 "stateless-ISO-2022-JP", "ISO-2022-JP", iso2022jp_encoder, 00391 TRANSCODE_TABLE_INFO, 00392 1, /* input_unit_length */ 00393 3, /* max_input */ 00394 5, /* max_output */ 00395 asciicompat_encoder, /* asciicompat_type */ 00396 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 00397 NULL, NULL, NULL, fun_so_iso2022jp_encoder, 00398 finish_iso2022jp_encoder, 00399 iso2022jp_encoder_reset_sequence_size, finish_iso2022jp_encoder 00400 }; 00401 00402 static ssize_t 00403 fun_so_stateless_iso2022jp_to_eucjp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) 00404 { 00405 o[0] = s[1]; 00406 o[1] = s[2]; 00407 return 2; 00408 } 00409 00410 static const rb_transcoder 00411 rb_stateless_iso2022jp_to_eucjp = { 00412 "stateless-ISO-2022-JP", "EUC-JP", stateless_iso2022jp_to_eucjp, 00413 TRANSCODE_TABLE_INFO, 00414 1, /* input_unit_length */ 00415 3, /* max_input */ 00416 2, /* max_output */ 00417 asciicompat_converter, /* asciicompat_type */ 00418 0, NULL, NULL, /* state_size, state_init, state_fini */ 00419 NULL, NULL, NULL, fun_so_stateless_iso2022jp_to_eucjp, 00420 }; 00421 00422 static ssize_t 00423 fun_so_eucjp_to_stateless_iso2022jp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) 00424 { 00425 o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1983; 00426 o[1] = s[0]; 00427 o[2] = s[1]; 00428 return 3; 00429 } 00430 00431 static const rb_transcoder 00432 rb_eucjp_to_stateless_iso2022jp = { 00433 "EUC-JP", "stateless-ISO-2022-JP", eucjp_to_stateless_iso2022jp, 00434 TRANSCODE_TABLE_INFO, 00435 1, /* input_unit_length */ 00436 3, /* max_input */ 00437 3, /* max_output */ 00438 asciicompat_converter, /* asciicompat_type */ 00439 0, NULL, NULL, /* state_size, state_init, state_fini */ 00440 NULL, NULL, NULL, fun_so_eucjp_to_stateless_iso2022jp, 00441 }; 00442 00443 static VALUE 00444 fun_si_cp50221_decoder(void *statep, const unsigned char *s, size_t l) 00445 { 00446 unsigned char *sp = statep; 00447 int c; 00448 switch (*sp) { 00449 case G0_ASCII: 00450 if (0xA1 <= s[0] && s[0] <= 0xDF) 00451 return (VALUE)FUNso; 00452 return (VALUE)NOMAP; 00453 case G0_JISX0201_KATAKANA: 00454 c = s[0] & 0x7F; 00455 if (0x21 <= c && c <= 0x5f) 00456 return (VALUE)FUNso; 00457 break; 00458 case G0_JISX0208_1978: 00459 if ((0x21 <= s[0] && s[0] <= 0x28) || (0x30 <= s[0] && s[0] <= 0x74)) 00460 return (VALUE)iso2022jp_decoder_jisx0208_rest; 00461 break; 00462 case G0_JISX0208_1983: 00463 if ((0x21 <= s[0] && s[0] <= 0x28) || 00464 s[0] == 0x2D || 00465 (0x30 <= s[0] && s[0] <= 0x74) || 00466 (0x79 <= s[0] && s[0] <= 0x7C)) 00467 /* 0x7F <= s[0] && s[0] <= 0x92) */ 00468 return (VALUE)iso2022jp_decoder_jisx0208_rest; 00469 break; 00470 } 00471 return (VALUE)INVALID; 00472 } 00473 00474 static ssize_t 00475 fun_so_cp50221_decoder(void *statep, const unsigned char *s, size_t l, unsigned char* o, size_t osize) 00476 { 00477 unsigned char *sp = statep; 00478 switch (s[0]) { 00479 case 0x1b: 00480 if (s[1] == '(') { 00481 switch (s[l-1]) { 00482 case 'B': 00483 case 'J': 00484 *sp = G0_ASCII; 00485 break; 00486 case 'I': 00487 *sp = G0_JISX0201_KATAKANA; 00488 break; 00489 } 00490 } 00491 else { 00492 switch (s[l-1]) { 00493 case '@': 00494 *sp = G0_JISX0208_1978; 00495 break; 00496 case 'B': 00497 *sp = G0_JISX0208_1983; 00498 break; 00499 } 00500 } 00501 return 0; 00502 case 0x0E: 00503 *sp = G0_JISX0201_KATAKANA; 00504 return 0; 00505 case 0x0F: 00506 *sp = G0_ASCII; 00507 return 0; 00508 default: 00509 if (*sp == G0_JISX0201_KATAKANA || 00510 (0xA1 <= s[0] && s[0] <= 0xDF && *sp == G0_ASCII)) { 00511 o[0] = 0x8E; 00512 o[1] = s[0] | 0x80; 00513 } 00514 /* else if (0x7F == s[0] && s[0] <= 0x88) { */ 00515 /* User Defined Characters */ 00516 /* o[n++] = s[0] | 0xE0; */ 00517 /* o[n++] = s[1] | 0x80; */ 00518 /* else if (0x89 <= s[0] && s[0] <= 0x92) { */ 00519 /* User Defined Characters 2 */ 00520 /* o[n++] = 0x8f; */ 00521 /* o[n++] = s[0] + 0x6C; */ 00522 /* o[n++] = s[1] | 0x80; */ 00523 /* } */ 00524 else { 00525 /* JIS X 0208 */ 00526 /* NEC Special Characters */ 00527 /* NEC-selected IBM extended Characters */ 00528 o[0] = s[0] | 0x80; 00529 o[1] = s[1] | 0x80; 00530 } 00531 return 2; 00532 } 00533 } 00534 00535 static const rb_transcoder 00536 rb_cp50220_decoder = { 00537 "CP50220", "cp51932", cp50221_decoder, 00538 TRANSCODE_TABLE_INFO, 00539 1, /* input_unit_length */ 00540 3, /* max_input */ 00541 3, /* max_output */ 00542 asciicompat_decoder, /* asciicompat_type */ 00543 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 00544 NULL, fun_si_cp50221_decoder, NULL, fun_so_cp50221_decoder 00545 }; 00546 00547 static const rb_transcoder 00548 rb_cp50221_decoder = { 00549 "CP50221", "cp51932", cp50221_decoder, 00550 TRANSCODE_TABLE_INFO, 00551 1, /* input_unit_length */ 00552 3, /* max_input */ 00553 3, /* max_output */ 00554 asciicompat_decoder, /* asciicompat_type */ 00555 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 00556 NULL, fun_si_cp50221_decoder, NULL, fun_so_cp50221_decoder 00557 }; 00558 00559 static ssize_t 00560 fun_so_cp5022x_encoder(void *statep, const unsigned char *s, size_t l, 00561 unsigned char *o, size_t osize) 00562 { 00563 unsigned char *sp = statep; 00564 unsigned char *output0 = o; 00565 int newstate; 00566 00567 if (l == 1) 00568 newstate = G0_ASCII; 00569 else if (s[0] == 0x8E) { 00570 s++; 00571 l = 1; 00572 newstate = G0_JISX0201_KATAKANA; 00573 } 00574 else 00575 newstate = G0_JISX0208_1983; 00576 00577 if (*sp != newstate) { 00578 if (newstate == G0_ASCII) { 00579 *o++ = 0x1b; 00580 *o++ = '('; 00581 *o++ = 'B'; 00582 } 00583 else if (newstate == G0_JISX0201_KATAKANA) { 00584 *o++ = 0x1b; 00585 *o++ = '('; 00586 *o++ = 'I'; 00587 } 00588 else { 00589 *o++ = 0x1b; 00590 *o++ = '$'; 00591 *o++ = 'B'; 00592 } 00593 *sp = newstate; 00594 } 00595 00596 if (l == 1) { 00597 *o++ = s[0] & 0x7f; 00598 } 00599 else { 00600 *o++ = s[0] & 0x7f; 00601 *o++ = s[1] & 0x7f; 00602 } 00603 00604 return o - output0; 00605 } 00606 00607 static const rb_transcoder 00608 rb_cp50221_encoder = { 00609 "CP51932", "CP50221", cp50221_encoder, 00610 TRANSCODE_TABLE_INFO, 00611 1, /* input_unit_length */ 00612 3, /* max_input */ 00613 5, /* max_output */ 00614 asciicompat_encoder, /* asciicompat_type */ 00615 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 00616 NULL, NULL, NULL, fun_so_cp5022x_encoder, 00617 finish_iso2022jp_encoder, 00618 iso2022jp_encoder_reset_sequence_size, finish_iso2022jp_encoder 00619 }; 00620 00621 static const char *tbl0208 = 00622 "\x21\x23\x21\x56\x21\x57\x21\x22\x21\x26\x25\x72\x25\x21\x25\x23" \ 00623 "\x25\x25\x25\x27\x25\x29\x25\x63\x25\x65\x25\x67\x25\x43\x21\x3C" \ 00624 "\x25\x22\x25\x24\x25\x26\x25\x28\x25\x2A\x25\x2B\x25\x2D\x25\x2F" \ 00625 "\x25\x31\x25\x33\x25\x35\x25\x37\x25\x39\x25\x3B\x25\x3D\x25\x3F" \ 00626 "\x25\x41\x25\x44\x25\x46\x25\x48\x25\x4A\x25\x4B\x25\x4C\x25\x4D" \ 00627 "\x25\x4E\x25\x4F\x25\x52\x25\x55\x25\x58\x25\x5B\x25\x5E\x25\x5F" \ 00628 "\x25\x60\x25\x61\x25\x62\x25\x64\x25\x66\x25\x68\x25\x69\x25\x6A" \ 00629 "\x25\x6B\x25\x6C\x25\x6D\x25\x6F\x25\x73\x21\x2B\x21\x2C"; 00630 00631 static ssize_t 00632 fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, 00633 unsigned char *o, size_t osize) 00634 { 00635 unsigned char *output0 = o; 00636 unsigned char *sp = statep; 00637 00638 if (sp[0] == G0_JISX0201_KATAKANA) { 00639 int c = sp[2] & 0x7F; 00640 const char *p = tbl0208 + (c - 0x21) * 2; 00641 if (sp[1] != G0_JISX0208_1983) { 00642 *o++ = 0x1b; 00643 *o++ = '$'; 00644 *o++ = 'B'; 00645 } 00646 sp[0] = G0_JISX0208_1983; 00647 *o++ = *p++; 00648 if (l == 2 && s[0] == 0x8E) { 00649 if (s[1] == 0xDE) { 00650 *o++ = *p + 1; 00651 return o - output0; 00652 } 00653 else if (s[1] == 0xDF && (0x4A <= c && c <= 0x4E)) { 00654 *o++ = *p + 2; 00655 return o - output0; 00656 } 00657 } 00658 *o++ = *p; 00659 } 00660 00661 if (l == 2 && s[0] == 0x8E) { 00662 const char *p = tbl0208 + (s[1] - 0xA1) * 2; 00663 if ((0xA1 <= s[1] && s[1] <= 0xB5) || 00664 (0xC5 <= s[1] && s[1] <= 0xC9) || 00665 (0xCF <= s[1] && s[1] <= 0xDF)) { 00666 if (*sp != G0_JISX0208_1983) { 00667 *o++ = 0x1b; 00668 *o++ = '$'; 00669 *o++ = 'B'; 00670 *sp = G0_JISX0208_1983; 00671 } 00672 *o++ = *p++; 00673 *o++ = *p; 00674 return o - output0; 00675 } 00676 00677 sp[2] = s[1]; 00678 sp[1] = sp[0]; 00679 sp[0] = G0_JISX0201_KATAKANA; 00680 return o - output0; 00681 } 00682 00683 o += fun_so_cp5022x_encoder(statep, s, l, o, osize); 00684 return o - output0; 00685 } 00686 00687 static ssize_t 00688 finish_cp50220_encoder(void *statep, unsigned char *o, size_t osize) 00689 { 00690 unsigned char *sp = statep; 00691 unsigned char *output0 = o; 00692 00693 if (*sp == G0_ASCII) 00694 return 0; 00695 00696 if (sp[0] == G0_JISX0201_KATAKANA) { 00697 int c = sp[2] & 0x7F; 00698 const char *p = tbl0208 + (c - 0x21) * 2; 00699 if (sp[1] != G0_JISX0208_1983) { 00700 *o++ = 0x1b; 00701 *o++ = '$'; 00702 *o++ = 'B'; 00703 } 00704 sp[0] = G0_JISX0208_1983; 00705 *o++ = *p++; 00706 *o++ = *p; 00707 } 00708 00709 *o++ = 0x1b; 00710 *o++ = '('; 00711 *o++ = 'B'; 00712 *sp = G0_ASCII; 00713 00714 return o - output0; 00715 } 00716 00717 static const rb_transcoder 00718 rb_cp50220_encoder = { 00719 "CP51932", "CP50220", cp50221_encoder, 00720 TRANSCODE_TABLE_INFO, 00721 1, /* input_unit_length */ 00722 3, /* max_input */ 00723 5, /* max_output */ 00724 asciicompat_encoder, /* asciicompat_type */ 00725 3, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 00726 NULL, NULL, NULL, fun_so_cp50220_encoder, 00727 finish_cp50220_encoder, 00728 iso2022jp_encoder_reset_sequence_size, finish_cp50220_encoder 00729 }; 00730 00731 void 00732 Init_iso2022(void) 00733 { 00734 rb_register_transcoder(&rb_iso2022jp_decoder); 00735 rb_register_transcoder(&rb_iso2022jp_encoder); 00736 rb_register_transcoder(&rb_stateless_iso2022jp_to_eucjp); 00737 rb_register_transcoder(&rb_eucjp_to_stateless_iso2022jp); 00738 rb_register_transcoder(&rb_cp50220_decoder); 00739 rb_register_transcoder(&rb_cp50221_decoder); 00740 rb_register_transcoder(&rb_cp50220_encoder); 00741 rb_register_transcoder(&rb_cp50221_encoder); 00742 } 00743 00744 00745