wc_wchar_t wc_ucs_to_any(wc_uint32 ucs, wc_table *t) { wc_wchar_t cc; wc_map *map; if (t && t->map && ucs && ucs <= WC_C_UCS2_END) { map = wc_map_search((wc_uint16)ucs, t->map, t->n); if (map) return t->conv(t->ccs, map->code2); } if (t && (ucs & ~0xFFFF) == WC_C_UCS4_PLANE2) { if (t->ccs == WC_CCS_JIS_X_0213_1) map = wc_map_search((wc_uint16)(ucs & 0xffff), ucs_p2_jisx02131_map, N_ucs_p2_jisx02131_map); else if (t->ccs == WC_CCS_JIS_X_0213_2) map = wc_map_search((wc_uint16)(ucs & 0xffff), ucs_p2_jisx02132_map, N_ucs_p2_jisx02132_map); else if (t->ccs == WC_CCS_HKSCS || t->ccs == WC_CCS_HKSCS_1 || t->ccs == WC_CCS_HKSCS_2) map = wc_map_search((wc_uint16)(ucs & 0xffff), ucs_p2_hkscs_map, N_ucs_p2_hkscs_map); else map = NULL; if (map) return t->conv(t->ccs, map->code2); } cc.ccs = WC_CCS_UNKNOWN; cc.code = 0; return cc; }
wc_uint32 wc_ucs_totitle(wc_uint32 ucs) { wc_map *conv = NULL; if (ucs <= WC_C_UCS2_END) conv = wc_map_search((wc_uint16)ucs, ucs_totitle_map, N_ucs_totitle_map); return conv ? (wc_uint32)(conv->code2) : ucs; }
wc_uint32 wc_ucs_to_fullwidth(wc_uint32 ucs) { wc_map *map; if (ucs <= WC_C_UCS2_END && (map = wc_map_search((wc_uint16)ucs, ucs_fullwidth_map, N_ucs_fullwidth_map)) != NULL) return map->code2; return WC_C_UCS4_ERROR; }
wc_wchar_t wc_tcvn57123_to_tcvn5712(wc_wchar_t cc) { wc_map *map; map = wc_map_search((wc_uint16)(cc.code & 0x7f7f), tcvn57123_tcvn5712_map, N_tcvn57123_tcvn5712_map); if (map) { cc.ccs = (map->code2 < 0x20) ? WC_CCS_TCVN_5712_2 : WC_CCS_TCVN_5712_1; cc.code = map->code2 | 0x80; } else { cc.ccs = WC_CCS_UNKNOWN; } return cc; }
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; }