diff options
Diffstat (limited to 'libwc/status.c')
-rw-r--r-- | libwc/status.c | 175 |
1 files changed, 175 insertions, 0 deletions
diff --git a/libwc/status.c b/libwc/status.c new file mode 100644 index 0000000..ad98196 --- /dev/null +++ b/libwc/status.c @@ -0,0 +1,175 @@ + +#include <string.h> +#include <gc.h> +#define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type))) + +#include "wc.h" +#ifdef USE_UNICODE +#include "ucs.h" +#endif + +wc_option WcOption = { + WC_OPT_DETECT_ON, /* auto_detect */ + WC_TRUE, /* use_combining */ + WC_TRUE, /* use_language_tag */ + WC_TRUE, /* ucs_conv */ + WC_FALSE, /* pre_conv */ + WC_TRUE, /* fix_width_conv */ + WC_FALSE, /* use_gb12345_map */ + WC_FALSE, /* use_jisx0201 */ + WC_FALSE, /* use_jisc6226 */ + WC_FALSE, /* use_jisx0201k */ + WC_FALSE, /* use_jisx0212 */ + WC_FALSE, /* use_jisx0213 */ + WC_TRUE, /* strict_iso2022 */ + WC_FALSE, /* gb18030_as_ucs */ + WC_FALSE, /* no_replace */ + WC_TRUE, /* use_wide */ +}; + +static wc_status output_st; +static wc_option output_option; +static wc_bool output_set = WC_FALSE; + +#define wc_option_cmp(opt1, opt2) \ + memcmp((void *)(opt1), (void *)(opt2), sizeof(wc_option)) + +void +wc_input_init(wc_ces ces, wc_status *st) +{ + wc_gset *gset; + int i, g; + + st->ces_info = &WcCesInfo[WC_CES_INDEX(ces)]; + gset = st->ces_info->gset; + + st->state = 0; + st->g0_ccs = 0; + st->g1_ccs = 0; + st->design[0] = gset[0].ccs; + st->design[1] = gset[1].ccs; /* for ISO-2022-JP/EUC-JP */ + st->design[2] = 0; + st->design[3] = 0; + st->gl = 0; + st->gr = 1; + st->ss = 0; + + for (i = 0; gset[i].ccs; i++) { + if (gset[i].init) { + g = gset[i].g & 0x03; + if (! st->design[g]) + st->design[g] = gset[i].ccs; + } + } + +#ifdef USE_UNICODE + st->tag = NULL; + st->ntag = 0; +#endif +} + +void +wc_output_init(wc_ces ces, wc_status *st) +{ + wc_gset *gset; +#ifdef USE_UNICODE + size_t i, n, nw; +#endif + + if (output_set && ces == output_st.ces_info->id && + ! wc_option_cmp(&WcOption, &output_option)) { + *st = output_st; + return; + } + + st->state = 0; + st->ces_info = &WcCesInfo[WC_CES_INDEX(ces)]; + gset = st->ces_info->gset; + + st->g0_ccs = ((ces == WC_CES_ISO_2022_JP || ces == WC_CES_ISO_2022_JP_2 || + ces == WC_CES_ISO_2022_JP_3) && WcOption.use_jisx0201) + ? WC_CCS_JIS_X_0201 : gset[0].ccs; + st->g1_ccs = ((ces == WC_CES_ISO_2022_JP || ces == WC_CES_ISO_2022_JP_2 || + ces == WC_CES_ISO_2022_JP_3) && WcOption.use_jisc6226) + ? WC_CCS_JIS_C_6226 : gset[1].ccs; + st->design[0] = st->g0_ccs; + st->design[1] = 0; + st->design[2] = 0; + st->design[3] = 0; + st->gl = 0; + st->gr = 0; + st->ss = 0; + + if (ces & WC_CES_T_ISO_2022) + wc_create_gmap(st); + +#ifdef USE_UNICODE + st->tag = NULL; + st->ntag = 0; + + if (! WcOption.ucs_conv) { + st->tlist = NULL; + st->tlistw = NULL; + } else { + + for (i = n = nw = 0; gset[i].ccs; i++) { + if (WC_CCS_IS_WIDE(gset[i].ccs)) + nw++; + else + n++; + } + st->tlist = New_N(wc_table *, n + 1); + st->tlistw = New_N(wc_table *, nw + 1); + for (i = n = nw = 0; gset[i].ccs; i++) { + if (WC_CCS_IS_WIDE(gset[i].ccs)) { + switch (gset[i].ccs) { + case WC_CCS_JIS_X_0212: + if (! WcOption.use_jisx0212) + continue; + break; + case WC_CCS_JIS_X_0213_1: + case WC_CCS_JIS_X_0213_2: + if (! WcOption.use_jisx0213) + continue; + break; + case WC_CCS_GB_2312: + if (WcOption.use_gb12345_map && + ces != WC_CES_GBK && ces != WC_CES_GB18030) { + st->tlistw[nw++] = wc_get_ucs_table(WC_CCS_GB_12345); + continue; + } + break; + } + st->tlistw[nw++] = wc_get_ucs_table(gset[i].ccs); + } else { + switch (gset[i].ccs) { + case WC_CCS_JIS_X_0201K: + if (! WcOption.use_jisx0201k) + continue; + break; + } + st->tlist[n++] = wc_get_ucs_table(gset[i].ccs); + } + } + st->tlist[n] = NULL; + st->tlistw[nw] = NULL; + } +#endif + + output_st = *st; + output_set = WC_TRUE; + output_option = WcOption; +} + +wc_bool +wc_ces_has_ccs(wc_ccs ccs, wc_status *st) +{ + wc_gset *gset = st->ces_info->gset; + int i; + + for (i = 0; gset[i].ccs; i++) { + if (ccs == gset[i].ccs) + return WC_TRUE; + } + return WC_FALSE; +} |