12 #define C0 WC_ISO_MAP_C0
13 #define C1 WC_ISO_MAP_C1
14 #define GL WC_ISO_MAP_GL
15 #define GR WC_ISO_MAP_GR
16 #define GL2 WC_ISO_MAP_GL96
17 #define GR2 WC_ISO_MAP_GR96
18 #define SO WC_ISO_MAP_SO
19 #define SI WC_ISO_MAP_SI
20 #define ESC WC_ISO_MAP_ESC
21 #define SS2 WC_ISO_MAP_SS2
22 #define SS3 WC_ISO_MAP_SS3
24 wc_uint8 WC_ISO_MAP[ 0x100 ] = {
25 C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, SO, SI,
26 C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, ESC,C0, C0, C0, C0,
27 GL2,GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
28 GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
29 GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
30 GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
31 GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
32 GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL2,
34 C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, SS2,SS3,
35 C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1,
36 GR2,GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR,
37 GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR,
38 GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR,
39 GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR,
40 GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR,
41 GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR2,
44 static wc_uchar cs94_gmap[ 0x80 - WC_F_ISO_BASE ];
45 static wc_uchar cs94w_gmap[ 0x80 - WC_F_ISO_BASE ];
46 static wc_uchar cs96_gmap[ 0x80 - WC_F_ISO_BASE ];
47 static wc_uchar cs96w_gmap[ 0x80 - WC_F_ISO_BASE ];
48 static wc_uchar cs942_gmap[ 0x80 - WC_F_ISO_BASE ];
51 wtf_push_iso2022(Str os, wc_ccs ccs, wc_uint32 code)
54 case WC_CCS_JIS_C_6226:
55 case WC_CCS_JIS_X_0208:
56 case WC_CCS_JIS_X_0213_1:
57 ccs = wc_jisx0208_or_jisx02131(code);
59 case WC_CCS_JIS_X_0212:
60 case WC_CCS_JIS_X_0213_2:
61 ccs = wc_jisx0212_or_jisx02132(code);
63 case WC_CCS_JIS_X_0201:
65 ccs = WC_CCS_US_ASCII;
68 wtf_push(os, ccs, code);
72 wc_conv_from_iso2022(Str is, wc_ces ces)
75 wc_uchar *sp = (wc_uchar *)is->ptr;
76 wc_uchar *ep = sp + is->length;
77 wc_uchar *p, *q = NULL;
78 int state = WC_ISO_NOSTATE;
80 wc_ccs gl_ccs, gr_ccs;
82 for (p = sp; p < ep && !(WC_ISO_MAP[*p] & WC_ISO_MAP_DETECT); p++)
86 os = Strnew_size(is->length);
88 Strcat_charp_n(os, is->ptr, (int)(p - sp));
90 wc_input_init(ces, &st);
91 gl_ccs = st.design[st.gl];
92 gr_ccs = st.design[st.gr];
97 switch (WC_ISO_MAP[*p]) {
99 gl_ccs = st.ss ? st.design[st.ss]
101 if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) {
102 Strcat_char(os, (char)*p);
106 gl_ccs = st.ss ? st.design[st.ss]
108 if (WC_CCS_IS_WIDE(gl_ccs)) {
110 state = WC_ISO_MBYTE1;
112 } else if (gl_ccs == WC_CES_US_ASCII)
113 Strcat_char(os, (char)*p);
115 wtf_push_iso2022(os, gl_ccs, (wc_uint32)*p);
118 gr_ccs = st.ss ? st.design[st.ss]
120 if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) {
121 wtf_push_unknown(os, p, 1);
125 gr_ccs = st.ss ? st.design[st.ss]
127 if (WC_CCS_IS_WIDE(gr_ccs)) {
129 state = WC_EUC_MBYTE1;
132 wtf_push_iso2022(os, gr_ccs, (wc_uint32)*p);
134 wtf_push_unknown(os, p, 1);
137 Strcat_char(os, (char)*p);
140 wtf_push(os, WC_CCS_C1, (wc_uint32)*p);
144 if (wc_parse_iso2022_esc(&p, &st))
147 Strcat_char(os, (char)*p);
156 if (! st.design[2]) {
157 wtf_push_unknown(os, p, 1);
163 if (! st.design[3]) {
164 wtf_push_unknown(os, p, 1);
172 switch (WC_ISO_MAP[*p]) {
174 if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) {
175 Strcat_char(os, (char)*q);
176 Strcat_char(os, (char)*p);
180 wtf_push_iso2022(os, gl_ccs, ((wc_uint32)*q << 8) | *p);
183 wtf_push_unknown(os, q, 2);
188 switch (WC_ISO_MAP[*p]) {
190 if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) {
191 wtf_push_unknown(os, q, 2);
195 if (gr_ccs == WC_CCS_CNS_11643_X) {
196 state = WC_EUC_TW_MBYTE2;
199 wtf_push_iso2022(os, gr_ccs, ((wc_uint32)*q << 8) | *p);
202 wtf_push_unknown(os, q, 2);
206 case WC_EUC_TW_MBYTE2:
207 if (WC_ISO_MAP[*p] == GR) {
208 if (0xa1 <= *q && *q <= 0xa7) {
209 wtf_push_iso2022(os, WC_CCS_CNS_11643_1 + (*q - 0xa1),
210 ((wc_uint32)*(q+1) << 8) | *p);
213 if (0xa8 <= *q && *q <= 0xb0) {
214 wtf_push_iso2022(os, WC_CCS_CNS_11643_8 + (*q - 0xa8),
215 ((wc_uint32)*(q+1) << 8) | *p);
219 wtf_push_unknown(os, q, 3);
222 if (*p == WC_C_ESC && *(p+1) == WC_C_CSWSR) {
223 if (*(p+2) == WC_F_ISO_BASE) {
224 state = st.state = WC_ISO_NOSTATE;
227 } else if (*(p+2) > WC_F_ISO_BASE && *(p+2) <= 0x7e) {
232 wtf_push_unknown(os, p, 1);
235 wtf_push_unknown(os, p, ep - p);
240 state = WC_ISO_NOSTATE;
245 wtf_push_unknown(os, p-1, 1);
247 case WC_EUC_TW_MBYTE1:
248 wtf_push_unknown(os, p-2, 2);
255 wc_parse_iso2022_esc(wc_uchar **ptr, wc_status *st)
257 wc_uchar *p = *ptr, state, f = 0, g = 0, cs = 0;
262 for (p++; *p && state; p++) {
264 case WC_C_ESC: /* ESC */
266 case WC_C_MBCS: /* ESC '$' */
269 case WC_C_G0_CS94: /* ESC '(' */
270 case WC_C_G1_CS94: /* ESC ')' */
271 case WC_C_G2_CS94: /* ESC '*' */
272 case WC_C_G3_CS94: /* ESC '+' */
273 state = cs = WC_C_G0_CS94;
276 case WC_C_G0_CS96: /* ESC ',' */ /* ISO 2022 does not permit */
277 case WC_C_G1_CS96: /* ESC '-' */
278 case WC_C_G2_CS96: /* ESC '.' */
279 case WC_C_G3_CS96: /* ESC '/' */
280 state = cs = WC_C_G0_CS96;
283 case WC_C_C0: /* ESC '!' */ /* not suported */
284 case WC_C_C1: /* ESC '"' */ /* not suported */
285 case WC_C_REP: /* ESC '&' */ /* not suported */
286 state = cs = WC_C_C0;
288 case WC_C_CSWSR: /* ESC '%' */ /* not suported */
289 state = cs = WC_C_CSWSR;
291 case WC_C_SS2: /* ESC 'N' */
292 st->ss = 2; *ptr = p; return 1;
293 case WC_C_SS3: /* ESC 'O' */
294 st->ss = 3; *ptr = p; return 1;
295 case WC_C_LS2: /* ESC 'n' */
296 st->gl = 2; *ptr = p; return 1;
297 case WC_C_LS3: /* ESC 'o' */
298 st->gl = 3; *ptr = p; return 1;
299 case WC_C_LS1R: /* ESC '~' */
300 st->gr = 1; *ptr = p; return 1;
301 case WC_C_LS2R: /* ESC '}' */
302 st->gr = 2; *ptr = p; return 1;
303 case WC_C_LS3R: /* ESC '|' */
304 st->gr = 3; *ptr = p; return 1;
309 case WC_C_MBCS: /* ESC '$' */
311 case WC_F_JIS_C_6226: /* ESC '$' @ */
312 case WC_F_JIS_X_0208: /* ESC '$' B */
313 case WC_F_GB_2312: /* ESC '$' A */
315 cs = WC_C_G0_CS94 | 0x80;
319 case WC_C_G0_CS94: /* ESC '$' '(' */
320 case WC_C_G1_CS94: /* ESC '$' ')' */
321 case WC_C_G2_CS94: /* ESC '$' '*' */
322 case WC_C_G3_CS94: /* ESC '$' '+' */
323 state = cs = WC_C_G0_CS94 | 0x80;
326 case WC_C_G0_CS96: /* ESC '$' ',' */ /* ISO 2022 does not permit */
327 case WC_C_G1_CS96: /* ESC '$' '-' */
328 case WC_C_G2_CS96: /* ESC '$' '.' */
329 case WC_C_G3_CS96: /* ESC '$' '/' */
330 state = cs = WC_C_G0_CS96 | 0x80;
337 case WC_C_G0_CS94: /* ESC [()*+] F */
338 if (*p == WC_C_CS942) { /* ESC [()*+] '!' */
339 state = cs = WC_C_CS942 | 0x80;
343 case WC_C_G0_CS96: /* ESC [,-./] F */
344 case WC_C_G0_CS94 | 0x80: /* ESC '$' [()*+] F */
345 case WC_C_G0_CS96 | 0x80: /* ESC '$' [,-./] F */
346 case WC_C_CS942 | 0x80: /* ESC [()*+] '!' F */
347 case WC_C_C0: /* ESC [!"&] F */
348 case WC_C_CSWSR | 0x80: /* ESC '%' '/' F */
352 case WC_C_CSWSR: /* ESC '%' F */
353 if (*p == WC_C_CSWOSR) { /* ESC '%' '/' */
354 state = cs = WC_C_CSWSR | 0x80;
364 if (f < WC_F_ISO_BASE || f > 0x7e)
368 st->design[g] = WC_CCS_SET_CS94(f);
370 case WC_C_G0_CS94 | 0x80:
371 st->design[g] = WC_CCS_SET_CS94W(f);
374 st->design[g] = WC_CCS_SET_CS96(f);
376 case WC_C_G0_CS96 | 0x80:
377 st->design[g] = WC_CCS_SET_CS96W(f);
379 case WC_C_CS942 | 0x80:
380 st->design[g] = WC_CCS_SET_CS942(f);
383 if (f == WC_F_ISO_BASE)
384 st->state = WC_ISO_NOSTATE;
386 st->state = WC_ISO_CSWSR;
389 st->state = WC_ISO_CSWOSR;
397 wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st)
400 wc_bool is_wide = WC_FALSE, retry = WC_FALSE;
404 switch (WC_CCS_TYPE(cc.ccs)) {
406 if (cc.ccs == WC_CCS_US_ASCII)
408 g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
414 case WC_CCS_JIS_X_0212:
415 if (!WcOption.use_jisx0212 && WcOption.use_jisx0213 &&
417 cc2 = wc_jisx0212_to_jisx0213(cc);
418 if (cc2.ccs == WC_CCS_JIS_X_0213_1 ||
419 cc2.ccs == WC_CCS_JIS_X_0213_2) {
425 case WC_CCS_JIS_X_0213_1:
426 case WC_CCS_JIS_X_0213_2:
427 if (!WcOption.use_jisx0213 && WcOption.use_jisx0212 &&
429 cc2 = wc_jisx0213_to_jisx0212(cc);
430 if (cc2.ccs == WC_CCS_JIS_X_0212) {
438 g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
441 g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
445 g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
448 g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
450 case WC_CCS_A_UNKNOWN_W:
451 if (WcOption.no_replace)
454 cc.ccs = WC_CCS_US_ASCII;
455 g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
456 cc.code = ((wc_uint32)WC_REPLACE_W[0] << 8) | WC_REPLACE_W[1];
458 case WC_CCS_A_UNKNOWN:
459 if (WcOption.no_replace)
461 cc.ccs = WC_CCS_US_ASCII;
462 g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
463 cc.code = (wc_uint32)WC_REPLACE[0];
466 if ((cc.ccs == WC_CCS_JOHAB || WC_CCS_JOHAB_1 ||
467 cc.ccs == WC_CCS_JOHAB_2 || cc.ccs == WC_CCS_JOHAB_3) &&
468 cs94w_gmap[WC_F_KS_X_1001 - WC_F_ISO_BASE]) {
469 wc_wchar_t cc2 = wc_johab_to_ksx1001(cc);
470 if (cc2.ccs == WC_CCS_KS_X_1001) {
476 if (WcOption.ucs_conv)
477 cc = wc_any_to_iso2022(cc, st);
480 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
485 if (WcOption.ucs_conv && ! retry)
486 cc = wc_any_to_any_ces(cc, st);
489 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
494 wc_push_iso2022_esc(os, cc.ccs, g, 1, st);
496 Strcat_char(os, (char)((cc.code >> 8) & 0x7f));
497 Strcat_char(os, (char)(cc.code & 0x7f));
503 wc_push_to_iso2022_end(Str os, wc_status *st)
505 if (st->design[1] != 0 && st->design[1] != st->g1_ccs)
506 wc_push_iso2022_esc(os, st->g1_ccs, WC_C_G1_CS94, 0, st);
507 wc_push_iso2022_esc(os, st->g0_ccs, WC_C_G0_CS94, 1, st);
511 wc_push_iso2022_esc(Str os, wc_ccs ccs, wc_uchar g, wc_uint8 invoke, wc_status *st)
513 wc_uint8 g_invoke = g & 0x03;
515 if (st->design[g_invoke] != ccs) {
516 Strcat_char(os, WC_C_ESC);
517 if (WC_CCS_IS_WIDE(ccs)) {
518 Strcat_char(os, WC_C_MBCS);
520 (ccs != WC_CCS_JIS_C_6226 &&
521 ccs != WC_CCS_JIS_X_0208 &&
522 ccs != WC_CCS_GB_2312))
523 Strcat_char(os, (char)g);
525 Strcat_char(os, (char)g);
526 if ((ccs & WC_CCS_A_ISO_2022) == WC_CCS_A_CS942)
527 Strcat_char(os, WC_C_CS942);
529 Strcat_char(os, (char)WC_CCS_GET_F(ccs));
530 st->design[g_invoke] = ccs;
538 Strcat_char(os, WC_C_SI);
544 Strcat_char(os, WC_C_SO);
549 Strcat_char(os, WC_C_ESC);
550 Strcat_char(os, WC_C_SS2);
553 Strcat_char(os, WC_C_ESC);
554 Strcat_char(os, WC_C_SS3);
560 wc_push_to_euc(Str os, wc_wchar_t cc, wc_status *st)
562 wc_ccs g1_ccs = st->ces_info->gset[1].ccs;
565 if (cc.ccs == g1_ccs) {
566 Strcat_char(os, (char)((cc.code >> 8) | 0x80));
567 Strcat_char(os, (char)((cc.code & 0xff) | 0x80));
571 case WC_CCS_US_ASCII:
572 Strcat_char(os, (char)cc.code);
575 Strcat_char(os, (char)(cc.code | 0x80));
577 case WC_CCS_UNKNOWN_W:
578 if (!WcOption.no_replace)
579 Strcat_charp(os, WC_REPLACE_W);
582 if (!WcOption.no_replace)
583 Strcat_charp(os, WC_REPLACE);
589 if (st->ces_info->id == WC_CES_EUC_KR) {
590 cc = wc_johab_to_ksx1001(cc);
595 if (WcOption.ucs_conv)
596 cc = wc_any_to_any_ces(cc, st);
599 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
606 wc_push_to_eucjp(Str os, wc_wchar_t cc, wc_status *st)
610 case WC_CCS_US_ASCII:
611 Strcat_char(os, (char)cc.code);
613 case WC_CCS_JIS_X_0201K:
614 if (WcOption.use_jisx0201k) {
615 Strcat_char(os, WC_C_SS2R);
616 Strcat_char(os, (char)(cc.code | 0x80));
618 } else if (WcOption.fix_width_conv)
619 cc.ccs = WC_CCS_UNKNOWN;
621 cc = wc_jisx0201k_to_jisx0208(cc);
623 case WC_CCS_JIS_X_0208:
625 case WC_CCS_JIS_X_0213_1:
626 if (WcOption.use_jisx0213)
629 else if (WcOption.ucs_conv && WcOption.use_jisx0212)
630 cc = wc_jisx0213_to_jisx0212(cc);
633 cc.ccs = WC_CCS_UNKNOWN_W;
635 case WC_CCS_JIS_X_0212:
636 if (WcOption.use_jisx0212) {
637 Strcat_char(os, WC_C_SS3R);
641 else if (WcOption.ucs_conv && WcOption.use_jisx0213)
642 cc = wc_jisx0212_to_jisx0213(cc);
645 cc.ccs = WC_CCS_UNKNOWN_W;
647 case WC_CCS_JIS_X_0213_2:
648 if (WcOption.use_jisx0213) {
649 Strcat_char(os, WC_C_SS3R);
653 else if (WcOption.ucs_conv && WcOption.use_jisx0212)
654 cc = wc_jisx0213_to_jisx0212(cc);
657 cc.ccs = WC_CCS_UNKNOWN_W;
660 Strcat_char(os, (char)(cc.code | 0x80));
662 case WC_CCS_UNKNOWN_W:
663 if (!WcOption.no_replace)
664 Strcat_charp(os, WC_REPLACE_W);
667 if (!WcOption.no_replace)
668 Strcat_charp(os, WC_REPLACE);
672 if (WcOption.ucs_conv)
673 cc = wc_any_to_any_ces(cc, st);
676 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
679 Strcat_char(os, (char)((cc.code >> 8) | 0x80));
680 Strcat_char(os, (char)((cc.code & 0xff) | 0x80));
686 wc_push_to_euctw(Str os, wc_wchar_t cc, wc_status *st)
690 case WC_CCS_US_ASCII:
691 Strcat_char(os, (char)cc.code);
693 case WC_CCS_CNS_11643_1:
695 case WC_CCS_CNS_11643_2:
696 case WC_CCS_CNS_11643_3:
697 case WC_CCS_CNS_11643_4:
698 case WC_CCS_CNS_11643_5:
699 case WC_CCS_CNS_11643_6:
700 case WC_CCS_CNS_11643_7:
701 Strcat_char(os, WC_C_SS2R);
702 Strcat_char(os, (char)(0xA1 + (cc.ccs - WC_CCS_CNS_11643_1)));
704 case WC_CCS_CNS_11643_8:
705 case WC_CCS_CNS_11643_9:
706 case WC_CCS_CNS_11643_10:
707 case WC_CCS_CNS_11643_11:
708 case WC_CCS_CNS_11643_12:
709 case WC_CCS_CNS_11643_13:
710 case WC_CCS_CNS_11643_14:
711 case WC_CCS_CNS_11643_15:
712 case WC_CCS_CNS_11643_16:
713 Strcat_char(os, WC_C_SS2R);
714 Strcat_char(os, (char)(0xA8 + (cc.ccs - WC_CCS_CNS_11643_8)));
717 Strcat_char(os, (char)(cc.code | 0x80));
719 case WC_CCS_UNKNOWN_W:
720 if (!WcOption.no_replace)
721 Strcat_charp(os, WC_REPLACE_W);
724 if (!WcOption.no_replace)
725 Strcat_charp(os, WC_REPLACE);
729 if (WcOption.ucs_conv)
730 cc = wc_any_to_any_ces(cc, st);
733 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
736 Strcat_char(os, (char)((cc.code >> 8) | 0x80));
737 Strcat_char(os, (char)((cc.code & 0xff) | 0x80));
743 wc_push_to_iso8859(Str os, wc_wchar_t cc, wc_status *st)
745 wc_ccs g1_ccs = st->ces_info->gset[1].ccs;
748 if (cc.ccs == g1_ccs) {
749 Strcat_char(os, (char)(cc.code | 0x80));
753 case WC_CCS_US_ASCII:
754 Strcat_char(os, (char)cc.code);
757 Strcat_char(os, (char)(cc.code | 0x80));
759 case WC_CCS_UNKNOWN_W:
760 if (!WcOption.no_replace)
761 Strcat_charp(os, WC_REPLACE_W);
764 if (!WcOption.no_replace)
765 Strcat_charp(os, WC_REPLACE);
769 if (WcOption.ucs_conv)
770 cc = wc_any_to_any_ces(cc, st);
773 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
780 wc_create_gmap(wc_status *st)
782 wc_gset *gset = st->ces_info->gset;
783 wc_uchar *gset_ext = st->ces_info->gset_ext;
786 if (WcOption.strict_iso2022) {
787 for (i = 0; i < WC_F_ISO_BASE; i++) {
795 for (i = 0; i < WC_F_ISO_BASE; i++) {
796 cs94_gmap[i] = gset_ext[0];
797 cs96_gmap[i] = gset_ext[1];
798 cs94w_gmap[i] = gset_ext[2];
799 cs96w_gmap[i] = gset_ext[3];
800 cs942_gmap[i] = gset_ext[0];
803 for (i = 0; gset[i].ccs; i++) {
804 f = WC_CCS_GET_F(gset[i].ccs) - WC_F_ISO_BASE;
805 switch (WC_CCS_TYPE(gset[i].ccs)) {
807 switch (gset[i].ccs) {
808 case WC_CCS_JIS_X_0201K:
809 if (!WcOption.use_jisx0201k)
813 cs94_gmap[f] = gset[i].g;
816 switch (gset[i].ccs) {
817 case WC_CCS_JIS_X_0212:
818 if (!WcOption.use_jisx0212)
821 case WC_CCS_JIS_X_0213_1:
822 case WC_CCS_JIS_X_0213_2:
823 if (!WcOption.use_jisx0213)
827 cs94w_gmap[f] = gset[i].g;
830 cs96_gmap[f] = gset[i].g;
833 cs96w_gmap[f] = gset[i].g;
836 cs942_gmap[f] = gset[i].g;
843 wc_char_conv_from_iso2022(wc_uchar c, wc_status *st)
846 static wc_uchar buf[4];
849 wc_ccs gl_ccs, gr_ccs;
851 if (st->state == -1) {
852 st->state = WC_ISO_NOSTATE;
857 gl_ccs = st->ss ? st->design[st->ss] : st->design[st->gl];
858 gr_ccs = st->ss ? st->design[st->ss] : st->design[st->gr];
862 switch (WC_ISO_MAP[c]) {
864 if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) {
865 Strcat_char(os, (char)c);
869 if (WC_CCS_IS_WIDE(gl_ccs)) {
871 st->state = WC_ISO_MBYTE1;
873 } else if (gl_ccs == WC_CES_US_ASCII)
874 Strcat_char(os, (char)c);
876 wtf_push_iso2022(os, gl_ccs, (wc_uint32)c);
879 if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96))
882 if (WC_CCS_IS_WIDE(gr_ccs)) {
884 st->state = WC_EUC_MBYTE1;
887 wtf_push_iso2022(os, gr_ccs, (wc_uint32)c);
890 Strcat_char(os, (char)c);
896 st->state = WC_C_ESC;
917 switch (WC_ISO_MAP[c]) {
919 if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96))
923 wtf_push_iso2022(os, gl_ccs, ((wc_uint32)buf[0] << 8) | buf[1]);
926 st->state = WC_ISO_NOSTATE;
929 switch (WC_ISO_MAP[c]) {
931 if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96))
934 if (gr_ccs == WC_CCS_CNS_11643_X) {
936 st->state = WC_EUC_TW_MBYTE2;
940 wtf_push_iso2022(os, gr_ccs, ((wc_uint32)buf[0] << 8) | buf[1]);
943 st->state = WC_ISO_NOSTATE;
945 case WC_EUC_TW_MBYTE2:
946 if (WC_ISO_MAP[c] == GR) {
949 if (0xa1 <= c && c <= 0xa7) {
950 wtf_push_iso2022(os, WC_CCS_CNS_11643_1 + (c - 0xa1),
951 ((wc_uint32)buf[1] << 8) | buf[2]);
954 if (0xa8 <= c && c <= 0xb0) {
955 wtf_push_iso2022(os, WC_CCS_CNS_11643_8 + (c - 0xa8),
956 ((wc_uint32)buf[1] << 8) | buf[2]);
960 st->state = WC_ISO_NOSTATE;
969 st->state = WC_C_G0_CS94;
979 st->state = WC_C_G0_CS96;
988 st->state = WC_ISO_NOSTATE;
992 st->state = WC_ISO_NOSTATE;
1012 case WC_F_JIS_C_6226:
1013 case WC_F_JIS_X_0208:
1017 wc_parse_iso2022_esc(&p, st);
1028 st->state = WC_C_G0_CS96;
1036 st->state = WC_C_G1_CS94;
1041 wc_parse_iso2022_esc(&p, st);
1047 st->state = WC_C_G0_CS96;
1053 wc_parse_iso2022_esc(&p, st);