Ruby  1.9.3p448(2013-06-27revision41675)
iso2022.c
Go to the documentation of this file.
1 /* autogenerated. */
2 /* src="transcode-tblgen.rb", len=28123, checksum=30477 */
3 /* src="iso2022.trans", len=15906, checksum=38089 */
4 
5 #include "transcode_data.h"
6 
7 
8 
9 static const unsigned char
11 #define iso2022jp_decoder_1B_24_offsets 0
12 64, 66,
13  1, 0, 1,
14 
15 #define iso2022jp_decoder_1B_28_offsets 5
16 66, 74,
17  1, 0, 0, 0, 0, 0, 0, 0, 1,
18 
19 #define iso2022jp_decoder_1B_offsets 16
20 36, 40,
21  1, 0, 0, 0, 2,
22 
23 #define iso2022jp_decoder_offsets 23
24 0, 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
35 33, 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
44 161, 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
53 0, 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
66 0, 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
85 66, 74,
86  1, 0, 0, 0, 0, 0, 0, 1, 1,
87 
88 #define cp50221_decoder_offsets 762
89 0, 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
106 0, 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 };
125 static const unsigned int
127 #define iso2022jp_decoder_1B_24_infos WORDINDEX2INFO(0)
128  INVALID, FUNso,
129 
130 #define iso2022jp_decoder_1B_24 WORDINDEX2INFO(2)
133 
134 #define iso2022jp_decoder_1B_28 WORDINDEX2INFO(4)
136  iso2022jp_decoder_1B_24_infos,
137 
138 #define iso2022jp_decoder_1B_infos WORDINDEX2INFO(6)
141 
142 #define iso2022jp_decoder_1B WORDINDEX2INFO(9)
145 
146 #define iso2022jp_decoder_infos WORDINDEX2INFO(11)
147  FUNsi, INVALID,
149 
150 #define iso2022jp_decoder WORDINDEX2INFO(14)
153 
154 #define iso2022jp_decoder_jisx0208_rest WORDINDEX2INFO(16)
156  iso2022jp_decoder_1B_24_infos,
157 
158 #define iso2022jp_encoder_90_A1toFE WORDINDEX2INFO(18)
160  iso2022jp_decoder_1B_24_infos,
161 
162 #define iso2022jp_encoder_90_infos WORDINDEX2INFO(20)
164 
165 #define iso2022jp_encoder_90 WORDINDEX2INFO(22)
166  iso2022jp_encoder_90_A1toFE_offsets,
168 
169 #define iso2022jp_encoder_infos WORDINDEX2INFO(24)
170  FUNso, INVALID,
172 
173 #define iso2022jp_encoder WORDINDEX2INFO(27)
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,
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,
191 
192 #define eucjp_to_stateless_iso2022jp_8F_infos WORDINDEX2INFO(38)
194 
195 #define eucjp_to_stateless_iso2022jp_8F WORDINDEX2INFO(40)
196  iso2022jp_encoder_90_A1toFE_offsets,
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)
207 
208 #define cp50221_decoder_1B_28 WORDINDEX2INFO(50)
210  iso2022jp_decoder_1B_24_infos,
211 
212 #define cp50221_decoder_1B_infos WORDINDEX2INFO(52)
213  INVALID, iso2022jp_decoder_1B_24,
215 
216 #define cp50221_decoder_1B WORDINDEX2INFO(55)
217  iso2022jp_decoder_1B_offsets,
219 
220 #define cp50221_decoder_infos WORDINDEX2INFO(57)
221  FUNsi, FUNso,
223 
224 #define cp50221_decoder WORDINDEX2INFO(61)
227 
228 #define cp50221_encoder_infos WORDINDEX2INFO(63)
229  FUNso, UNDEF,
230  INVALID, iso2022jp_encoder_90_A1toFE,
231 
232 #define cp50221_encoder WORDINDEX2INFO(67)
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 
249 static int
250 iso2022jp_init(void *statep)
251 {
252  unsigned char *sp = statep;
253  *sp = G0_ASCII;
254  return 0;
255 }
256 
257 static VALUE
258 fun_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)
265  else
266  return (VALUE)INVALID;
267 }
268 
269 static ssize_t
270 fun_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)
298  else
300  o[1] = s[0] | 0x80;
301  o[2] = s[1] | 0x80;
302  return 3;
303  }
304 }
305 
306 static const rb_transcoder
308  "ISO-2022-JP", "stateless-ISO-2022-JP", iso2022jp_decoder,
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 */
316 };
317 
318 static ssize_t
319 fun_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 
362 static ssize_t
364 {
365  unsigned char *sp = statep;
366  if (*sp != G0_ASCII)
367  return 3;
368  return 0;
369 }
370 
371 static ssize_t
372 finish_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 
388 static const rb_transcoder
390  "stateless-ISO-2022-JP", "ISO-2022-JP", iso2022jp_encoder,
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,
399  iso2022jp_encoder_reset_sequence_size, finish_iso2022jp_encoder
400 };
401 
402 static ssize_t
403 fun_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 
410 static const rb_transcoder
412  "stateless-ISO-2022-JP", "EUC-JP", stateless_iso2022jp_to_eucjp,
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 
422 static ssize_t
423 fun_so_eucjp_to_stateless_iso2022jp(void *statep, const unsigned char *s, size_t l, unsigned char *o, size_t osize)
424 {
426  o[1] = s[0];
427  o[2] = s[1];
428  return 3;
429 }
430 
431 static const rb_transcoder
433  "EUC-JP", "stateless-ISO-2022-JP", eucjp_to_stateless_iso2022jp,
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 
443 static VALUE
444 fun_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;
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))
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) */
469  break;
470  }
471  return (VALUE)INVALID;
472 }
473 
474 static ssize_t
475 fun_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 
535 static const rb_transcoder
537  "CP50220", "cp51932", cp50221_decoder,
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 */
545 };
546 
547 static const rb_transcoder
549  "CP50221", "cp51932", cp50221_decoder,
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 */
557 };
558 
559 static ssize_t
560 fun_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 
607 static const rb_transcoder
609  "CP51932", "CP50221", cp50221_encoder,
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,
618  iso2022jp_encoder_reset_sequence_size, finish_iso2022jp_encoder
619 };
620 
621 static 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 
631 static ssize_t
632 fun_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 
687 static ssize_t
688 finish_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 
717 static const rb_transcoder
719  "CP51932", "CP50220", cp50221_encoder,
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,
728  iso2022jp_encoder_reset_sequence_size, finish_cp50220_encoder
729 };
730 
731 void
733 {
742 }
743 
744 
745