/* autogenerated. */
/* src="transcode-tblgen.rb", len=20916, checksum=45137 */
/* src="iso2022.trans", len=6668, checksum=25414 */

#include "transcode_data.h"



static const unsigned char
iso2022_byte_array[751] = {
#define iso2022jp_decoder_1B_24_offsets 0
64, 66,
      1,  0,  1,

#define iso2022jp_decoder_1B_28_offsets 5
66, 74,
      1,  0,  0,  0,  0,  0,  0,  0,    1,

#define iso2022jp_decoder_1B_offsets 16
36, 40,
      1,  0,  0,  0,  2,

#define iso2022jp_decoder_offsets 23
0, 127,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  1,  1,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  2,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,

#define iso2022jp_decoder_jisx0208_rest_offsets 153
33, 126,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,

#define iso2022jp_encoder_90_A1_offsets 249
161, 254,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,

#define iso2022jp_encoder_offsets 345
0, 146,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  1,  1,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  1,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      1,  1,  1,  1,  1,  1,  1,  1,    1,  1,  1,  1,  1,  1,  1,  1,
      2,  1,  2,

#define eucjp_to_stateless_iso2022jp_offsets 494
0, 254,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  1,  1,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  1,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      0,  0,  0,  0,  0,  0,  0,  0,    0,  0,  0,  0,  0,  0,  0,  0,
      2,  2,  2,  2,  2,  2,  2,  2,    2,  2,  2,  2,  2,  2,  3,  4,
      2,  2,  2,  2,  2,  2,  2,  2,    2,  2,  2,  2,  2,  2,  2,  2,
      2,  5,  5,  5,  5,  5,  5,  5,    5,  5,  5,  5,  5,  5,  5,  5,
      5,  5,  5,  5,  5,  5,  5,  5,    5,  5,  5,  5,  5,  5,  5,  5,
      5,  5,  5,  5,  5,  5,  5,  5,    5,  5,  5,  5,  5,  5,  5,  5,
      5,  5,  5,  5,  5,  5,  5,  5,    5,  5,  5,  5,  5,  5,  5,  5,
      5,  5,  5,  5,  5,  5,  5,  5,    5,  5,  5,  5,  5,  5,  5,  5,
      5,  5,  5,  5,  5,  5,  5,  5,    5,  5,  5,  5,  5,  5,  5,

};
static const unsigned int
iso2022_word_array[50] = {
#define iso2022jp_decoder_1B_24_infos WORDINDEX2INFO(0)
     INVALID,   FUNso,

#define iso2022jp_decoder_1B_24 WORDINDEX2INFO(2)
    iso2022jp_decoder_1B_24_offsets,
    iso2022jp_decoder_1B_24_infos,

#define iso2022jp_decoder_1B_28 WORDINDEX2INFO(4)
    iso2022jp_decoder_1B_28_offsets,
    iso2022jp_decoder_1B_24_infos,

#define iso2022jp_decoder_1B_infos WORDINDEX2INFO(6)
                     INVALID, iso2022jp_decoder_1B_24,
     iso2022jp_decoder_1B_28,

#define iso2022jp_decoder_1B WORDINDEX2INFO(9)
    iso2022jp_decoder_1B_offsets,
    iso2022jp_decoder_1B_infos,

#define iso2022jp_decoder_infos WORDINDEX2INFO(11)
                    FUNsi,              INVALID,
     iso2022jp_decoder_1B,

#define iso2022jp_decoder WORDINDEX2INFO(14)
    iso2022jp_decoder_offsets,
    iso2022jp_decoder_infos,

#define iso2022jp_decoder_jisx0208_rest WORDINDEX2INFO(16)
    iso2022jp_decoder_jisx0208_rest_offsets,
    iso2022jp_decoder_1B_24_infos,

#define iso2022jp_encoder_90_A1 WORDINDEX2INFO(18)
    iso2022jp_encoder_90_A1_offsets,
    iso2022jp_decoder_1B_24_infos,

#define iso2022jp_encoder_90_infos WORDINDEX2INFO(20)
                     INVALID, iso2022jp_encoder_90_A1,

#define iso2022jp_encoder_90 WORDINDEX2INFO(22)
    iso2022jp_encoder_90_A1_offsets,
    iso2022jp_encoder_90_infos,

#define iso2022jp_encoder_infos WORDINDEX2INFO(24)
                    FUNso,              INVALID,
     iso2022jp_encoder_90,

#define iso2022jp_encoder WORDINDEX2INFO(27)
    iso2022jp_encoder_offsets,
    iso2022jp_encoder_infos,

#define stateless_iso2022jp_to_eucjp_infos WORDINDEX2INFO(29)
                    NOMAP,              INVALID,
     iso2022jp_encoder_90,

#define stateless_iso2022jp_to_eucjp WORDINDEX2INFO(32)
    iso2022jp_encoder_offsets,
    stateless_iso2022jp_to_eucjp_infos,

#define eucjp_to_stateless_iso2022jp_8E_infos WORDINDEX2INFO(34)
     INVALID,   UNDEF,

#define eucjp_to_stateless_iso2022jp_8E WORDINDEX2INFO(36)
    iso2022jp_encoder_90_A1_offsets,
    eucjp_to_stateless_iso2022jp_8E_infos,

#define eucjp_to_stateless_iso2022jp_8F_infos WORDINDEX2INFO(38)
                             INVALID, eucjp_to_stateless_iso2022jp_8E,

#define eucjp_to_stateless_iso2022jp_8F WORDINDEX2INFO(40)
    iso2022jp_encoder_90_A1_offsets,
    eucjp_to_stateless_iso2022jp_8F_infos,

#define eucjp_to_stateless_iso2022jp_infos WORDINDEX2INFO(42)
                               NOMAP,                           UNDEF,
                             INVALID, eucjp_to_stateless_iso2022jp_8E,
     eucjp_to_stateless_iso2022jp_8F,         iso2022jp_encoder_90_A1,

#define eucjp_to_stateless_iso2022jp WORDINDEX2INFO(48)
    eucjp_to_stateless_iso2022jp_offsets,
    eucjp_to_stateless_iso2022jp_infos,

};
#define TRANSCODE_TABLE_INFO iso2022_byte_array, 751, iso2022_word_array, 50, sizeof(unsigned int)


#define G0_ASCII 0
/* ignore JIS X 0201 latin */
#define G0_JISX0208_1978 1
#define G0_JISX0208_1983 2

#define EMACS_MULE_LEADING_CODE_JISX0208_1978   0220
#define EMACS_MULE_LEADING_CODE_JISX0208_1983   0222

static int
iso2022jp_init(void *statep)
{
    unsigned char *sp = statep;
    *sp = G0_ASCII;
    return 0;
}

static VALUE
fun_si_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l)
{
    unsigned char *sp = statep;
    if (*sp == G0_ASCII)
        return (VALUE)NOMAP;
    else if (0x21 <= s[0] && s[0] <= 0x7e)
        return (VALUE)iso2022jp_decoder_jisx0208_rest;
    else
        return (VALUE)INVALID;
}

static ssize_t
fun_so_iso2022jp_decoder(void *statep, const unsigned char *s, size_t l, unsigned char* o, size_t osize)
{
    unsigned char *sp = statep;
    if (s[0] == 0x1b) {
        if (s[1] == '(') {
            switch (s[l-1]) {
              case 'B':
              case 'J':
                *sp = G0_ASCII;
                break;
            }
        }
        else {
            switch (s[l-1]) {
              case '@':
                *sp = G0_JISX0208_1978;
                break;

              case 'B':
                *sp = G0_JISX0208_1983;
                break;
            }
        }
        return 0;
    }
    else {
        if (*sp == G0_JISX0208_1978)
            o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1978;
        else
            o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1983;
        o[1] = s[0] | 0x80;
        o[2] = s[1] | 0x80;
        return 3;
    }
}

static const rb_transcoder
rb_iso2022jp_decoder = {
    "ISO-2022-JP", "stateless-ISO-2022-JP", iso2022jp_decoder,
    TRANSCODE_TABLE_INFO,
    1, /* input_unit_length */
    3, /* max_input */
    3, /* max_output */
    asciicompat_decoder, /* asciicompat_type */
    1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */
    NULL, fun_si_iso2022jp_decoder, NULL, fun_so_iso2022jp_decoder
};

static ssize_t
fun_so_iso2022jp_encoder(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize)
{
    unsigned char *sp = statep;
    unsigned char *output0 = o;
    int newstate;

    if (l == 1)
        newstate = G0_ASCII;
    else if (s[0] == EMACS_MULE_LEADING_CODE_JISX0208_1978)
        newstate = G0_JISX0208_1978;
    else
        newstate = G0_JISX0208_1983;

    if (*sp != newstate) {
        if (newstate == G0_ASCII) {
            *o++ = 0x1b;
            *o++ = '(';
            *o++ = 'B';
        }
        else if (newstate == G0_JISX0208_1978) {
            *o++ = 0x1b;
            *o++ = '$';
            *o++ = '@';
        }
        else {
            *o++ = 0x1b;
            *o++ = '$';
            *o++ = 'B';
        }
        *sp = newstate;
    }

    if (l == 1) {
        *o++ = s[0] & 0x7f;
    }
    else {
        *o++ = s[1] & 0x7f;
        *o++ = s[2] & 0x7f;
    }

    return o - output0;
}

static ssize_t
iso2022jp_encoder_reset_sequence_size(void *statep)
{
    unsigned char *sp = statep;
    if (*sp != G0_ASCII)
        return 3;
    return 0;
}

static ssize_t
finish_iso2022jp_encoder(void *statep, unsigned char *o, size_t osize)
{
    unsigned char *sp = statep;
    unsigned char *output0 = o;

    if (*sp == G0_ASCII)
        return 0;

    *o++ = 0x1b;
    *o++ = '(';
    *o++ = 'B';
    *sp = G0_ASCII;

    return o - output0;
}

static const rb_transcoder
rb_iso2022jp_encoder = {
    "stateless-ISO-2022-JP", "ISO-2022-JP", iso2022jp_encoder,
    TRANSCODE_TABLE_INFO,
    1, /* input_unit_length */
    3, /* max_input */
    5, /* max_output */
    asciicompat_encoder, /* asciicompat_type */
    1, iso2022jp_init, iso2022jp_init, /* state_size, state_init, state_fini */
    NULL, NULL, NULL, fun_so_iso2022jp_encoder,
    finish_iso2022jp_encoder,
    iso2022jp_encoder_reset_sequence_size, finish_iso2022jp_encoder
};

static ssize_t
fun_so_stateless_iso2022jp_to_eucjp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize)
{
    o[0] = s[1];
    o[1] = s[2];
    return 2;
}

static const rb_transcoder
rb_stateless_iso2022jp_to_eucjp = {
    "stateless-ISO-2022-JP", "EUC-JP", stateless_iso2022jp_to_eucjp,
    TRANSCODE_TABLE_INFO,
    1, /* input_unit_length */
    3, /* max_input */
    2, /* max_output */
    asciicompat_converter, /* asciicompat_type */
    0, NULL, NULL, /* state_size, state_init, state_fini */
    NULL, NULL, NULL, fun_so_stateless_iso2022jp_to_eucjp,
};

static ssize_t
fun_so_eucjp_to_stateless_iso2022jp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize)
{
    o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1983;
    o[1] = s[0];
    o[2] = s[1];
    return 3;
}

static const rb_transcoder
rb_eucjp_to_stateless_iso2022jp = {
    "EUC-JP", "stateless-ISO-2022-JP", eucjp_to_stateless_iso2022jp,
    TRANSCODE_TABLE_INFO,
    1, /* input_unit_length */
    3, /* max_input */
    3, /* max_output */
    asciicompat_converter, /* asciicompat_type */
    0, NULL, NULL, /* state_size, state_init, state_fini */
    NULL, NULL, NULL, fun_so_eucjp_to_stateless_iso2022jp,
};

void
Init_iso2022(void)
{
    rb_register_transcoder(&rb_iso2022jp_decoder);
    rb_register_transcoder(&rb_iso2022jp_encoder);
    rb_register_transcoder(&rb_stateless_iso2022jp_to_eucjp);
    rb_register_transcoder(&rb_eucjp_to_stateless_iso2022jp);
}


