Str wc_conv_from_viet(Str is, wc_ces ces) { Str os; wc_uchar *sp = (wc_uchar *)is->ptr; wc_uchar *ep = sp + is->length; wc_uchar *p; wc_ccs ccs1 = WcCesInfo[WC_CCS_INDEX(ces)].gset[1].ccs; wc_ccs ccs2 = WcCesInfo[WC_CCS_INDEX(ces)].gset[2].ccs; wc_uint8 *map = NULL; switch (ces) { case WC_CES_TCVN_5712: map = wc_c0_tcvn57122_map; break; case WC_CES_VISCII_11: map = wc_c0_viscii112_map; break; case WC_CES_VPS: map = wc_c0_vps2_map; break; } wc_create_detect_map(ces, WC_FALSE); for (p = sp; p < ep && ! WC_DETECT_MAP[*p]; p++) ; if (p == ep) return is; os = Strnew_size(is->length); if (p > sp) Strcat_charp_n(os, is->ptr, (int)(p - sp)); for (; p < ep; p++) { if (*p & 0x80) wtf_push(os, ccs1, (wc_uint32)*p); else if (*p < 0x20 && map[*p]) wtf_push(os, ccs2, (wc_uint32)*p); else Strcat_char(os, (char)*p); } return os; }
wc_table * wc_get_ucs_table(wc_ccs ccs) { int f = WC_CCS_INDEX(ccs); switch (WC_CCS_TYPE(ccs)) { case WC_CCS_A_CS94: if (f < WC_F_ISO_BASE || f > WC_F_CS94_END) return NULL; return &ucs_cs94_table[f - WC_F_ISO_BASE]; case WC_CCS_A_CS94W: if (f < WC_F_ISO_BASE || f > WC_F_CS94W_END) return NULL; return &ucs_cs94w_table[f - WC_F_ISO_BASE]; case WC_CCS_A_CS96: if (f < WC_F_ISO_BASE || f > WC_F_CS96_END) return NULL; return &ucs_cs96_table[f - WC_F_ISO_BASE]; case WC_CCS_A_CS96W: if (f < WC_F_ISO_BASE || f > WC_F_CS96W_END) return NULL; return &ucs_cs96w_table[f - WC_F_ISO_BASE]; case WC_CCS_A_CS942: if (f < WC_F_ISO_BASE || f > WC_F_CS942_END) return NULL; return &ucs_cs942_table[f - WC_F_ISO_BASE]; case WC_CCS_A_PCS: if (f < WC_F_PCS_BASE || f > WC_F_PCS_END) return NULL; return &ucs_pcs_table[f - WC_F_PCS_BASE]; case WC_CCS_A_PCSW: if (f < WC_F_PCS_BASE || f > WC_F_PCSW_END) return NULL; return &ucs_pcsw_table[f - WC_F_PCS_BASE]; default: return NULL; } }
wc_uint32 wc_any_to_ucs(wc_wchar_t cc) { int f; wc_uint16 *map = NULL; wc_uint32 map_size = 0x80; wc_map *map2; f = WC_CCS_INDEX(cc.ccs); switch (WC_CCS_TYPE(cc.ccs)) { case WC_CCS_A_CS94: if (cc.ccs == WC_CCS_US_ASCII) return cc.code; if (f < WC_F_ISO_BASE || f > WC_F_CS94_END) return WC_C_UCS4_ERROR; map = cs94_ucs_map[f - WC_F_ISO_BASE]; cc.code &= 0x7f; break; case WC_CCS_A_CS94W: if (cc.ccs == WC_CCS_GB_2312 && WcOption.use_gb12345_map) { cc.ccs = WC_CCS_GB_12345; return wc_any_to_ucs(cc); } else if (cc.ccs == WC_CCS_JIS_X_0213_1) { map2 = wc_map_search((wc_uint16)(cc.code & 0x7f7f), jisx02131_ucs_p2_map, N_jisx02131_ucs_p2_map); if (map2) return map2->code2 | WC_C_UCS4_PLANE2; } else if (cc.ccs == WC_CCS_JIS_X_0213_2) { map2 = wc_map_search((wc_uint16)(cc.code & 0x7f7f), jisx02132_ucs_p2_map, N_jisx02132_ucs_p2_map); if (map2) return map2->code2 | WC_C_UCS4_PLANE2; } if (f < WC_F_ISO_BASE || f > WC_F_CS94W_END) return 0; map = cs94w_ucs_map[f - WC_F_ISO_BASE]; map_size = cs94w_ucs_map_size[f - WC_F_ISO_BASE]; cc.code = WC_CS94W_N(cc.code); break; case WC_CCS_A_CS96: if (f < WC_F_ISO_BASE || f > WC_F_CS96_END) return WC_C_UCS4_ERROR; map = cs96_ucs_map[f - WC_F_ISO_BASE]; cc.code &= 0x7f; break; case WC_CCS_A_CS96W: if (f < WC_F_ISO_BASE || f > WC_F_CS96W_END) return WC_C_UCS4_ERROR; map = cs96w_ucs_map[f - WC_F_ISO_BASE]; map_size = cs96w_ucs_map_size[f - WC_F_ISO_BASE]; cc.code = WC_CS96W_N(cc.code); break; case WC_CCS_A_CS942: if (f < WC_F_ISO_BASE || f > WC_F_CS942_END) return WC_C_UCS4_ERROR; map = cs942_ucs_map[f - WC_F_ISO_BASE]; cc.code &= 0x7f; break; case WC_CCS_A_PCS: if (f < WC_F_PCS_BASE || f > WC_F_PCS_END) return WC_C_UCS4_ERROR; switch (cc.ccs) { case WC_CCS_CP1258_2: map2 = wc_map_search((wc_uint16)cc.code, cp12582_ucs_map, N_cp12582_ucs_map); if (map2) return map2->code2; return WC_C_UCS4_ERROR; case WC_CCS_TCVN_5712_3: return wc_any_to_ucs(wc_tcvn57123_to_tcvn5712(cc)); case WC_CCS_GBK_80: return WC_C_UCS2_EURO; } map = pcs_ucs_map[f - WC_F_PCS_BASE]; map_size = pcs_ucs_map_size[f - WC_F_PCS_BASE]; cc.code &= 0x7f; break; case WC_CCS_A_PCSW: if (f < WC_F_PCS_BASE || f > WC_F_PCSW_END) return WC_C_UCS4_ERROR; map = pcsw_ucs_map[f - WC_F_PCS_BASE]; map_size = pcsw_ucs_map_size[f - WC_F_PCS_BASE]; switch (cc.ccs) { case WC_CCS_BIG5: cc.code = WC_BIG5_N(cc.code); break; case WC_CCS_BIG5_2: cc.code = WC_CS94W_N(cc.code) + WC_C_BIG5_2_BASE; break; case WC_CCS_HKSCS_1: case WC_CCS_HKSCS_2: cc = wc_cs128w_to_hkscs(cc); case WC_CCS_HKSCS: map2 = wc_map_search((wc_uint16)cc.code, hkscs_ucs_p2_map, N_hkscs_ucs_p2_map); if (map2) return map2->code2 | WC_C_UCS4_PLANE2; cc.code = wc_hkscs_to_N(cc.code); break; case WC_CCS_JOHAB: return wc_any_to_ucs(wc_johab_to_cs128w(cc)); case WC_CCS_JOHAB_1: return WC_CS94x128_N(cc.code) + WC_C_UCS2_HANGUL; case WC_CCS_JOHAB_2: cc.code = WC_CS128W_N(cc.code); cc.code = WC_N_JOHAB2(cc.code); map2 = wc_map_search((wc_uint16)cc.code, johab2_ucs_map, N_johab2_ucs_map); if (map2) return map2->code2; return WC_C_UCS4_ERROR; case WC_CCS_JOHAB_3: if ((cc.code & 0x7f7f) < 0x2121) return WC_C_UCS4_ERROR; case WC_CCS_SJIS_EXT: return wc_any_to_ucs(wc_sjis_ext_to_cs94w(cc)); case WC_CCS_SJIS_EXT_1: cc.code = wc_sjis_ext1_to_N(cc.code); if (cc.code == WC_C_SJIS_ERROR) return WC_C_UCS4_ERROR; break; case WC_CCS_SJIS_EXT_2: cc.code = wc_sjis_ext2_to_N(cc.code); if (cc.code == WC_C_SJIS_ERROR) return WC_C_UCS4_ERROR; break; case WC_CCS_GBK_1: case WC_CCS_GBK_2: cc = wc_cs128w_to_gbk(cc); case WC_CCS_GBK: cc.code = wc_gbk_to_N(cc.code); break; case WC_CCS_GBK_EXT: case WC_CCS_GBK_EXT_1: case WC_CCS_GBK_EXT_2: return wc_gb18030_to_ucs(cc); case WC_CCS_UHC_1: case WC_CCS_UHC_2: cc = wc_cs128w_to_uhc(cc); case WC_CCS_UHC: if (cc.code > WC_C_UHC_END) return WC_C_UCS4_ERROR; cc.code = wc_uhc_to_N(cc.code); break; default: cc.code = WC_CS94W_N(cc.code); break; } break; case WC_CCS_A_WCS16: switch (WC_CCS_SET(cc.ccs)) { case WC_CCS_UCS2: return cc.code; } return WC_C_UCS4_ERROR; case WC_CCS_A_WCS32: switch (WC_CCS_SET(cc.ccs)) { case WC_CCS_UCS4: return cc.code; case WC_CCS_UCS_TAG: return wc_ucs_tag_to_ucs(cc.code); case WC_CCS_GB18030: return wc_gb18030_to_ucs(cc); } return WC_C_UCS4_ERROR; case WC_CCS_A_UNKNOWN: if (cc.ccs == WC_CCS_C1) return (cc.code | 0x80); default: return WC_C_UCS4_ERROR; } if (map == NULL) return WC_C_UCS4_ERROR; if (map_size == 0 || cc.code > map_size - 1) return WC_C_UCS4_ERROR; cc.code = map[cc.code]; return cc.code ? cc.code : WC_C_UCS4_ERROR; }