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