Line | Count | Source |
1 | | |
2 | | #include "wc.h" |
3 | | #include "iso2022.h" |
4 | | #include "jis.h" |
5 | | #include "big5.h" |
6 | | #include "johab.h" |
7 | | #include "wtf.h" |
8 | | #ifdef USE_UNICODE |
9 | | #include "ucs.h" |
10 | | #endif |
11 | | |
12 | 1.94M | #define C0 WC_ISO_MAP_C0 |
13 | 9.27M | #define C1 WC_ISO_MAP_C1 |
14 | 6.96M | #define GL WC_ISO_MAP_GL |
15 | 41.2M | #define GR WC_ISO_MAP_GR |
16 | 41.0k | #define GL2 WC_ISO_MAP_GL96 |
17 | 543k | #define GR2 WC_ISO_MAP_GR96 |
18 | 10.1k | #define SO WC_ISO_MAP_SO |
19 | 11.3k | #define SI WC_ISO_MAP_SI |
20 | 58.1k | #define ESC WC_ISO_MAP_ESC |
21 | 11.5k | #define SS2 WC_ISO_MAP_SS2 |
22 | 12.4k | #define SS3 WC_ISO_MAP_SS3 |
23 | | |
24 | | wc_uint8 WC_ISO_MAP[ 0x100 ] = { |
25 | | C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, SO, SI, |
26 | | C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, ESC,C0, C0, C0, C0, |
27 | | GL2,GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, |
28 | | GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, |
29 | | GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, |
30 | | GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, |
31 | | GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, |
32 | | GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL2, |
33 | | |
34 | | C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, SS2,SS3, |
35 | | C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, C1, |
36 | | GR2,GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, |
37 | | GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, |
38 | | GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, |
39 | | GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, |
40 | | GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, |
41 | | GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR, GR2, |
42 | | }; |
43 | | |
44 | | static wc_uchar cs94_gmap[ 0x80 - WC_F_ISO_BASE ]; |
45 | | static wc_uchar cs94w_gmap[ 0x80 - WC_F_ISO_BASE ]; |
46 | | static wc_uchar cs96_gmap[ 0x80 - WC_F_ISO_BASE ]; |
47 | | static wc_uchar cs96w_gmap[ 0x80 - WC_F_ISO_BASE ]; |
48 | | static wc_uchar cs942_gmap[ 0x80 - WC_F_ISO_BASE ]; |
49 | | |
50 | | static void |
51 | | wtf_push_iso2022(Str os, wc_ccs ccs, wc_uint32 code) |
52 | 43.4M | { |
53 | 43.4M | switch (ccs) { |
54 | 1.79k | case WC_CCS_JIS_C_6226: |
55 | 2.21M | case WC_CCS_JIS_X_0208: |
56 | 2.23M | case WC_CCS_JIS_X_0213_1: |
57 | 2.23M | ccs = wc_jisx0208_or_jisx02131(code); |
58 | 2.23M | break; |
59 | 15.5k | case WC_CCS_JIS_X_0212: |
60 | 16.8k | case WC_CCS_JIS_X_0213_2: |
61 | 16.8k | ccs = wc_jisx0212_or_jisx02132(code); |
62 | 16.8k | break; |
63 | 1.41k | case WC_CCS_JIS_X_0201: |
64 | 223k | case WC_CCS_GB_1988: |
65 | 223k | ccs = WC_CCS_US_ASCII; |
66 | 223k | break; |
67 | 43.4M | } |
68 | 43.4M | wtf_push(os, ccs, code); |
69 | 43.4M | } |
70 | | |
71 | | Str |
72 | | wc_conv_from_iso2022(Str is, wc_ces ces) |
73 | 2.85k | { |
74 | 2.85k | Str os; |
75 | 2.85k | wc_uchar *sp = (wc_uchar *)is->ptr; |
76 | 2.85k | wc_uchar *ep = sp + is->length; |
77 | 2.85k | wc_uchar *p, *q = NULL; |
78 | 2.85k | int state = WC_ISO_NOSTATE; |
79 | 2.85k | wc_status st; |
80 | 2.85k | wc_ccs gl_ccs, gr_ccs; |
81 | | |
82 | 56.6k | for (p = sp; p < ep && !(WC_ISO_MAP[*p] & WC_ISO_MAP_DETECT); p++) |
83 | 53.7k | ; |
84 | 2.85k | if (p == ep) |
85 | 299 | return is; |
86 | 2.55k | os = Strnew_size(is->length); |
87 | 2.55k | if (p > sp) |
88 | 326 | Strcat_charp_n(os, is->ptr, (int)(p - sp)); |
89 | | |
90 | 2.55k | wc_input_init(ces, &st); |
91 | 2.55k | gl_ccs = st.design[st.gl]; |
92 | 2.55k | gr_ccs = st.design[st.gr]; |
93 | | |
94 | 60.6M | for (; p < ep; p++) { |
95 | 60.6M | switch (state) { |
96 | 55.8M | case WC_ISO_NOSTATE: |
97 | 55.8M | switch (WC_ISO_MAP[*p]) { |
98 | 35.0k | case GL2: |
99 | 35.0k | gl_ccs = st.ss ? st.design[st.ss] |
100 | 35.0k | : st.design[st.gl]; |
101 | 35.0k | if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) { |
102 | 29.4k | Strcat_char(os, (char)*p); |
103 | 29.4k | break; |
104 | 29.4k | } |
105 | 5.84M | case GL: |
106 | 5.84M | gl_ccs = st.ss ? st.design[st.ss] |
107 | 5.84M | : st.design[st.gl]; |
108 | 5.84M | if (WC_CCS_IS_WIDE(gl_ccs)) { |
109 | 1.39M | q = p; |
110 | 1.39M | state = WC_ISO_MBYTE1; |
111 | 1.39M | continue; |
112 | 4.44M | } else if (gl_ccs == WC_CES_US_ASCII) |
113 | 0 | Strcat_char(os, (char)*p); |
114 | 4.44M | else |
115 | 4.44M | wtf_push_iso2022(os, gl_ccs, (wc_uint32)*p); |
116 | 4.44M | break; |
117 | 4.44M | case GR2: |
118 | 535k | gr_ccs = st.ss ? st.design[st.ss] |
119 | 535k | : st.design[st.gr]; |
120 | 535k | if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) { |
121 | 422k | wtf_push_unknown(os, p, 1); |
122 | 422k | break; |
123 | 422k | } |
124 | 38.2M | case GR: |
125 | 38.2M | gr_ccs = st.ss ? st.design[st.ss] |
126 | 38.2M | : st.design[st.gr]; |
127 | 38.2M | if (WC_CCS_IS_WIDE(gr_ccs)) { |
128 | 2.74M | q = p; |
129 | 2.74M | state = WC_EUC_MBYTE1; |
130 | 2.74M | continue; |
131 | 35.5M | } else if (gr_ccs) |
132 | 35.3M | wtf_push_iso2022(os, gr_ccs, (wc_uint32)*p); |
133 | 136k | else |
134 | 136k | wtf_push_unknown(os, p, 1); |
135 | 35.5M | break; |
136 | 35.5M | case C0: |
137 | 1.94M | Strcat_char(os, (char)*p); |
138 | 1.94M | break; |
139 | 9.27M | case C1: |
140 | 9.27M | wtf_push(os, WC_CCS_C1, (wc_uint32)*p); |
141 | 9.27M | break; |
142 | 58.1k | case ESC: |
143 | 58.1k | st.ss = 0; |
144 | 58.1k | if (wc_parse_iso2022_esc(&p, &st)) |
145 | 14.5k | state = st.state; |
146 | 43.6k | else |
147 | 43.6k | Strcat_char(os, (char)*p); |
148 | 58.1k | continue; |
149 | 11.3k | case SI: |
150 | 11.3k | st.gl = 0; |
151 | 11.3k | break; |
152 | 10.1k | case SO: |
153 | 10.1k | st.gl = 1; |
154 | 10.1k | break; |
155 | 11.5k | case SS2: |
156 | 11.5k | if (! st.design[2]) { |
157 | 2.79k | wtf_push_unknown(os, p, 1); |
158 | 2.79k | break; |
159 | 2.79k | } |
160 | 8.72k | st.ss = 2; |
161 | 8.72k | continue; |
162 | 12.4k | case SS3: |
163 | 12.4k | if (! st.design[3]) { |
164 | 3.18k | wtf_push_unknown(os, p, 1); |
165 | 3.18k | break; |
166 | 3.18k | } |
167 | 9.28k | st.ss = 3; |
168 | 9.28k | continue; |
169 | 55.8M | } |
170 | 51.6M | break; |
171 | 51.6M | case WC_ISO_MBYTE1: |
172 | 1.39M | switch (WC_ISO_MAP[*p]) { |
173 | 6.00k | case GL2: |
174 | 6.00k | if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) { |
175 | 5.66k | Strcat_char(os, (char)*q); |
176 | 5.66k | Strcat_char(os, (char)*p); |
177 | 5.66k | break; |
178 | 5.66k | } |
179 | 1.11M | case GL: |
180 | 1.11M | wtf_push_iso2022(os, gl_ccs, ((wc_uint32)*q << 8) | *p); |
181 | 1.11M | break; |
182 | 275k | default: |
183 | 275k | wtf_push_unknown(os, q, 2); |
184 | 275k | break; |
185 | 1.39M | } |
186 | 1.39M | break; |
187 | 2.74M | case WC_EUC_MBYTE1: |
188 | 2.74M | switch (WC_ISO_MAP[*p]) { |
189 | 7.52k | case GR2: |
190 | 7.52k | if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) { |
191 | 7.23k | wtf_push_unknown(os, q, 2); |
192 | 7.23k | break; |
193 | 7.23k | } |
194 | 2.59M | case GR: |
195 | 2.59M | if (gr_ccs == WC_CCS_CNS_11643_X) { |
196 | 432k | state = WC_EUC_TW_MBYTE2; |
197 | 432k | continue; |
198 | 432k | } |
199 | 2.16M | wtf_push_iso2022(os, gr_ccs, ((wc_uint32)*q << 8) | *p); |
200 | 2.16M | break; |
201 | 137k | default: |
202 | 137k | wtf_push_unknown(os, q, 2); |
203 | 137k | break; |
204 | 2.74M | } |
205 | 2.30M | break; |
206 | 2.30M | case WC_EUC_TW_MBYTE2: |
207 | 432k | if (WC_ISO_MAP[*p] == GR) { |
208 | 426k | if (0xa1 <= *q && *q <= 0xa7) { |
209 | 25.5k | wtf_push_iso2022(os, WC_CCS_CNS_11643_1 + (*q - 0xa1), |
210 | 25.5k | ((wc_uint32)*(q+1) << 8) | *p); |
211 | 25.5k | break; |
212 | 25.5k | } |
213 | 400k | if (0xa8 <= *q && *q <= 0xb0) { |
214 | 368k | wtf_push_iso2022(os, WC_CCS_CNS_11643_8 + (*q - 0xa8), |
215 | 368k | ((wc_uint32)*(q+1) << 8) | *p); |
216 | 368k | break; |
217 | 368k | } |
218 | 400k | } |
219 | 38.4k | wtf_push_unknown(os, q, 3); |
220 | 38.4k | break; |
221 | 223k | case WC_ISO_CSWSR: |
222 | 223k | if (*p == WC_C_ESC && *(p+1) == WC_C_CSWSR) { |
223 | 1.31k | if (*(p+2) == WC_F_ISO_BASE) { |
224 | 392 | state = st.state = WC_ISO_NOSTATE; |
225 | 392 | p += 2; |
226 | 392 | continue; |
227 | 923 | } else if (*(p+2) > WC_F_ISO_BASE && *(p+2) <= 0x7e) { |
228 | 241 | p += 2; |
229 | 241 | continue; |
230 | 241 | } |
231 | 1.31k | } |
232 | 223k | wtf_push_unknown(os, p, 1); |
233 | 223k | continue; |
234 | 0 | case WC_ISO_CSWOSR: |
235 | 0 | wtf_push_unknown(os, p, ep - p); |
236 | 0 | return os; |
237 | 0 | break; |
238 | 60.6M | } |
239 | 55.8M | st.ss = 0; |
240 | 55.8M | state = WC_ISO_NOSTATE; |
241 | 55.8M | } |
242 | 2.55k | switch (state) { |
243 | 62 | case WC_ISO_MBYTE1: |
244 | 114 | case WC_EUC_MBYTE1: |
245 | 114 | wtf_push_unknown(os, p-1, 1); |
246 | 114 | break; |
247 | 0 | case WC_EUC_TW_MBYTE1: |
248 | 0 | wtf_push_unknown(os, p-2, 2); |
249 | 0 | break; |
250 | 2.55k | } |
251 | 2.55k | return os; |
252 | 2.55k | } |
253 | | |
254 | | int |
255 | | wc_parse_iso2022_esc(wc_uchar **ptr, wc_status *st) |
256 | 63.3k | { |
257 | 63.3k | wc_uchar *p = *ptr, state, f = 0, g = 0, cs = 0; |
258 | | |
259 | 63.3k | if (*p != WC_C_ESC) |
260 | 0 | return 0; |
261 | 63.3k | state = *p; |
262 | 143k | for (p++; *p && state; p++) { |
263 | 107k | switch (state) { |
264 | 61.3k | case WC_C_ESC: /* ESC */ |
265 | 61.3k | switch (*p) { |
266 | 15.3k | case WC_C_MBCS: /* ESC '$' */ |
267 | 15.3k | state = *p; |
268 | 15.3k | continue; |
269 | 1.08k | case WC_C_G0_CS94: /* ESC '(' */ |
270 | 8.22k | case WC_C_G1_CS94: /* ESC ')' */ |
271 | 8.94k | case WC_C_G2_CS94: /* ESC '*' */ |
272 | 14.4k | case WC_C_G3_CS94: /* ESC '+' */ |
273 | 14.4k | state = cs = WC_C_G0_CS94; |
274 | 14.4k | g = *p & 0x03; |
275 | 14.4k | continue; |
276 | 778 | case WC_C_G0_CS96: /* ESC ',' */ /* ISO 2022 does not permit */ |
277 | 1.13k | case WC_C_G1_CS96: /* ESC '-' */ |
278 | 3.92k | case WC_C_G2_CS96: /* ESC '.' */ |
279 | 4.33k | case WC_C_G3_CS96: /* ESC '/' */ |
280 | 4.33k | state = cs = WC_C_G0_CS96; |
281 | 4.33k | g = *p & 0x03; |
282 | 4.33k | continue; |
283 | 1.19k | case WC_C_C0: /* ESC '!' */ /* not supported */ |
284 | 1.54k | case WC_C_C1: /* ESC '"' */ /* not supported */ |
285 | 2.56k | case WC_C_REP: /* ESC '&' */ /* not supported */ |
286 | 2.56k | state = cs = WC_C_C0; |
287 | 2.56k | continue; |
288 | 2.02k | case WC_C_CSWSR: /* ESC '%' */ /* not supported */ |
289 | 2.02k | state = cs = WC_C_CSWSR; |
290 | 2.02k | continue; |
291 | 312 | case WC_C_SS2: /* ESC 'N' */ |
292 | 312 | st->ss = 2; *ptr = p; return 1; |
293 | 333 | case WC_C_SS3: /* ESC 'O' */ |
294 | 333 | st->ss = 3; *ptr = p; return 1; |
295 | 676 | case WC_C_LS2: /* ESC 'n' */ |
296 | 676 | st->gl = 2; *ptr = p; return 1; |
297 | 268 | case WC_C_LS3: /* ESC 'o' */ |
298 | 268 | st->gl = 3; *ptr = p; return 1; |
299 | 575 | case WC_C_LS1R: /* ESC '~' */ |
300 | 575 | st->gr = 1; *ptr = p; return 1; |
301 | 998 | case WC_C_LS2R: /* ESC '}' */ |
302 | 998 | st->gr = 2; *ptr = p; return 1; |
303 | 289 | case WC_C_LS3R: /* ESC '|' */ |
304 | 289 | st->gr = 3; *ptr = p; return 1; |
305 | 19.2k | default: |
306 | 19.2k | return 0; |
307 | 61.3k | } |
308 | 0 | break; |
309 | 15.2k | case WC_C_MBCS: /* ESC '$' */ |
310 | 15.2k | switch (*p) { |
311 | 2.07k | case WC_F_JIS_C_6226: /* ESC '$' @ */ |
312 | 3.49k | case WC_F_JIS_X_0208: /* ESC '$' B */ |
313 | 4.09k | case WC_F_GB_2312: /* ESC '$' A */ |
314 | 4.09k | state = 0; |
315 | 4.09k | cs = WC_C_G0_CS94 | 0x80; |
316 | 4.09k | g = 0; |
317 | 4.09k | f = *p; |
318 | 4.09k | break; |
319 | 1.56k | case WC_C_G0_CS94: /* ESC '$' '(' */ |
320 | 2.19k | case WC_C_G1_CS94: /* ESC '$' ')' */ |
321 | 2.48k | case WC_C_G2_CS94: /* ESC '$' '*' */ |
322 | 4.68k | case WC_C_G3_CS94: /* ESC '$' '+' */ |
323 | 4.68k | state = cs = WC_C_G0_CS94 | 0x80; |
324 | 4.68k | g = *p & 0x03; |
325 | 4.68k | continue; |
326 | 335 | case WC_C_G0_CS96: /* ESC '$' ',' */ /* ISO 2022 does not permit */ |
327 | 714 | case WC_C_G1_CS96: /* ESC '$' '-' */ |
328 | 1.80k | case WC_C_G2_CS96: /* ESC '$' '.' */ |
329 | 2.32k | case WC_C_G3_CS96: /* ESC '$' '/' */ |
330 | 2.32k | state = cs = WC_C_G0_CS96 | 0x80; |
331 | 2.32k | g = *p & 0x03; |
332 | 2.32k | continue; |
333 | 4.15k | default: |
334 | 4.15k | return 0; |
335 | 15.2k | } |
336 | 4.09k | break; |
337 | 14.3k | case WC_C_G0_CS94: /* ESC [()*+] F */ |
338 | 14.3k | if (*p == WC_C_CS942) { /* ESC [()*+] '!' */ |
339 | 530 | state = cs = WC_C_CS942 | 0x80; |
340 | 530 | g = *p & 0x03; |
341 | 530 | continue; |
342 | 530 | } |
343 | 18.1k | case WC_C_G0_CS96: /* ESC [,-./] F */ |
344 | 22.7k | case WC_C_G0_CS94 | 0x80: /* ESC '$' [()*+] F */ |
345 | 25.0k | case WC_C_G0_CS96 | 0x80: /* ESC '$' [,-./] F */ |
346 | 25.5k | case WC_C_CS942 | 0x80: /* ESC [()*+] '!' F */ |
347 | 28.1k | case WC_C_C0: /* ESC [!"&] F */ |
348 | 28.3k | case WC_C_CSWSR | 0x80: /* ESC '%' '/' F */ |
349 | 28.3k | state = 0; |
350 | 28.3k | f = *p; |
351 | 28.3k | break; |
352 | 2.01k | case WC_C_CSWSR: /* ESC '%' F */ |
353 | 2.01k | if (*p == WC_C_CSWOSR) { /* ESC '%' '/' */ |
354 | 212 | state = cs = WC_C_CSWSR | 0x80; |
355 | 212 | continue; |
356 | 212 | } |
357 | 1.80k | state = 0; |
358 | 1.80k | f = *p; |
359 | 1.80k | break; |
360 | 0 | default: |
361 | 0 | return 0; |
362 | 107k | } |
363 | 107k | } |
364 | 36.4k | if (f < WC_F_ISO_BASE || f > 0x7e) |
365 | 22.2k | return 0; |
366 | 14.2k | switch (cs) { |
367 | 1.47k | case WC_C_G0_CS94: |
368 | 1.47k | st->design[g] = WC_CCS_SET_CS94(f); |
369 | 1.47k | break; |
370 | 7.71k | case WC_C_G0_CS94 | 0x80: |
371 | 7.71k | st->design[g] = WC_CCS_SET_CS94W(f); |
372 | 7.71k | break; |
373 | 1.21k | case WC_C_G0_CS96: |
374 | 1.21k | st->design[g] = WC_CCS_SET_CS96(f); |
375 | 1.21k | break; |
376 | 1.08k | case WC_C_G0_CS96 | 0x80: |
377 | 1.08k | st->design[g] = WC_CCS_SET_CS96W(f); |
378 | 1.08k | break; |
379 | 316 | case WC_C_CS942 | 0x80: |
380 | 316 | st->design[g] = WC_CCS_SET_CS942(f); |
381 | 316 | break; |
382 | 872 | case WC_C_CSWSR: |
383 | 872 | if (f == WC_F_ISO_BASE) |
384 | 349 | st->state = WC_ISO_NOSTATE; |
385 | 523 | else |
386 | 523 | st->state = WC_ISO_CSWSR; |
387 | 872 | break; |
388 | 0 | case WC_C_CSWOSR: |
389 | 0 | st->state = WC_ISO_CSWOSR; |
390 | 0 | break; |
391 | 14.2k | } |
392 | 14.2k | *ptr = p - 1; |
393 | 14.2k | return 1; |
394 | 14.2k | } |
395 | | |
396 | | void |
397 | | wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st) |
398 | 18.6M | { |
399 | 18.6M | wc_uchar g = 0; |
400 | 18.6M | wc_bool is_wide = WC_FALSE, retry = WC_FALSE; |
401 | 18.6M | wc_wchar_t cc2; |
402 | | |
403 | 33.9M | while (1) { |
404 | 33.9M | switch (WC_CCS_TYPE(cc.ccs)) { |
405 | 1.84M | case WC_CCS_A_CS94: |
406 | 1.84M | if (cc.ccs == WC_CCS_US_ASCII) |
407 | 1.79M | cc.ccs = st->g0_ccs; |
408 | 1.84M | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
409 | 1.83M | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
410 | 1.84M | break; |
411 | 15.6M | case WC_CCS_A_CS94W: |
412 | 15.6M | is_wide = 1; |
413 | 15.6M | switch (cc.ccs) { |
414 | 0 | #ifdef USE_UNICODE |
415 | 7.76k | case WC_CCS_JIS_X_0212: |
416 | 7.76k | if (!WcOption.use_jisx0212 && WcOption.use_jisx0213 && |
417 | 0 | WcOption.ucs_conv) { |
418 | 0 | cc2 = wc_jisx0212_to_jisx0213(cc); |
419 | 0 | if (cc2.ccs == WC_CCS_JIS_X_0213_1 || |
420 | 0 | cc2.ccs == WC_CCS_JIS_X_0213_2) { |
421 | 0 | cc = cc2; |
422 | 0 | continue; |
423 | 0 | } |
424 | 0 | } |
425 | 7.76k | break; |
426 | 115k | case WC_CCS_JIS_X_0213_1: |
427 | 118k | case WC_CCS_JIS_X_0213_2: |
428 | 118k | if (!WcOption.use_jisx0213 && WcOption.use_jisx0212 && |
429 | 0 | WcOption.ucs_conv) { |
430 | 0 | cc2 = wc_jisx0213_to_jisx0212(cc); |
431 | 0 | if (cc2.ccs == WC_CCS_JIS_X_0212) { |
432 | 0 | cc = cc2; |
433 | 0 | continue; |
434 | 0 | } |
435 | 0 | } |
436 | 118k | break; |
437 | 15.6M | #endif |
438 | 15.6M | } |
439 | 15.6M | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
440 | 15.6M | g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
441 | 15.6M | break; |
442 | 6.86M | case WC_CCS_A_CS96: |
443 | 6.86M | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
444 | 6.86M | g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
445 | 6.86M | break; |
446 | 2.39k | case WC_CCS_A_CS96W: |
447 | 2.39k | is_wide = 1; |
448 | 2.39k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
449 | 856 | g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
450 | 2.39k | break; |
451 | 5.29k | case WC_CCS_A_CS942: |
452 | 5.29k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
453 | 5.03k | g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
454 | 5.29k | break; |
455 | 856k | case WC_CCS_A_UNKNOWN_W: |
456 | 856k | if (WcOption.no_replace) |
457 | 0 | return; |
458 | 856k | is_wide = 1; |
459 | 856k | cc.ccs = WC_CCS_US_ASCII; |
460 | 856k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
461 | 856k | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
462 | 856k | cc.code = ((wc_uint32)WC_REPLACE_W[0] << 8) | WC_REPLACE_W[1]; |
463 | 856k | break; |
464 | 883k | case WC_CCS_A_UNKNOWN: |
465 | 883k | if (WcOption.no_replace) |
466 | 0 | return; |
467 | 883k | cc.ccs = WC_CCS_US_ASCII; |
468 | 883k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
469 | 883k | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
470 | 883k | cc.code = (wc_uint32)WC_REPLACE[0]; |
471 | 883k | break; |
472 | 7.82M | default: |
473 | 7.82M | if ((cc.ccs == WC_CCS_JOHAB || cc.ccs == WC_CCS_JOHAB_1 || |
474 | 7.82M | cc.ccs == WC_CCS_JOHAB_2 || cc.ccs == WC_CCS_JOHAB_3) && |
475 | 11.8k | cs94w_gmap[WC_F_KS_X_1001 - WC_F_ISO_BASE]) { |
476 | 11.5k | wc_wchar_t cc2 = wc_johab_to_ksx1001(cc); |
477 | 11.5k | if (cc2.ccs == WC_CCS_KS_X_1001) { |
478 | 3.15k | cc = cc2; |
479 | 3.15k | continue; |
480 | 3.15k | } |
481 | 11.5k | } |
482 | 7.82M | #ifdef USE_UNICODE |
483 | 7.82M | if (WcOption.ucs_conv) |
484 | 7.82M | cc = wc_any_to_iso2022(cc, st); |
485 | 0 | else |
486 | 0 | #endif |
487 | 0 | cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; |
488 | 7.82M | continue; |
489 | 33.9M | } |
490 | 26.1M | if (! g) { |
491 | 7.45M | #ifdef USE_UNICODE |
492 | 7.45M | if (WcOption.ucs_conv && ! retry) |
493 | 7.45M | cc = wc_any_to_any_ces(cc, st); |
494 | 0 | else |
495 | 0 | #endif |
496 | 0 | cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; |
497 | 7.45M | retry = WC_TRUE; |
498 | 7.45M | continue; |
499 | 7.45M | } |
500 | | |
501 | 18.6M | wc_push_iso2022_esc(os, cc.ccs, g, 1, st); |
502 | 18.6M | if (is_wide) |
503 | 9.18M | Strcat_char(os, (char)((cc.code >> 8) & 0x7f)); |
504 | 18.6M | Strcat_char(os, (char)(cc.code & 0x7f)); |
505 | 18.6M | return; |
506 | 26.1M | } |
507 | 18.6M | } |
508 | | |
509 | | void |
510 | | wc_push_to_iso2022_end(Str os, wc_status *st) |
511 | 834 | { |
512 | 834 | if (st->design[1] != 0 && st->design[1] != st->g1_ccs) |
513 | 144 | wc_push_iso2022_esc(os, st->g1_ccs, WC_C_G1_CS94, 0, st); |
514 | 834 | wc_push_iso2022_esc(os, st->g0_ccs, WC_C_G0_CS94, 1, st); |
515 | 834 | } |
516 | | |
517 | | void |
518 | | wc_push_iso2022_esc(Str os, wc_ccs ccs, wc_uchar g, wc_uint8 invoke, wc_status *st) |
519 | 18.6M | { |
520 | 18.6M | wc_uint8 g_invoke = g & 0x03; |
521 | | |
522 | 18.6M | if (st->design[g_invoke] != ccs) { |
523 | 11.4M | Strcat_char(os, WC_C_ESC); |
524 | 11.4M | if (WC_CCS_IS_WIDE(ccs)) { |
525 | 6.60M | Strcat_char(os, WC_C_MBCS); |
526 | 6.60M | if (g_invoke != 0 || |
527 | 189k | (ccs != WC_CCS_JIS_C_6226 && |
528 | 189k | ccs != WC_CCS_JIS_X_0208 && |
529 | 36.1k | ccs != WC_CCS_GB_2312)) |
530 | 6.41M | Strcat_char(os, (char)g); |
531 | 6.60M | } else { |
532 | 4.85M | Strcat_char(os, (char)g); |
533 | 4.85M | if ((ccs & WC_CCS_A_ISO_2022) == WC_CCS_A_CS942) |
534 | 0 | Strcat_char(os, WC_C_CS942); |
535 | 4.85M | } |
536 | 11.4M | Strcat_char(os, (char)WC_CCS_GET_F(ccs)); |
537 | 11.4M | st->design[g_invoke] = ccs; |
538 | 11.4M | } |
539 | 18.6M | if (! invoke) |
540 | 144 | return; |
541 | | |
542 | 18.6M | switch (g_invoke) { |
543 | 4.24M | case 0: |
544 | 4.24M | if (st->gl != 0) { |
545 | 135k | Strcat_char(os, WC_C_SI); |
546 | 135k | st->gl = 0; |
547 | 135k | } |
548 | 4.24M | break; |
549 | 7.42M | case 1: |
550 | 7.42M | if (st->gl != 1) { |
551 | 135k | Strcat_char(os, WC_C_SO); |
552 | 135k | st->gl = 1; |
553 | 135k | } |
554 | 7.42M | break; |
555 | 6.81M | case 2: |
556 | 6.81M | Strcat_char(os, WC_C_ESC); |
557 | 6.81M | Strcat_char(os, WC_C_SS2); |
558 | 6.81M | break; |
559 | 175k | case 3: |
560 | 175k | Strcat_char(os, WC_C_ESC); |
561 | 175k | Strcat_char(os, WC_C_SS3); |
562 | 175k | break; |
563 | 18.6M | } |
564 | 18.6M | } |
565 | | |
566 | | void |
567 | | wc_push_to_euc(Str os, wc_wchar_t cc, wc_status *st) |
568 | 8.78M | { |
569 | 8.78M | wc_ccs g1_ccs = st->ces_info->gset[1].ccs; |
570 | | |
571 | 16.2M | while (1) { |
572 | 16.2M | if (cc.ccs == g1_ccs) { |
573 | 3.66M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
574 | 3.66M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
575 | 3.66M | return; |
576 | 3.66M | } |
577 | 12.5M | switch (cc.ccs) { |
578 | 3.26M | case WC_CCS_US_ASCII: |
579 | 3.26M | Strcat_char(os, (char)cc.code); |
580 | 3.26M | return; |
581 | 1.07M | case WC_CCS_C1: |
582 | 1.07M | Strcat_char(os, (char)(cc.code | 0x80)); |
583 | 1.07M | return; |
584 | 479k | case WC_CCS_UNKNOWN_W: |
585 | 479k | if (!WcOption.no_replace) |
586 | 479k | Strcat_charp(os, WC_REPLACE_W); |
587 | 479k | return; |
588 | 302k | case WC_CCS_UNKNOWN: |
589 | 302k | if (!WcOption.no_replace) |
590 | 302k | Strcat_charp(os, WC_REPLACE); |
591 | 302k | return; |
592 | 282k | case WC_CCS_JOHAB: |
593 | 282k | case WC_CCS_JOHAB_1: |
594 | 282k | case WC_CCS_JOHAB_2: |
595 | 282k | case WC_CCS_JOHAB_3: |
596 | 282k | if (st->ces_info->id == WC_CES_EUC_KR) { |
597 | 282k | cc = wc_johab_to_ksx1001(cc); |
598 | 282k | continue; |
599 | 282k | } |
600 | 7.13M | default: |
601 | 7.13M | #ifdef USE_UNICODE |
602 | 7.13M | if (WcOption.ucs_conv) |
603 | 7.13M | cc = wc_any_to_any_ces(cc, st); |
604 | 0 | else |
605 | 0 | #endif |
606 | 0 | cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; |
607 | 7.13M | continue; |
608 | 12.5M | } |
609 | 12.5M | } |
610 | 8.78M | } |
611 | | |
612 | | void |
613 | | wc_push_to_eucjp(Str os, wc_wchar_t cc, wc_status *st) |
614 | 10.8M | { |
615 | 14.5M | while (1) { |
616 | 14.5M | switch (cc.ccs) { |
617 | 2.13M | case WC_CCS_US_ASCII: |
618 | 2.13M | Strcat_char(os, (char)cc.code); |
619 | 2.13M | return; |
620 | 34.3k | case WC_CCS_JIS_X_0201K: |
621 | 34.3k | if (WcOption.use_jisx0201k) { |
622 | 0 | Strcat_char(os, WC_C_SS2R); |
623 | 0 | Strcat_char(os, (char)(cc.code | 0x80)); |
624 | 0 | return; |
625 | 34.3k | } else if (WcOption.fix_width_conv) |
626 | 34.3k | cc.ccs = WC_CCS_UNKNOWN; |
627 | 0 | else |
628 | 0 | cc = wc_jisx0201k_to_jisx0208(cc); |
629 | 34.3k | continue; |
630 | 6.34M | case WC_CCS_JIS_X_0208: |
631 | 6.34M | break; |
632 | 2.55k | case WC_CCS_JIS_X_0213_1: |
633 | 2.55k | if (WcOption.use_jisx0213) |
634 | 0 | break; |
635 | 2.55k | #ifdef USE_UNICODE |
636 | 2.55k | else if (WcOption.ucs_conv && WcOption.use_jisx0212) |
637 | 0 | cc = wc_jisx0213_to_jisx0212(cc); |
638 | 2.55k | #endif |
639 | 2.55k | else |
640 | 2.55k | cc.ccs = WC_CCS_UNKNOWN_W; |
641 | 2.55k | continue; |
642 | 2.55k | case WC_CCS_JIS_X_0212: |
643 | 596 | if (WcOption.use_jisx0212) { |
644 | 0 | Strcat_char(os, WC_C_SS3R); |
645 | 0 | break; |
646 | 0 | } |
647 | 596 | #ifdef USE_UNICODE |
648 | 596 | else if (WcOption.ucs_conv && WcOption.use_jisx0213) |
649 | 0 | cc = wc_jisx0212_to_jisx0213(cc); |
650 | 596 | #endif |
651 | 596 | else |
652 | 596 | cc.ccs = WC_CCS_UNKNOWN_W; |
653 | 596 | continue; |
654 | 596 | case WC_CCS_JIS_X_0213_2: |
655 | 460 | if (WcOption.use_jisx0213) { |
656 | 0 | Strcat_char(os, WC_C_SS3R); |
657 | 0 | break; |
658 | 0 | } |
659 | 460 | #ifdef USE_UNICODE |
660 | 460 | else if (WcOption.ucs_conv && WcOption.use_jisx0212) |
661 | 0 | cc = wc_jisx0213_to_jisx0212(cc); |
662 | 460 | #endif |
663 | 460 | else |
664 | 460 | cc.ccs = WC_CCS_UNKNOWN_W; |
665 | 460 | continue; |
666 | 80.2k | case WC_CCS_C1: |
667 | 80.2k | Strcat_char(os, (char)(cc.code | 0x80)); |
668 | 80.2k | return; |
669 | 165k | case WC_CCS_UNKNOWN_W: |
670 | 165k | if (!WcOption.no_replace) |
671 | 165k | Strcat_charp(os, WC_REPLACE_W); |
672 | 165k | return; |
673 | 2.10M | case WC_CCS_UNKNOWN: |
674 | 2.10M | if (!WcOption.no_replace) |
675 | 2.10M | Strcat_charp(os, WC_REPLACE); |
676 | 2.10M | return; |
677 | 3.66M | default: |
678 | 3.66M | #ifdef USE_UNICODE |
679 | 3.66M | if (WcOption.ucs_conv) |
680 | 3.66M | cc = wc_any_to_any_ces(cc, st); |
681 | 0 | else |
682 | 0 | #endif |
683 | 0 | cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; |
684 | 3.66M | continue; |
685 | 14.5M | } |
686 | 6.34M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
687 | 6.34M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
688 | 6.34M | return; |
689 | 14.5M | } |
690 | 10.8M | } |
691 | | |
692 | | void |
693 | | wc_push_to_euctw(Str os, wc_wchar_t cc, wc_status *st) |
694 | 15.5M | { |
695 | 25.4M | while (1) { |
696 | 25.4M | switch (cc.ccs) { |
697 | 1.93M | case WC_CCS_US_ASCII: |
698 | 1.93M | Strcat_char(os, (char)cc.code); |
699 | 1.93M | return; |
700 | 4.57M | case WC_CCS_CNS_11643_1: |
701 | 4.57M | break; |
702 | 648k | case WC_CCS_CNS_11643_2: |
703 | 1.01M | case WC_CCS_CNS_11643_3: |
704 | 1.02M | case WC_CCS_CNS_11643_4: |
705 | 1.04M | case WC_CCS_CNS_11643_5: |
706 | 1.04M | case WC_CCS_CNS_11643_6: |
707 | 1.04M | case WC_CCS_CNS_11643_7: |
708 | 1.04M | Strcat_char(os, WC_C_SS2R); |
709 | 1.04M | Strcat_char(os, (char)(0xA1 + (cc.ccs - WC_CCS_CNS_11643_1))); |
710 | 1.04M | break; |
711 | 341 | case WC_CCS_CNS_11643_8: |
712 | 354k | case WC_CCS_CNS_11643_9: |
713 | 357k | case WC_CCS_CNS_11643_10: |
714 | 373k | case WC_CCS_CNS_11643_11: |
715 | 374k | case WC_CCS_CNS_11643_12: |
716 | 385k | case WC_CCS_CNS_11643_13: |
717 | 386k | case WC_CCS_CNS_11643_14: |
718 | 386k | case WC_CCS_CNS_11643_15: |
719 | 387k | case WC_CCS_CNS_11643_16: |
720 | 387k | Strcat_char(os, WC_C_SS2R); |
721 | 387k | Strcat_char(os, (char)(0xA8 + (cc.ccs - WC_CCS_CNS_11643_8))); |
722 | 387k | break; |
723 | 3.20M | case WC_CCS_C1: |
724 | 3.20M | Strcat_char(os, (char)(cc.code | 0x80)); |
725 | 3.20M | return; |
726 | 2.49M | case WC_CCS_UNKNOWN_W: |
727 | 2.49M | if (!WcOption.no_replace) |
728 | 2.49M | Strcat_charp(os, WC_REPLACE_W); |
729 | 2.49M | return; |
730 | 1.92M | case WC_CCS_UNKNOWN: |
731 | 1.92M | if (!WcOption.no_replace) |
732 | 1.92M | Strcat_charp(os, WC_REPLACE); |
733 | 1.92M | return; |
734 | 9.86M | default: |
735 | 9.86M | #ifdef USE_UNICODE |
736 | 9.86M | if (WcOption.ucs_conv) |
737 | 9.86M | cc = wc_any_to_any_ces(cc, st); |
738 | 0 | else |
739 | 0 | #endif |
740 | 0 | cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; |
741 | 9.86M | continue; |
742 | 25.4M | } |
743 | 6.00M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
744 | 6.00M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
745 | 6.00M | return; |
746 | 25.4M | } |
747 | 15.5M | } |
748 | | |
749 | | void |
750 | | wc_push_to_iso8859(Str os, wc_wchar_t cc, wc_status *st) |
751 | 14.4M | { |
752 | 14.4M | wc_ccs g1_ccs = st->ces_info->gset[1].ccs; |
753 | | |
754 | 22.6M | while (1) { |
755 | 22.6M | if (cc.ccs == g1_ccs) { |
756 | 12.6k | Strcat_char(os, (char)(cc.code | 0x80)); |
757 | 12.6k | return; |
758 | 12.6k | } |
759 | 22.5M | switch (cc.ccs) { |
760 | 2.69M | case WC_CCS_US_ASCII: |
761 | 2.69M | Strcat_char(os, (char)cc.code); |
762 | 2.69M | return; |
763 | 1.54M | case WC_CCS_C1: |
764 | 1.54M | Strcat_char(os, (char)(cc.code | 0x80)); |
765 | 1.54M | return; |
766 | 2.77M | case WC_CCS_UNKNOWN_W: |
767 | 2.77M | if (!WcOption.no_replace) |
768 | 2.77M | Strcat_charp(os, WC_REPLACE_W); |
769 | 2.77M | return; |
770 | 7.42M | case WC_CCS_UNKNOWN: |
771 | 7.42M | if (!WcOption.no_replace) |
772 | 7.42M | Strcat_charp(os, WC_REPLACE); |
773 | 7.42M | return; |
774 | 8.16M | default: |
775 | 8.16M | #ifdef USE_UNICODE |
776 | 8.16M | if (WcOption.ucs_conv) |
777 | 8.16M | cc = wc_any_to_any_ces(cc, st); |
778 | 0 | else |
779 | 0 | #endif |
780 | 0 | cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN; |
781 | 8.16M | continue; |
782 | 22.5M | } |
783 | 22.5M | } |
784 | 14.4M | } |
785 | | |
786 | | void |
787 | | wc_create_gmap(wc_status *st) |
788 | 776 | { |
789 | 776 | wc_gset *gset = st->ces_info->gset; |
790 | 776 | wc_uchar *gset_ext = st->ces_info->gset_ext; |
791 | 776 | int i, f; |
792 | | |
793 | 776 | if (WcOption.strict_iso2022) { |
794 | 50.4k | for (i = 0; i < WC_F_ISO_BASE; i++) { |
795 | 49.6k | cs94_gmap[i] = 0; |
796 | 49.6k | cs96_gmap[i] = 0; |
797 | 49.6k | cs94w_gmap[i] = 0; |
798 | 49.6k | cs96w_gmap[i] = 0; |
799 | 49.6k | cs942_gmap[i] = 0; |
800 | 49.6k | } |
801 | 776 | } else { |
802 | 0 | for (i = 0; i < WC_F_ISO_BASE; i++) { |
803 | 0 | cs94_gmap[i] = gset_ext[0]; |
804 | 0 | cs96_gmap[i] = gset_ext[1]; |
805 | 0 | cs94w_gmap[i] = gset_ext[2]; |
806 | 0 | cs96w_gmap[i] = gset_ext[3]; |
807 | 0 | cs942_gmap[i] = gset_ext[0]; |
808 | 0 | } |
809 | 0 | } |
810 | 5.59k | for (i = 0; gset[i].ccs; i++) { |
811 | 4.81k | f = WC_CCS_GET_F(gset[i].ccs) - WC_F_ISO_BASE; |
812 | 4.81k | switch (WC_CCS_TYPE(gset[i].ccs)) { |
813 | 776 | case WC_CCS_A_CS94: |
814 | 776 | switch (gset[i].ccs) { |
815 | 0 | case WC_CCS_JIS_X_0201K: |
816 | 0 | if (!WcOption.use_jisx0201k) |
817 | 0 | continue; |
818 | 0 | break; |
819 | 776 | } |
820 | 776 | cs94_gmap[f] = gset[i].g; |
821 | 776 | break; |
822 | 3.81k | case WC_CCS_A_CS94W: |
823 | 3.81k | switch (gset[i].ccs) { |
824 | 115 | case WC_CCS_JIS_X_0212: |
825 | 115 | if (!WcOption.use_jisx0212) |
826 | 115 | continue; |
827 | 0 | break; |
828 | 2 | case WC_CCS_JIS_X_0213_1: |
829 | 4 | case WC_CCS_JIS_X_0213_2: |
830 | 4 | if (!WcOption.use_jisx0213) |
831 | 4 | continue; |
832 | 0 | break; |
833 | 3.81k | } |
834 | 3.69k | cs94w_gmap[f] = gset[i].g; |
835 | 3.69k | break; |
836 | 230 | case WC_CCS_A_CS96: |
837 | 230 | cs96_gmap[f] = gset[i].g; |
838 | 230 | break; |
839 | 0 | case WC_CCS_A_CS96W: |
840 | 0 | cs96w_gmap[f] = gset[i].g; |
841 | 0 | break; |
842 | 0 | case WC_CCS_A_CS942: |
843 | 0 | cs942_gmap[f] = gset[i].g; |
844 | 0 | break; |
845 | 4.81k | } |
846 | 4.81k | } |
847 | 776 | } |
848 | | |
849 | | Str |
850 | | wc_char_conv_from_iso2022(wc_uchar c, wc_status *st) |
851 | 0 | { |
852 | 0 | static Str os; |
853 | 0 | static wc_uchar buf[4]; |
854 | 0 | static size_t nbuf; |
855 | 0 | wc_uchar *p; |
856 | 0 | wc_ccs gl_ccs, gr_ccs; |
857 | |
|
858 | 0 | if (st->state == -1) { |
859 | 0 | st->state = WC_ISO_NOSTATE; |
860 | 0 | os = Strnew_size(8); |
861 | 0 | nbuf = 0; |
862 | 0 | } |
863 | |
|
864 | 0 | gl_ccs = st->ss ? st->design[st->ss] : st->design[st->gl]; |
865 | 0 | gr_ccs = st->ss ? st->design[st->ss] : st->design[st->gr]; |
866 | |
|
867 | 0 | switch (st->state) { |
868 | 0 | case WC_ISO_NOSTATE: |
869 | 0 | switch (WC_ISO_MAP[c]) { |
870 | 0 | case GL2: |
871 | 0 | if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) { |
872 | 0 | Strcat_char(os, (char)c); |
873 | 0 | break; |
874 | 0 | } |
875 | 0 | case GL: |
876 | 0 | if (WC_CCS_IS_WIDE(gl_ccs)) { |
877 | 0 | buf[nbuf++] = c; |
878 | 0 | st->state = WC_ISO_MBYTE1; |
879 | 0 | return NULL; |
880 | 0 | } else if (gl_ccs == WC_CES_US_ASCII) |
881 | 0 | Strcat_char(os, (char)c); |
882 | 0 | else |
883 | 0 | wtf_push_iso2022(os, gl_ccs, (wc_uint32)c); |
884 | 0 | break; |
885 | 0 | case GR2: |
886 | 0 | if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) |
887 | 0 | break; |
888 | 0 | case GR: |
889 | 0 | if (WC_CCS_IS_WIDE(gr_ccs)) { |
890 | 0 | buf[nbuf++] = c; |
891 | 0 | st->state = WC_EUC_MBYTE1; |
892 | 0 | return NULL; |
893 | 0 | } else if (gr_ccs) |
894 | 0 | wtf_push_iso2022(os, gr_ccs, (wc_uint32)c); |
895 | 0 | break; |
896 | 0 | case C0: |
897 | 0 | Strcat_char(os, (char)c); |
898 | 0 | break; |
899 | 0 | case C1: |
900 | 0 | break; |
901 | 0 | case ESC: |
902 | 0 | buf[nbuf++] = c; |
903 | 0 | st->state = WC_C_ESC; |
904 | 0 | return NULL; |
905 | 0 | case SI: |
906 | 0 | st->gl = 0; |
907 | 0 | break; |
908 | 0 | case SO: |
909 | 0 | st->gl = 1; |
910 | 0 | break; |
911 | 0 | case SS2: |
912 | 0 | if (! st->design[2]) |
913 | 0 | return os; |
914 | 0 | st->ss = 2; |
915 | 0 | return NULL; |
916 | 0 | case SS3: |
917 | 0 | if (! st->design[3]) |
918 | 0 | return os; |
919 | 0 | st->ss = 3; |
920 | 0 | return NULL; |
921 | 0 | } |
922 | 0 | break; |
923 | 0 | case WC_ISO_MBYTE1: |
924 | 0 | switch (WC_ISO_MAP[c]) { |
925 | 0 | case GL2: |
926 | 0 | if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) |
927 | 0 | break; |
928 | 0 | case GL: |
929 | 0 | buf[nbuf++] = c; |
930 | 0 | wtf_push_iso2022(os, gl_ccs, ((wc_uint32)buf[0] << 8) | buf[1]); |
931 | 0 | break; |
932 | 0 | } |
933 | 0 | st->state = WC_ISO_NOSTATE; |
934 | 0 | break; |
935 | 0 | case WC_EUC_MBYTE1: |
936 | 0 | switch (WC_ISO_MAP[c]) { |
937 | 0 | case GR2: |
938 | 0 | if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) |
939 | 0 | break; |
940 | 0 | case GR: |
941 | 0 | if (gr_ccs == WC_CCS_CNS_11643_X) { |
942 | 0 | buf[nbuf++] = c; |
943 | 0 | st->state = WC_EUC_TW_MBYTE2; |
944 | 0 | return NULL; |
945 | 0 | } |
946 | 0 | buf[nbuf++] = c; |
947 | 0 | wtf_push_iso2022(os, gr_ccs, ((wc_uint32)buf[0] << 8) | buf[1]); |
948 | 0 | break; |
949 | 0 | } |
950 | 0 | st->state = WC_ISO_NOSTATE; |
951 | 0 | break; |
952 | 0 | case WC_EUC_TW_MBYTE2: |
953 | 0 | if (WC_ISO_MAP[c] == GR) { |
954 | 0 | buf[nbuf++] = c; |
955 | 0 | c = buf[0]; |
956 | 0 | if (0xa1 <= c && c <= 0xa7) { |
957 | 0 | wtf_push_iso2022(os, WC_CCS_CNS_11643_1 + (c - 0xa1), |
958 | 0 | ((wc_uint32)buf[1] << 8) | buf[2]); |
959 | 0 | break; |
960 | 0 | } |
961 | 0 | if (0xa8 <= c && c <= 0xb0) { |
962 | 0 | wtf_push_iso2022(os, WC_CCS_CNS_11643_8 + (c - 0xa8), |
963 | 0 | ((wc_uint32)buf[1] << 8) | buf[2]); |
964 | 0 | break; |
965 | 0 | } |
966 | 0 | } |
967 | 0 | st->state = WC_ISO_NOSTATE; |
968 | 0 | break; |
969 | 0 | case WC_C_ESC: |
970 | 0 | switch (c) { |
971 | 0 | case WC_C_G0_CS94: |
972 | 0 | case WC_C_G1_CS94: |
973 | 0 | case WC_C_G2_CS94: |
974 | 0 | case WC_C_G3_CS94: |
975 | 0 | buf[nbuf++] = c; |
976 | 0 | st->state = WC_C_G0_CS94; |
977 | 0 | return NULL; |
978 | 0 | case WC_C_G0_CS96: |
979 | 0 | case WC_C_G1_CS96: |
980 | 0 | case WC_C_G2_CS96: |
981 | 0 | case WC_C_G3_CS96: |
982 | 0 | case WC_C_C0: |
983 | 0 | case WC_C_C1: |
984 | 0 | case WC_C_REP: |
985 | 0 | buf[nbuf++] = c; |
986 | 0 | st->state = WC_C_G0_CS96; |
987 | 0 | return NULL; |
988 | 0 | case WC_C_MBCS: |
989 | 0 | case WC_C_CSWSR: |
990 | 0 | buf[nbuf++] = c; |
991 | 0 | st->state = c; |
992 | 0 | return NULL; |
993 | 0 | case WC_C_SS2: |
994 | 0 | st->ss = 2; |
995 | 0 | st->state = WC_ISO_NOSTATE; |
996 | 0 | return NULL; |
997 | 0 | case WC_C_SS3: |
998 | 0 | st->ss = 3; |
999 | 0 | st->state = WC_ISO_NOSTATE; |
1000 | 0 | return NULL; |
1001 | 0 | case WC_C_LS2: |
1002 | 0 | st->gl = 2; |
1003 | 0 | break; |
1004 | 0 | case WC_C_LS3: |
1005 | 0 | st->gl = 3; |
1006 | 0 | break; |
1007 | 0 | case WC_C_LS2R: |
1008 | 0 | st->gr = 2; |
1009 | 0 | break; |
1010 | 0 | case WC_C_LS3R: |
1011 | 0 | st->gr = 3; |
1012 | 0 | break; |
1013 | 0 | default: |
1014 | 0 | break; |
1015 | 0 | } |
1016 | 0 | break; |
1017 | 0 | case WC_C_MBCS: |
1018 | 0 | switch (c) { |
1019 | 0 | case WC_F_JIS_C_6226: |
1020 | 0 | case WC_F_JIS_X_0208: |
1021 | 0 | case WC_F_GB_2312: |
1022 | 0 | buf[nbuf++] = c; |
1023 | 0 | p = buf; |
1024 | 0 | wc_parse_iso2022_esc(&p, st); |
1025 | 0 | break; |
1026 | 0 | case WC_C_G0_CS94: |
1027 | 0 | case WC_C_G1_CS94: |
1028 | 0 | case WC_C_G2_CS94: |
1029 | 0 | case WC_C_G3_CS94: |
1030 | 0 | case WC_C_G0_CS96: |
1031 | 0 | case WC_C_G1_CS96: |
1032 | 0 | case WC_C_G2_CS96: |
1033 | 0 | case WC_C_G3_CS96: |
1034 | 0 | buf[nbuf++] = c; |
1035 | 0 | st->state = WC_C_G0_CS96; |
1036 | 0 | return NULL; |
1037 | 0 | } |
1038 | 0 | break; |
1039 | 0 | case WC_C_CSWSR: |
1040 | 0 | switch (c) { |
1041 | 0 | case WC_C_CSWOSR: |
1042 | 0 | buf[nbuf++] = c; |
1043 | 0 | st->state = WC_C_G1_CS94; |
1044 | 0 | return NULL; |
1045 | 0 | } |
1046 | 0 | buf[nbuf++] = c; |
1047 | 0 | p = buf; |
1048 | 0 | wc_parse_iso2022_esc(&p, st); |
1049 | 0 | break; |
1050 | 0 | case WC_C_G0_CS94: |
1051 | 0 | switch (c) { |
1052 | 0 | case WC_C_CS942: |
1053 | 0 | buf[nbuf++] = c; |
1054 | 0 | st->state = WC_C_G0_CS96; |
1055 | 0 | return NULL; |
1056 | 0 | } |
1057 | 0 | case WC_C_G0_CS96: |
1058 | 0 | buf[nbuf++] = c; |
1059 | 0 | p = buf; |
1060 | 0 | wc_parse_iso2022_esc(&p, st); |
1061 | 0 | break; |
1062 | 0 | } |
1063 | 0 | st->ss = 0; |
1064 | 0 | st->state = -1; |
1065 | 0 | return os; |
1066 | 0 | } |