00001
00002
00003
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
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,
00311 3,
00312 3,
00313 asciicompat_decoder,
00314 1, iso2022jp_init, iso2022jp_init,
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,
00393 3,
00394 5,
00395 asciicompat_encoder,
00396 1, iso2022jp_init, iso2022jp_init,
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,
00415 3,
00416 2,
00417 asciicompat_converter,
00418 0, NULL, NULL,
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,
00436 3,
00437 3,
00438 asciicompat_converter,
00439 0, NULL, NULL,
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
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
00515
00516
00517
00518
00519
00520
00521
00522
00523
00524 else {
00525
00526
00527
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,
00540 3,
00541 3,
00542 asciicompat_decoder,
00543 1, iso2022jp_init, iso2022jp_init,
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,
00552 3,
00553 3,
00554 asciicompat_decoder,
00555 1, iso2022jp_init, iso2022jp_init,
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,
00612 3,
00613 5,
00614 asciicompat_encoder,
00615 1, iso2022jp_init, iso2022jp_init,
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,
00722 3,
00723 5,
00724 asciicompat_encoder,
00725 3, iso2022jp_init, iso2022jp_init,
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