1/* autogenerated. */ 2/* src="transcode-tblgen.rb", len=28460, checksum=51276 */ 3/* src="iso2022.trans", len=15902, checksum=37507 */ 4 5#include "transcode_data.h" 6 7 8 9static const unsigned char 10iso2022_byte_array[1245] = { 11#define iso2022jp_decoder_1B_24_offsets 0 1264, 66, 13 1, 0, 1, 14 15#define iso2022jp_decoder_1B_28_offsets 5 1666, 74, 17 1, 0, 0, 0, 0, 0, 0, 0, 1, 18 19#define iso2022jp_decoder_1B_offsets 16 2036, 40, 21 1, 0, 0, 0, 2, 22 23#define iso2022jp_decoder_offsets 23 240, 127, 25 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 26 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 27 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 28 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 29 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 30 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 31 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 32 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 33 34#define iso2022jp_decoder_jisx0208_rest_offsets 153 3533, 126, 36 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 37 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 38 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 39 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 40 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 41 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 42 43#define iso2022jp_encoder_90_A1toFE_offsets 249 44161, 254, 45 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 46 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 47 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 48 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 49 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 50 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 51 52#define iso2022jp_encoder_offsets 345 530, 146, 54 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 55 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 56 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 57 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 58 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 59 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 60 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 61 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 62 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 63 2, 1, 2, 64 65#define eucjp_to_stateless_iso2022jp_offsets 494 660, 254, 67 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 68 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 69 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 70 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 71 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 72 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 73 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 74 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 75 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 4, 76 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 77 2, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 78 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 79 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 80 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 81 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 82 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 5, 83 84#define cp50221_decoder_1B_28_offsets 751 8566, 74, 86 1, 0, 0, 0, 0, 0, 0, 1, 1, 87 88#define cp50221_decoder_offsets 762 890, 223, 90 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 91 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2, 0, 0, 0, 0, 92 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 93 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 94 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 95 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 96 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 97 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 98 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 99 0, 0, 0, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 100 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 101 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 102 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 103 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 104 105#define cp50221_encoder_offsets 988 1060, 254, 107 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 1, 108 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 109 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 110 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 111 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 112 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 113 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 114 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 115 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 3, 2, 116 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 117 2, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 118 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 119 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 120 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 121 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 122 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 3, 123 124}; 125static const unsigned int 126iso2022_word_array[69] = { 127#define iso2022jp_decoder_1B_24_infos WORDINDEX2INFO(0) 128 INVALID, FUNso, 129 130#define iso2022jp_decoder_1B_24 WORDINDEX2INFO(2) 131 iso2022jp_decoder_1B_24_offsets, 132 iso2022jp_decoder_1B_24_infos, 133 134#define iso2022jp_decoder_1B_28 WORDINDEX2INFO(4) 135 iso2022jp_decoder_1B_28_offsets, 136 iso2022jp_decoder_1B_24_infos, 137 138#define iso2022jp_decoder_1B_infos WORDINDEX2INFO(6) 139 INVALID, iso2022jp_decoder_1B_24, 140 iso2022jp_decoder_1B_28, 141 142#define iso2022jp_decoder_1B WORDINDEX2INFO(9) 143 iso2022jp_decoder_1B_offsets, 144 iso2022jp_decoder_1B_infos, 145 146#define iso2022jp_decoder_infos WORDINDEX2INFO(11) 147 FUNsi, INVALID, 148 iso2022jp_decoder_1B, 149 150#define iso2022jp_decoder WORDINDEX2INFO(14) 151 iso2022jp_decoder_offsets, 152 iso2022jp_decoder_infos, 153 154#define iso2022jp_decoder_jisx0208_rest WORDINDEX2INFO(16) 155 iso2022jp_decoder_jisx0208_rest_offsets, 156 iso2022jp_decoder_1B_24_infos, 157 158#define iso2022jp_encoder_90_A1toFE WORDINDEX2INFO(18) 159 iso2022jp_encoder_90_A1toFE_offsets, 160 iso2022jp_decoder_1B_24_infos, 161 162#define iso2022jp_encoder_90_infos WORDINDEX2INFO(20) 163 INVALID, iso2022jp_encoder_90_A1toFE, 164 165#define iso2022jp_encoder_90 WORDINDEX2INFO(22) 166 iso2022jp_encoder_90_A1toFE_offsets, 167 iso2022jp_encoder_90_infos, 168 169#define iso2022jp_encoder_infos WORDINDEX2INFO(24) 170 FUNso, INVALID, 171 iso2022jp_encoder_90, 172 173#define iso2022jp_encoder WORDINDEX2INFO(27) 174 iso2022jp_encoder_offsets, 175 iso2022jp_encoder_infos, 176 177#define stateless_iso2022jp_to_eucjp_infos WORDINDEX2INFO(29) 178 NOMAP, INVALID, 179 iso2022jp_encoder_90, 180 181#define stateless_iso2022jp_to_eucjp WORDINDEX2INFO(32) 182 iso2022jp_encoder_offsets, 183 stateless_iso2022jp_to_eucjp_infos, 184 185#define eucjp_to_stateless_iso2022jp_8E_infos WORDINDEX2INFO(34) 186 INVALID, UNDEF, 187 188#define eucjp_to_stateless_iso2022jp_8E WORDINDEX2INFO(36) 189 iso2022jp_encoder_90_A1toFE_offsets, 190 eucjp_to_stateless_iso2022jp_8E_infos, 191 192#define eucjp_to_stateless_iso2022jp_8F_infos WORDINDEX2INFO(38) 193 INVALID, eucjp_to_stateless_iso2022jp_8E, 194 195#define eucjp_to_stateless_iso2022jp_8F WORDINDEX2INFO(40) 196 iso2022jp_encoder_90_A1toFE_offsets, 197 eucjp_to_stateless_iso2022jp_8F_infos, 198 199#define eucjp_to_stateless_iso2022jp_infos WORDINDEX2INFO(42) 200 NOMAP, UNDEF, 201 INVALID, eucjp_to_stateless_iso2022jp_8E, 202 eucjp_to_stateless_iso2022jp_8F, iso2022jp_encoder_90_A1toFE, 203 204#define eucjp_to_stateless_iso2022jp WORDINDEX2INFO(48) 205 eucjp_to_stateless_iso2022jp_offsets, 206 eucjp_to_stateless_iso2022jp_infos, 207 208#define cp50221_decoder_1B_28 WORDINDEX2INFO(50) 209 cp50221_decoder_1B_28_offsets, 210 iso2022jp_decoder_1B_24_infos, 211 212#define cp50221_decoder_1B_infos WORDINDEX2INFO(52) 213 INVALID, iso2022jp_decoder_1B_24, 214 cp50221_decoder_1B_28, 215 216#define cp50221_decoder_1B WORDINDEX2INFO(55) 217 iso2022jp_decoder_1B_offsets, 218 cp50221_decoder_1B_infos, 219 220#define cp50221_decoder_infos WORDINDEX2INFO(57) 221 FUNsi, FUNso, 222 cp50221_decoder_1B, INVALID, 223 224#define cp50221_decoder WORDINDEX2INFO(61) 225 cp50221_decoder_offsets, 226 cp50221_decoder_infos, 227 228#define cp50221_encoder_infos WORDINDEX2INFO(63) 229 FUNso, UNDEF, 230 INVALID, iso2022jp_encoder_90_A1toFE, 231 232#define cp50221_encoder WORDINDEX2INFO(67) 233 cp50221_encoder_offsets, 234 cp50221_encoder_infos, 235 236}; 237#define TRANSCODE_TABLE_INFO iso2022_byte_array, 1245, iso2022_word_array, 69, ((int)sizeof(unsigned int)) 238 239 240#define G0_ASCII 0 241/* ignore JIS X 0201 latin */ 242#define G0_JISX0208_1978 1 243#define G0_JISX0208_1983 2 244#define G0_JISX0201_KATAKANA 3 245 246#define EMACS_MULE_LEADING_CODE_JISX0208_1978 0220 247#define EMACS_MULE_LEADING_CODE_JISX0208_1983 0222 248 249static int 250iso2022jp_init(void *statep) 251{ 252 unsigned char *sp = statep; 253 *sp = G0_ASCII; 254 return 0; 255} 256 257static VALUE 258fun_si_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l) 259{ 260 unsigned char *sp = statep; 261 if (*sp == G0_ASCII) 262 return (VALUE)NOMAP; 263 else if (0x21 <= s[0] && s[0] <= 0x7e) 264 return (VALUE)iso2022jp_decoder_jisx0208_rest; 265 else 266 return (VALUE)INVALID; 267} 268 269static ssize_t 270fun_so_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l, unsigned char* o, size_t osize) 271{ 272 unsigned char *sp = statep; 273 if (s[0] == 0x1b) { 274 if (s[1] == '(') { 275 switch (s[l-1]) { 276 case 'B': 277 case 'J': 278 *sp = G0_ASCII; 279 break; 280 } 281 } 282 else { 283 switch (s[l-1]) { 284 case '@': 285 *sp = G0_JISX0208_1978; 286 break; 287 288 case 'B': 289 *sp = G0_JISX0208_1983; 290 break; 291 } 292 } 293 return 0; 294 } 295 else { 296 if (*sp == G0_JISX0208_1978) 297 o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1978; 298 else 299 o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1983; 300 o[1] = s[0] | 0x80; 301 o[2] = s[1] | 0x80; 302 return 3; 303 } 304} 305 306static const rb_transcoder 307rb_iso2022jp_decoder = { 308 "ISO-2022-JP", "stateless-ISO-2022-JP", iso2022jp_decoder, 309 TRANSCODE_TABLE_INFO, 310 1, /* input_unit_length */ 311 3, /* max_input */ 312 3, /* max_output */ 313 asciicompat_decoder, /* asciicompat_type */ 314 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 315 NULL, fun_si_iso2022jp_decoder, NULL, fun_so_iso2022jp_decoder 316}; 317 318static ssize_t 319fun_so_iso2022jp_encoder(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) 320{ 321 unsigned char *sp = statep; 322 unsigned char *output0 = o; 323 int newstate; 324 325 if (l == 1) 326 newstate = G0_ASCII; 327 else if (s[0] == EMACS_MULE_LEADING_CODE_JISX0208_1978) 328 newstate = G0_JISX0208_1978; 329 else 330 newstate = G0_JISX0208_1983; 331 332 if (*sp != newstate) { 333 if (newstate == G0_ASCII) { 334 *o++ = 0x1b; 335 *o++ = '('; 336 *o++ = 'B'; 337 } 338 else if (newstate == G0_JISX0208_1978) { 339 *o++ = 0x1b; 340 *o++ = '$'; 341 *o++ = '@'; 342 } 343 else { 344 *o++ = 0x1b; 345 *o++ = '$'; 346 *o++ = 'B'; 347 } 348 *sp = newstate; 349 } 350 351 if (l == 1) { 352 *o++ = s[0] & 0x7f; 353 } 354 else { 355 *o++ = s[1] & 0x7f; 356 *o++ = s[2] & 0x7f; 357 } 358 359 return o - output0; 360} 361 362static ssize_t 363iso2022jp_encoder_reset_sequence_size(void *statep) 364{ 365 unsigned char *sp = statep; 366 if (*sp != G0_ASCII) 367 return 3; 368 return 0; 369} 370 371static ssize_t 372finish_iso2022jp_encoder(void *statep, unsigned char *o, size_t osize) 373{ 374 unsigned char *sp = statep; 375 unsigned char *output0 = o; 376 377 if (*sp == G0_ASCII) 378 return 0; 379 380 *o++ = 0x1b; 381 *o++ = '('; 382 *o++ = 'B'; 383 *sp = G0_ASCII; 384 385 return o - output0; 386} 387 388static const rb_transcoder 389rb_iso2022jp_encoder = { 390 "stateless-ISO-2022-JP", "ISO-2022-JP", iso2022jp_encoder, 391 TRANSCODE_TABLE_INFO, 392 1, /* input_unit_length */ 393 3, /* max_input */ 394 5, /* max_output */ 395 asciicompat_encoder, /* asciicompat_type */ 396 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 397 NULL, NULL, NULL, fun_so_iso2022jp_encoder, 398 finish_iso2022jp_encoder, 399 iso2022jp_encoder_reset_sequence_size, finish_iso2022jp_encoder 400}; 401 402static ssize_t 403fun_so_stateless_iso2022jp_to_eucjp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) 404{ 405 o[0] = s[1]; 406 o[1] = s[2]; 407 return 2; 408} 409 410static const rb_transcoder 411rb_stateless_iso2022jp_to_eucjp = { 412 "stateless-ISO-2022-JP", "EUC-JP", stateless_iso2022jp_to_eucjp, 413 TRANSCODE_TABLE_INFO, 414 1, /* input_unit_length */ 415 3, /* max_input */ 416 2, /* max_output */ 417 asciicompat_converter, /* asciicompat_type */ 418 0, NULL, NULL, /* state_size, state_init, state_fini */ 419 NULL, NULL, NULL, fun_so_stateless_iso2022jp_to_eucjp, 420}; 421 422static ssize_t 423fun_so_eucjp_to_stateless_iso2022jp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) 424{ 425 o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1983; 426 o[1] = s[0]; 427 o[2] = s[1]; 428 return 3; 429} 430 431static const rb_transcoder 432rb_eucjp_to_stateless_iso2022jp = { 433 "EUC-JP", "stateless-ISO-2022-JP", eucjp_to_stateless_iso2022jp, 434 TRANSCODE_TABLE_INFO, 435 1, /* input_unit_length */ 436 3, /* max_input */ 437 3, /* max_output */ 438 asciicompat_converter, /* asciicompat_type */ 439 0, NULL, NULL, /* state_size, state_init, state_fini */ 440 NULL, NULL, NULL, fun_so_eucjp_to_stateless_iso2022jp, 441}; 442 443static VALUE 444fun_si_cp50221_decoder(void *statep, const unsigned char *s, size_t l) 445{ 446 unsigned char *sp = statep; 447 int c; 448 switch (*sp) { 449 case G0_ASCII: 450 if (0xA1 <= s[0] && s[0] <= 0xDF) 451 return (VALUE)FUNso; 452 return (VALUE)NOMAP; 453 case G0_JISX0201_KATAKANA: 454 c = s[0] & 0x7F; 455 if (0x21 <= c && c <= 0x5f) 456 return (VALUE)FUNso; 457 break; 458 case G0_JISX0208_1978: 459 if ((0x21 <= s[0] && s[0] <= 0x28) || (0x30 <= s[0] && s[0] <= 0x74)) 460 return (VALUE)iso2022jp_decoder_jisx0208_rest; 461 break; 462 case G0_JISX0208_1983: 463 if ((0x21 <= s[0] && s[0] <= 0x28) || 464 s[0] == 0x2D || 465 (0x30 <= s[0] && s[0] <= 0x74) || 466 (0x79 <= s[0] && s[0] <= 0x7C)) 467 /* 0x7F <= s[0] && s[0] <= 0x92) */ 468 return (VALUE)iso2022jp_decoder_jisx0208_rest; 469 break; 470 } 471 return (VALUE)INVALID; 472} 473 474static ssize_t 475fun_so_cp50221_decoder(void *statep, const unsigned char *s, size_t l, unsigned char* o, size_t osize) 476{ 477 unsigned char *sp = statep; 478 switch (s[0]) { 479 case 0x1b: 480 if (s[1] == '(') { 481 switch (s[l-1]) { 482 case 'B': 483 case 'J': 484 *sp = G0_ASCII; 485 break; 486 case 'I': 487 *sp = G0_JISX0201_KATAKANA; 488 break; 489 } 490 } 491 else { 492 switch (s[l-1]) { 493 case '@': 494 *sp = G0_JISX0208_1978; 495 break; 496 case 'B': 497 *sp = G0_JISX0208_1983; 498 break; 499 } 500 } 501 return 0; 502 case 0x0E: 503 *sp = G0_JISX0201_KATAKANA; 504 return 0; 505 case 0x0F: 506 *sp = G0_ASCII; 507 return 0; 508 default: 509 if (*sp == G0_JISX0201_KATAKANA || 510 (0xA1 <= s[0] && s[0] <= 0xDF && *sp == G0_ASCII)) { 511 o[0] = 0x8E; 512 o[1] = s[0] | 0x80; 513 } 514 /* else if (0x7F == s[0] && s[0] <= 0x88) { */ 515 /* User Defined Characters */ 516 /* o[n++] = s[0] | 0xE0; */ 517 /* o[n++] = s[1] | 0x80; */ 518 /* else if (0x89 <= s[0] && s[0] <= 0x92) { */ 519 /* User Defined Characters 2 */ 520 /* o[n++] = 0x8f; */ 521 /* o[n++] = s[0] + 0x6C; */ 522 /* o[n++] = s[1] | 0x80; */ 523 /* } */ 524 else { 525 /* JIS X 0208 */ 526 /* NEC Special Characters */ 527 /* NEC-selected IBM extended Characters */ 528 o[0] = s[0] | 0x80; 529 o[1] = s[1] | 0x80; 530 } 531 return 2; 532 } 533} 534 535static const rb_transcoder 536rb_cp50220_decoder = { 537 "CP50220", "cp51932", cp50221_decoder, 538 TRANSCODE_TABLE_INFO, 539 1, /* input_unit_length */ 540 3, /* max_input */ 541 3, /* max_output */ 542 asciicompat_decoder, /* asciicompat_type */ 543 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 544 NULL, fun_si_cp50221_decoder, NULL, fun_so_cp50221_decoder 545}; 546 547static const rb_transcoder 548rb_cp50221_decoder = { 549 "CP50221", "cp51932", cp50221_decoder, 550 TRANSCODE_TABLE_INFO, 551 1, /* input_unit_length */ 552 3, /* max_input */ 553 3, /* max_output */ 554 asciicompat_decoder, /* asciicompat_type */ 555 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 556 NULL, fun_si_cp50221_decoder, NULL, fun_so_cp50221_decoder 557}; 558 559static ssize_t 560fun_so_cp5022x_encoder(void *statep, const unsigned char *s, size_t l, 561 unsigned char *o, size_t osize) 562{ 563 unsigned char *sp = statep; 564 unsigned char *output0 = o; 565 int newstate; 566 567 if (l == 1) 568 newstate = G0_ASCII; 569 else if (s[0] == 0x8E) { 570 s++; 571 l = 1; 572 newstate = G0_JISX0201_KATAKANA; 573 } 574 else 575 newstate = G0_JISX0208_1983; 576 577 if (*sp != newstate) { 578 if (newstate == G0_ASCII) { 579 *o++ = 0x1b; 580 *o++ = '('; 581 *o++ = 'B'; 582 } 583 else if (newstate == G0_JISX0201_KATAKANA) { 584 *o++ = 0x1b; 585 *o++ = '('; 586 *o++ = 'I'; 587 } 588 else { 589 *o++ = 0x1b; 590 *o++ = '$'; 591 *o++ = 'B'; 592 } 593 *sp = newstate; 594 } 595 596 if (l == 1) { 597 *o++ = s[0] & 0x7f; 598 } 599 else { 600 *o++ = s[0] & 0x7f; 601 *o++ = s[1] & 0x7f; 602 } 603 604 return o - output0; 605} 606 607static const rb_transcoder 608rb_cp50221_encoder = { 609 "CP51932", "CP50221", cp50221_encoder, 610 TRANSCODE_TABLE_INFO, 611 1, /* input_unit_length */ 612 3, /* max_input */ 613 5, /* max_output */ 614 asciicompat_encoder, /* asciicompat_type */ 615 1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 616 NULL, NULL, NULL, fun_so_cp5022x_encoder, 617 finish_iso2022jp_encoder, 618 iso2022jp_encoder_reset_sequence_size, finish_iso2022jp_encoder 619}; 620 621static const char *tbl0208 = 622 "\x21\x23\x21\x56\x21\x57\x21\x22\x21\x26\x25\x72\x25\x21\x25\x23" \ 623 "\x25\x25\x25\x27\x25\x29\x25\x63\x25\x65\x25\x67\x25\x43\x21\x3C" \ 624 "\x25\x22\x25\x24\x25\x26\x25\x28\x25\x2A\x25\x2B\x25\x2D\x25\x2F" \ 625 "\x25\x31\x25\x33\x25\x35\x25\x37\x25\x39\x25\x3B\x25\x3D\x25\x3F" \ 626 "\x25\x41\x25\x44\x25\x46\x25\x48\x25\x4A\x25\x4B\x25\x4C\x25\x4D" \ 627 "\x25\x4E\x25\x4F\x25\x52\x25\x55\x25\x58\x25\x5B\x25\x5E\x25\x5F" \ 628 "\x25\x60\x25\x61\x25\x62\x25\x64\x25\x66\x25\x68\x25\x69\x25\x6A" \ 629 "\x25\x6B\x25\x6C\x25\x6D\x25\x6F\x25\x73\x21\x2B\x21\x2C"; 630 631static ssize_t 632fun_so_cp50220_encoder(void *statep, const unsigned char *s, size_t l, 633 unsigned char *o, size_t osize) 634{ 635 unsigned char *output0 = o; 636 unsigned char *sp = statep; 637 638 if (sp[0] == G0_JISX0201_KATAKANA) { 639 int c = sp[2] & 0x7F; 640 const char *p = tbl0208 + (c - 0x21) * 2; 641 if (sp[1] != G0_JISX0208_1983) { 642 *o++ = 0x1b; 643 *o++ = '$'; 644 *o++ = 'B'; 645 } 646 sp[0] = G0_JISX0208_1983; 647 *o++ = *p++; 648 if (l == 2 && s[0] == 0x8E) { 649 if (s[1] == 0xDE) { 650 *o++ = *p + 1; 651 return o - output0; 652 } 653 else if (s[1] == 0xDF && (0x4A <= c && c <= 0x4E)) { 654 *o++ = *p + 2; 655 return o - output0; 656 } 657 } 658 *o++ = *p; 659 } 660 661 if (l == 2 && s[0] == 0x8E) { 662 const char *p = tbl0208 + (s[1] - 0xA1) * 2; 663 if ((0xA1 <= s[1] && s[1] <= 0xB5) || 664 (0xC5 <= s[1] && s[1] <= 0xC9) || 665 (0xCF <= s[1] && s[1] <= 0xDF)) { 666 if (*sp != G0_JISX0208_1983) { 667 *o++ = 0x1b; 668 *o++ = '$'; 669 *o++ = 'B'; 670 *sp = G0_JISX0208_1983; 671 } 672 *o++ = *p++; 673 *o++ = *p; 674 return o - output0; 675 } 676 677 sp[2] = s[1]; 678 sp[1] = sp[0]; 679 sp[0] = G0_JISX0201_KATAKANA; 680 return o - output0; 681 } 682 683 o += fun_so_cp5022x_encoder(statep, s, l, o, osize); 684 return o - output0; 685} 686 687static ssize_t 688finish_cp50220_encoder(void *statep, unsigned char *o, size_t osize) 689{ 690 unsigned char *sp = statep; 691 unsigned char *output0 = o; 692 693 if (*sp == G0_ASCII) 694 return 0; 695 696 if (sp[0] == G0_JISX0201_KATAKANA) { 697 int c = sp[2] & 0x7F; 698 const char *p = tbl0208 + (c - 0x21) * 2; 699 if (sp[1] != G0_JISX0208_1983) { 700 *o++ = 0x1b; 701 *o++ = '$'; 702 *o++ = 'B'; 703 } 704 sp[0] = G0_JISX0208_1983; 705 *o++ = *p++; 706 *o++ = *p; 707 } 708 709 *o++ = 0x1b; 710 *o++ = '('; 711 *o++ = 'B'; 712 *sp = G0_ASCII; 713 714 return o - output0; 715} 716 717static const rb_transcoder 718rb_cp50220_encoder = { 719 "CP51932", "CP50220", cp50221_encoder, 720 TRANSCODE_TABLE_INFO, 721 1, /* input_unit_length */ 722 3, /* max_input */ 723 5, /* max_output */ 724 asciicompat_encoder, /* asciicompat_type */ 725 3, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */ 726 NULL, NULL, NULL, fun_so_cp50220_encoder, 727 finish_cp50220_encoder, 728 iso2022jp_encoder_reset_sequence_size, finish_cp50220_encoder 729}; 730 731TRANS_INIT(iso2022) 732{ 733 rb_register_transcoder(&rb_iso2022jp_decoder); 734 rb_register_transcoder(&rb_iso2022jp_encoder); 735 rb_register_transcoder(&rb_stateless_iso2022jp_to_eucjp); 736 rb_register_transcoder(&rb_eucjp_to_stateless_iso2022jp); 737 rb_register_transcoder(&rb_cp50220_decoder); 738 rb_register_transcoder(&rb_cp50221_decoder); 739 rb_register_transcoder(&rb_cp50220_encoder); 740 rb_register_transcoder(&rb_cp50221_encoder); 741} 742 743 744