• Main Page
  • Modules
  • Data Structures
  • Files
  • File List
  • Globals

enc/trans/iso2022.c

Go to the documentation of this file.
00001 /* autogenerated. */
00002 /* src="transcode-tblgen.rb", len=27499, checksum=52340 */
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 

Generated on Sat Jul 7 2012 15:28:17 for Ruby by  doxygen 1.7.1