void wc_push_to_gb18030(Str os, wc_wchar_t cc, wc_status *st) { while (1) { switch (WC_CCS_SET(cc.ccs)) { case WC_CCS_US_ASCII: Strcat_char(os, (char)cc.code); return; case WC_CCS_GB_2312: Strcat_char(os, (char)((cc.code >> 8) | 0x80)); Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); return; case WC_CCS_GBK_1: case WC_CCS_GBK_2: cc = wc_cs128w_to_gbk(cc); case WC_CCS_GBK: Strcat_char(os, (char)(cc.code >> 8)); Strcat_char(os, (char)(cc.code & 0xff)); return; case WC_CCS_GBK_EXT_1: case WC_CCS_GBK_EXT_2: cc = wc_cs128w_to_gbk(cc); case WC_CCS_GBK_EXT: Strcat_char(os, (char)(cc.code >> 8)); Strcat_char(os, (char)(cc.code & 0xff)); return; case WC_CCS_GB18030: Strcat_char(os, (char)((cc.code >> 24) & 0xff)); Strcat_char(os, (char)((cc.code >> 16) & 0xff)); Strcat_char(os, (char)((cc.code >> 8) & 0xff)); Strcat_char(os, (char)(cc.code & 0xff)); return; case WC_CCS_UNKNOWN_W: if (!WcOption.no_replace) Strcat_charp(os, WC_REPLACE_W); return; case WC_CCS_UNKNOWN: if (!WcOption.no_replace) Strcat_charp(os, WC_REPLACE); return; default: #ifdef USE_UNICODE if (WcOption.ucs_conv) cc = wc_any_to_any_ces(cc, st); else #endif cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; continue; } } }
wc_wchar_t wc_any_to_any(wc_wchar_t cc, wc_table *t) { wc_ccs is_wide = WC_CCS_IS_WIDE(cc.ccs); wc_uint32 ucs = wc_any_to_ucs(cc); if (ucs != WC_C_UCS4_ERROR) { cc = wc_ucs_to_any(ucs, t); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; ucs = wc_ucs_to_fullwidth(ucs); if (ucs != WC_C_UCS4_ERROR) { cc = wc_ucs_to_any(ucs, t); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; } } cc.ccs = is_wide ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; return cc; }
wc_wchar_t wc_any_to_iso2022(wc_wchar_t cc, wc_status *st) { wc_uint32 ucs = wc_any_to_ucs(cc); wc_ccs is_wide = WC_CCS_IS_WIDE(cc.ccs); if (ucs < 0x80) { cc.ccs = WC_CCS_US_ASCII; cc.code = ucs; return cc; } if (ucs != WC_C_UCS4_ERROR) { cc = wc_ucs_to_any_list(ucs, is_wide ? st->tlistw : st->tlist); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; if (! WcOption.strict_iso2022) { cc = (is_wide) ? wc_ucs_to_iso2022w(ucs) : wc_ucs_to_iso2022(ucs); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; } if (! WcOption.fix_width_conv) { cc = wc_ucs_to_any_list(ucs, is_wide ? st->tlist : st->tlistw); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; if (! WcOption.strict_iso2022) { cc = (is_wide) ? wc_ucs_to_iso2022(ucs) : wc_ucs_to_iso2022w(ucs); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; } } if (ucs == WC_C_UCS2_NBSP) { /* NBSP -> SP */ cc.ccs = WC_CCS_US_ASCII; cc.code = 0x20; return cc; } ucs = wc_ucs_to_fullwidth(ucs); if (ucs != WC_C_UCS4_ERROR) { cc = wc_ucs_to_any_list(ucs, is_wide ? st->tlistw : st->tlist); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; if (! WcOption.strict_iso2022) { cc = (is_wide) ? wc_ucs_to_iso2022w(ucs) : wc_ucs_to_iso2022(ucs); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; } if (! WcOption.fix_width_conv) { cc = wc_ucs_to_any_list(ucs, is_wide ? st->tlist : st->tlistw); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; if (! WcOption.strict_iso2022) { cc = (is_wide) ? wc_ucs_to_iso2022(ucs) : wc_ucs_to_iso2022w(ucs); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; } } } if (ucs == WC_C_UCS2_NBSP) { /* NBSP -> SP */ cc.ccs = WC_CCS_US_ASCII; cc.code = 0x20; return cc; } } cc.ccs = is_wide ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; return cc; }
wc_wchar_t wc_any_to_any_ces(wc_wchar_t cc, wc_status *st) { wc_uint32 ucs = wc_any_to_ucs(cc); wc_ccs is_wide = WC_CCS_IS_WIDE(cc.ccs); if (ucs < 0x80) { cc.ccs = WC_CCS_US_ASCII; cc.code = ucs; return cc; } if (ucs != WC_C_UCS4_ERROR) { if (st->ces_info->id & WC_CES_T_UTF) { cc.ccs = wc_ucs_to_ccs(ucs); cc.code = ucs; return cc; } else if (st->ces_info->id == WC_CES_JOHAB) { cc = wc_ucs_to_johab(ucs); if (WC_CCS_IS_UNKNOWN(cc.ccs)) cc.ccs = is_wide ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; return cc; } cc = wc_ucs_to_any_list(ucs, is_wide ? st->tlistw : st->tlist); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; if (! WcOption.fix_width_conv) { cc = wc_ucs_to_any_list(ucs, is_wide ? st->tlist : st->tlistw); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; } if (st->ces_info->id == WC_CES_GB18030) { cc = wc_ucs_to_gb18030(ucs); if (WC_CCS_IS_UNKNOWN(cc.ccs)) cc.ccs = is_wide ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; return cc; } if (ucs == WC_C_UCS2_NBSP) { /* NBSP -> SP */ cc.ccs = WC_CCS_US_ASCII; cc.code = 0x20; return cc; } if (st->ces_info->id & (WC_CES_T_ISO_8859|WC_CES_T_EUC) && 0x80 <= ucs && ucs <= 0x9F) { cc.ccs = WC_CCS_C1; cc.code = ucs; return cc; } ucs = wc_ucs_to_fullwidth(ucs); if (ucs != WC_C_UCS4_ERROR) { cc = wc_ucs_to_any_list(ucs, is_wide ? st->tlistw : st->tlist); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; if (! WcOption.fix_width_conv) { cc = wc_ucs_to_any_list(ucs, is_wide ? st->tlist : st->tlistw); if (!WC_CCS_IS_UNKNOWN(cc.ccs)) return cc; } } } cc.ccs = is_wide ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; return cc; }
void wc_push_to_viet(Str os, wc_wchar_t cc, wc_status *st) { wc_ccs ccs1 = st->ces_info->gset[1].ccs; wc_ccs ccs2 = 0, ccs3 = 0; wc_uint8 *map = NULL; switch (st->ces_info->id) { case WC_CES_CP1258: ccs3 = st->ces_info->gset[2].ccs; break; case WC_CES_TCVN_5712: map = wc_c0_tcvn57122_map; ccs2 = st->ces_info->gset[2].ccs; ccs3 = st->ces_info->gset[3].ccs; break; case WC_CES_VISCII_11: map = wc_c0_viscii112_map; ccs2 = st->ces_info->gset[2].ccs; break; case WC_CES_VPS: map = wc_c0_vps2_map; ccs2 = st->ces_info->gset[2].ccs; break; } while (1) { if (cc.ccs == ccs1) { Strcat_char(os, (char)(cc.code | 0x80)); return; } else if (cc.ccs == ccs2) { Strcat_char(os, (char)(cc.code & 0x7f)); return; } else if (cc.ccs == ccs3) { Strcat_char(os, (char)((cc.code >> 8) & 0xff)); Strcat_char(os, (char)(cc.code & 0xff)); return; } switch (cc.ccs) { case WC_CCS_US_ASCII: if (cc.code < 0x20 && map && map[cc.code]) Strcat_char(os, ' '); else Strcat_char(os, (char)cc.code); return; case WC_CCS_UNKNOWN_W: if (!WcOption.no_replace) Strcat_charp(os, WC_REPLACE_W); return; case WC_CCS_UNKNOWN: if (!WcOption.no_replace) Strcat_charp(os, WC_REPLACE); return; default: #ifdef USE_UNICODE if (WcOption.ucs_conv) cc = wc_any_to_any_ces(cc, st); else #endif cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; continue; } }