1#include "transcode_data.h" 2 3<% 4 # mapping from ISO-2022-JP-KDDI to stateless-ISO-2022-JP-KDDI 5 map = { 6 "1b2842" => :func_so, # designate US-ASCII to G0. "ESC ( B" 7 "1b284a" => :func_so, # designate JIS X 0201 latin to G0. "ESC ( J" 8 "1b2440" => :func_so, # designate JIS X 0208 1978 to G0. "ESC $ @" 9 "1b2442" => :func_so, # designate JIS X 0208 1983 to G0. "ESC $ B" 10 "{00-0d,10-1a,1c-7f}" => :func_si, 11 } 12 transcode_generate_node(ActionMap.parse(map), "iso2022jp_kddi_decoder") 13 14 map_jisx0208_rest = { 15 "{21-7e}" => :func_so 16 } 17 transcode_generate_node(ActionMap.parse(map_jisx0208_rest), "iso2022jp_kddi_decoder_jisx0208_rest") 18 19 # mapping from stateless-ISO-2022-JP-KDDI to ISO-2022-JP-KDDI 20 map = { 21 "{00-0d,10-1a,1c-7f}" => :func_so, 22 "90{a1-fe}{a1-fe}" => :func_so, 23 "92{a1-fe}{a1-fe}" => :func_so, 24 } 25 transcode_generate_node(ActionMap.parse(map), "iso2022jp_kddi_encoder") 26 27 # mapping from stateless-ISO-2022-JP-KDDI to UTF8-KDDI 28 transcode_tblgen "stateless-ISO-2022-JP-KDDI", "UTF8-KDDI", 29 [["{00-7f}", :nomap]] + 30 citrus_decode_mapsrc("stateless_iso", 0222, %w(EMOJI_ISO-2022-JP-KDDI/UCS 31 JISX0208VDC:NEC/UCS 32 CP932VDC:NEC_IBM/UCS 33 CP932VDC:IBM/UCS 34 JISX0208:MS/UCS).join(",")), 35 nil 36 37 # mapping from UTF8-KDDI to stateless-ISO-2022-JP-KDDI 38 transcode_tblgen "UTF8-KDDI", "stateless-ISO-2022-JP-KDDI", 39 [["{00-7f}", :nomap]] + 40 citrus_decode_mapsrc("stateless_iso", 0222, %w(UCS/EMOJI_ISO-2022-JP-KDDI 41 UCS/EMOJI_ISO-2022-JP-KDDI-UNDOC 42 UCS/JISX0208VDC:NEC 43 UCS/CP932VDC:NEC_IBM 44 UCS/CP932VDC:IBM 45 UCS/JISX0208:MS).join(",")), 46 ValidEncoding('UTF-8') 47%> 48 49<%= transcode_generated_code %> 50 51#define G0_ASCII 0 52/* ignore JIS X 0201 latin */ 53#define G0_JISX0208_1978 1 54#define G0_JISX0208_1983 2 55 56#define EMACS_MULE_LEADING_CODE_JISX0208_1978 0220 57#define EMACS_MULE_LEADING_CODE_JISX0208_1983 0222 58 59static int 60iso2022jp_kddi_init(void *statep) 61{ 62 unsigned char *sp = statep; 63 *sp = G0_ASCII; 64 return 0; 65} 66 67static VALUE 68fun_si_iso2022jp_kddi_decoder(void *statep, const unsigned char *s, size_t l) 69{ 70 unsigned char *sp = statep; 71 if (*sp == G0_ASCII) 72 return (VALUE)NOMAP; 73 else if (0x21 <= s[0] && s[0] <= 0x7e) 74 return (VALUE)iso2022jp_kddi_decoder_jisx0208_rest; 75 else 76 return (VALUE)INVALID; 77} 78 79static ssize_t 80fun_so_iso2022jp_kddi_decoder(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) 81{ 82 unsigned char *sp = statep; 83 if (s[0] == 0x1b) { 84 if (s[1] == '(') { 85 switch (s[l-1]) { 86 case 'B': /* US-ASCII */ 87 case 'J': /* JIS X 0201 Roman */ 88 *sp = G0_ASCII; 89 break; 90 } 91 } 92 else { 93 switch (s[l-1]) { 94 case '@': 95 *sp = G0_JISX0208_1978; 96 break; 97 98 case 'B': 99 *sp = G0_JISX0208_1983; 100 break; 101 } 102 } 103 return 0; 104 } 105 else { 106 if (*sp == G0_JISX0208_1978) 107 o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1978; 108 else 109 o[0] = EMACS_MULE_LEADING_CODE_JISX0208_1983; 110 o[1] = s[0] | 0x80; 111 o[2] = s[1] | 0x80; 112 return 3; 113 } 114} 115 116static const rb_transcoder 117rb_iso2022jp_kddi_decoder = { 118 "ISO-2022-JP-KDDI", "stateless-ISO-2022-JP-KDDI", iso2022jp_kddi_decoder, 119 TRANSCODE_TABLE_INFO, 120 1, /* input_unit_length */ 121 3, /* max_input */ 122 3, /* max_output */ 123 asciicompat_decoder, /* asciicompat_type */ 124 1, iso2022jp_kddi_init, iso2022jp_kddi_init, /* state_size, state_init, state_fini */ 125 NULL, fun_si_iso2022jp_kddi_decoder, NULL, fun_so_iso2022jp_kddi_decoder 126}; 127 128static ssize_t 129fun_so_iso2022jp_kddi_encoder(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize) 130{ 131 unsigned char *sp = statep; 132 unsigned char *output0 = o; 133 int newstate; 134 135 if (l == 1) 136 newstate = G0_ASCII; 137 else if (s[0] == EMACS_MULE_LEADING_CODE_JISX0208_1978) 138 newstate = G0_JISX0208_1978; 139 else 140 newstate = G0_JISX0208_1983; 141 142 if (*sp != newstate) { 143 *o++ = 0x1b; 144 switch (newstate) { 145 case G0_ASCII: 146 *o++ = '('; 147 *o++ = 'B'; 148 break; 149 case G0_JISX0208_1978: 150 *o++ = '$'; 151 *o++ = '@'; 152 break; 153 default: 154 *o++ = '$'; 155 *o++ = 'B'; 156 break; 157 } 158 *sp = newstate; 159 } 160 161 if (l == 1) { 162 *o++ = s[0] & 0x7f; 163 } 164 else { 165 *o++ = s[1] & 0x7f; 166 *o++ = s[2] & 0x7f; 167 } 168 169 return o - output0; 170} 171 172static ssize_t 173iso2022jp_kddi_encoder_reset_sequence_size(void *statep) 174{ 175 unsigned char *sp = statep; 176 if (*sp != G0_ASCII) return 3; 177 return 0; 178} 179 180static ssize_t 181finish_iso2022jp_kddi_encoder(void *statep, unsigned char *o, size_t osize) 182{ 183 unsigned char *sp = statep; 184 unsigned char *output0 = o; 185 186 if (*sp == G0_ASCII) 187 return 0; 188 189 *o++ = 0x1b; 190 *o++ = '('; 191 *o++ = 'B'; 192 *sp = G0_ASCII; 193 194 return o - output0; 195} 196 197static const rb_transcoder 198rb_iso2022jp_kddi_encoder = { 199 "stateless-ISO-2022-JP-KDDI", "ISO-2022-JP-KDDI", iso2022jp_kddi_encoder, 200 TRANSCODE_TABLE_INFO, 201 1, /* input_unit_length */ 202 3, /* max_input */ 203 5, /* max_output */ 204 asciicompat_encoder, /* asciicompat_type */ 205 1, iso2022jp_kddi_init, iso2022jp_kddi_init, /* state_size, state_init, state_fini */ 206 NULL, NULL, NULL, fun_so_iso2022jp_kddi_encoder, 207 finish_iso2022jp_kddi_encoder, 208 iso2022jp_kddi_encoder_reset_sequence_size, finish_iso2022jp_kddi_encoder 209}; 210 211TRANS_INIT(emoji_iso2022_kddi) 212{ 213 rb_register_transcoder(&rb_iso2022jp_kddi_decoder); 214 rb_register_transcoder(&rb_iso2022jp_kddi_encoder); 215<%= transcode_register_code %> 216} 217