Intial commit
[profile/ivi/w3m.git] / libwc / status.c
1
2 #include <string.h>
3 #include <gc.h>
4 #define New_N(type,n) ((type*)GC_MALLOC((n)*sizeof(type)))
5
6 #include "wc.h"
7 #ifdef USE_UNICODE
8 #include "ucs.h"
9 #endif
10
11 wc_option WcOption = {
12     WC_OPT_DETECT_ON,   /* auto_detect */
13     WC_TRUE,            /* use_combining */
14     WC_TRUE,            /* use_language_tag */
15     WC_TRUE,            /* ucs_conv */
16     WC_FALSE,           /* pre_conv */
17     WC_TRUE,            /* fix_width_conv */
18     WC_FALSE,           /* use_gb12345_map */
19     WC_FALSE,           /* use_jisx0201 */
20     WC_FALSE,           /* use_jisc6226 */
21     WC_FALSE,           /* use_jisx0201k */
22     WC_FALSE,           /* use_jisx0212 */
23     WC_FALSE,           /* use_jisx0213 */
24     WC_TRUE,            /* strict_iso2022 */
25     WC_FALSE,           /* gb18030_as_ucs */
26     WC_FALSE,           /* no_replace */
27     WC_TRUE,            /* use_wide */
28 };
29
30 static wc_status output_st;
31 static wc_option output_option;
32 static wc_bool output_set = WC_FALSE;
33
34 #define wc_option_cmp(opt1, opt2) \
35     memcmp((void *)(opt1), (void *)(opt2), sizeof(wc_option))
36
37 void
38 wc_input_init(wc_ces ces, wc_status *st)
39 {
40     wc_gset *gset;
41     int i, g;
42
43     st->ces_info = &WcCesInfo[WC_CES_INDEX(ces)];
44     gset = st->ces_info->gset;
45
46     st->state = 0;
47     st->g0_ccs = 0;
48     st->g1_ccs = 0;
49     st->design[0] = gset[0].ccs;
50     st->design[1] = gset[1].ccs;        /* for ISO-2022-JP/EUC-JP */ 
51     st->design[2] = 0;
52     st->design[3] = 0;
53     st->gl = 0;
54     st->gr = 1;
55     st->ss = 0;
56
57     for (i = 0; gset[i].ccs; i++) {
58         if (gset[i].init) {
59             g = gset[i].g & 0x03;
60             if (! st->design[g])
61                 st->design[g] = gset[i].ccs;
62         }
63     }
64
65 #ifdef USE_UNICODE
66     st->tag = NULL;
67     st->ntag = 0;
68 #endif
69 }
70
71 void
72 wc_output_init(wc_ces ces, wc_status *st)
73 {
74     wc_gset *gset;
75 #ifdef USE_UNICODE
76     size_t i, n, nw;
77 #endif
78
79     if (output_set && ces == output_st.ces_info->id &&
80         ! wc_option_cmp(&WcOption, &output_option)) {
81         *st = output_st;
82         return;
83     }
84
85     st->state = 0;
86     st->ces_info = &WcCesInfo[WC_CES_INDEX(ces)];
87     gset = st->ces_info->gset;
88
89     st->g0_ccs = ((ces == WC_CES_ISO_2022_JP || ces == WC_CES_ISO_2022_JP_2 ||
90         ces == WC_CES_ISO_2022_JP_3) && WcOption.use_jisx0201)
91         ? WC_CCS_JIS_X_0201 : gset[0].ccs;
92     st->g1_ccs = ((ces == WC_CES_ISO_2022_JP || ces == WC_CES_ISO_2022_JP_2 ||
93         ces == WC_CES_ISO_2022_JP_3) && WcOption.use_jisc6226)
94         ? WC_CCS_JIS_C_6226 : gset[1].ccs;
95     st->design[0] = st->g0_ccs;
96     st->design[1] = 0;
97     st->design[2] = 0;
98     st->design[3] = 0;
99     st->gl = 0;
100     st->gr = 0;
101     st->ss = 0;
102
103     if (ces & WC_CES_T_ISO_2022)
104         wc_create_gmap(st);
105
106 #ifdef USE_UNICODE
107     st->tag = NULL;
108     st->ntag = 0;
109
110     if (! WcOption.ucs_conv) {
111         st->tlist = NULL;
112         st->tlistw = NULL;
113     } else {
114
115     for (i = n = nw = 0; gset[i].ccs; i++) {
116         if (WC_CCS_IS_WIDE(gset[i].ccs))
117             nw++;
118         else
119             n++;
120     }
121     st->tlist = New_N(wc_table *, n + 1);
122     st->tlistw = New_N(wc_table *, nw + 1);
123     for (i = n = nw = 0; gset[i].ccs; i++) {
124         if (WC_CCS_IS_WIDE(gset[i].ccs)) {
125             switch (gset[i].ccs) {
126             case WC_CCS_JIS_X_0212:
127                 if (! WcOption.use_jisx0212)
128                     continue;
129                 break;
130             case WC_CCS_JIS_X_0213_1:
131             case WC_CCS_JIS_X_0213_2:
132                 if (! WcOption.use_jisx0213)
133                     continue;
134                 break;
135             case WC_CCS_GB_2312:
136                 if (WcOption.use_gb12345_map &&
137                     ces != WC_CES_GBK && ces != WC_CES_GB18030) {
138                     st->tlistw[nw++] = wc_get_ucs_table(WC_CCS_GB_12345);
139                     continue;
140                 }
141                 break;
142             }
143             st->tlistw[nw++] = wc_get_ucs_table(gset[i].ccs);
144         } else {
145             switch (gset[i].ccs) {
146             case WC_CCS_JIS_X_0201K:
147                 if (! WcOption.use_jisx0201k)
148                     continue;
149                 break;
150             }
151             st->tlist[n++] = wc_get_ucs_table(gset[i].ccs);
152         }
153     }
154     st->tlist[n] = NULL;
155     st->tlistw[nw] = NULL;
156     }
157 #endif
158
159     output_st = *st;
160     output_set = WC_TRUE;
161     output_option = WcOption;
162 }
163
164 wc_bool
165 wc_ces_has_ccs(wc_ccs ccs, wc_status *st)
166 {
167     wc_gset *gset = st->ces_info->gset;
168     int i;
169
170     for (i = 0; gset[i].ccs; i++) {
171         if (ccs == gset[i].ccs)
172             return WC_TRUE;
173     }
174     return WC_FALSE;
175 }