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.22M | #define C0 WC_ISO_MAP_C0 |
13 | 1.43M | #define C1 WC_ISO_MAP_C1 |
14 | 5.08M | #define GL WC_ISO_MAP_GL |
15 | 40.7M | #define GR WC_ISO_MAP_GR |
16 | 51.3k | #define GL2 WC_ISO_MAP_GL96 |
17 | 709k | #define GR2 WC_ISO_MAP_GR96 |
18 | 7.48k | #define SO WC_ISO_MAP_SO |
19 | 7.24k | #define SI WC_ISO_MAP_SI |
20 | 111k | #define ESC WC_ISO_MAP_ESC |
21 | 15.6k | #define SS2 WC_ISO_MAP_SS2 |
22 | 13.3k | #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 | 42.9M | { |
53 | 42.9M | switch (ccs) { |
54 | 27.7k | case WC_CCS_JIS_C_6226: |
55 | 248k | case WC_CCS_JIS_X_0208: |
56 | 261k | case WC_CCS_JIS_X_0213_1: |
57 | 261k | ccs = wc_jisx0208_or_jisx02131(code); |
58 | 261k | break; |
59 | 154k | case WC_CCS_JIS_X_0212: |
60 | 194k | case WC_CCS_JIS_X_0213_2: |
61 | 194k | ccs = wc_jisx0212_or_jisx02132(code); |
62 | 194k | break; |
63 | 9.13k | case WC_CCS_JIS_X_0201: |
64 | 73.0k | case WC_CCS_GB_1988: |
65 | 73.0k | ccs = WC_CCS_US_ASCII; |
66 | 73.0k | break; |
67 | 42.9M | } |
68 | 42.9M | wtf_push(os, ccs, code); |
69 | 42.9M | } |
70 | | |
71 | | Str |
72 | | wc_conv_from_iso2022(Str is, wc_ces ces) |
73 | 2.90k | { |
74 | 2.90k | Str os; |
75 | 2.90k | wc_uchar *sp = (wc_uchar *)is->ptr; |
76 | 2.90k | wc_uchar *ep = sp + is->length; |
77 | 2.90k | wc_uchar *p, *q = NULL; |
78 | 2.90k | int state = WC_ISO_NOSTATE; |
79 | 2.90k | wc_status st; |
80 | 2.90k | wc_ccs gl_ccs, gr_ccs; |
81 | | |
82 | 5.54k | for (p = sp; p < ep && !(WC_ISO_MAP[*p] & WC_ISO_MAP_DETECT); p++) |
83 | 2.63k | ; |
84 | 2.90k | if (p == ep) |
85 | 303 | return is; |
86 | 2.60k | os = Strnew_size(is->length); |
87 | 2.60k | if (p > sp) |
88 | 351 | Strcat_charp_n(os, is->ptr, (int)(p - sp)); |
89 | | |
90 | 2.60k | wc_input_init(ces, &st); |
91 | 2.60k | gl_ccs = st.design[st.gl]; |
92 | 2.60k | gr_ccs = st.design[st.gr]; |
93 | | |
94 | 49.7M | for (; p < ep; p++) { |
95 | 49.7M | switch (state) { |
96 | 47.2M | case WC_ISO_NOSTATE: |
97 | 47.2M | switch (WC_ISO_MAP[*p]) { |
98 | 40.9k | case GL2: |
99 | 40.9k | gl_ccs = st.ss ? st.design[st.ss] |
100 | 40.9k | : st.design[st.gl]; |
101 | 40.9k | if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) { |
102 | 31.8k | Strcat_char(os, (char)*p); |
103 | 31.8k | break; |
104 | 31.8k | } |
105 | 4.21M | case GL: |
106 | 4.21M | gl_ccs = st.ss ? st.design[st.ss] |
107 | 4.21M | : st.design[st.gl]; |
108 | 4.21M | if (WC_CCS_IS_WIDE(gl_ccs)) { |
109 | 1.24M | q = p; |
110 | 1.24M | state = WC_ISO_MBYTE1; |
111 | 1.24M | continue; |
112 | 2.96M | } else if (gl_ccs == WC_CES_US_ASCII) |
113 | 0 | Strcat_char(os, (char)*p); |
114 | 2.96M | else |
115 | 2.96M | wtf_push_iso2022(os, gl_ccs, (wc_uint32)*p); |
116 | 2.96M | break; |
117 | 2.96M | case GR2: |
118 | 693k | gr_ccs = st.ss ? st.design[st.ss] |
119 | 693k | : st.design[st.gr]; |
120 | 693k | if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) { |
121 | 638k | wtf_push_unknown(os, p, 1); |
122 | 638k | break; |
123 | 638k | } |
124 | 39.5M | case GR: |
125 | 39.5M | gr_ccs = st.ss ? st.design[st.ss] |
126 | 39.5M | : st.design[st.gr]; |
127 | 39.5M | if (WC_CCS_IS_WIDE(gr_ccs)) { |
128 | 994k | q = p; |
129 | 994k | state = WC_EUC_MBYTE1; |
130 | 994k | continue; |
131 | 38.5M | } else if (gr_ccs) |
132 | 38.2M | wtf_push_iso2022(os, gr_ccs, (wc_uint32)*p); |
133 | 318k | else |
134 | 318k | wtf_push_unknown(os, p, 1); |
135 | 38.5M | break; |
136 | 38.5M | case C0: |
137 | 1.22M | Strcat_char(os, (char)*p); |
138 | 1.22M | break; |
139 | 1.43M | case C1: |
140 | 1.43M | wtf_push(os, WC_CCS_C1, (wc_uint32)*p); |
141 | 1.43M | break; |
142 | 111k | case ESC: |
143 | 111k | st.ss = 0; |
144 | 111k | if (wc_parse_iso2022_esc(&p, &st)) |
145 | 29.6k | state = st.state; |
146 | 82.0k | else |
147 | 82.0k | Strcat_char(os, (char)*p); |
148 | 111k | continue; |
149 | 7.24k | case SI: |
150 | 7.24k | st.gl = 0; |
151 | 7.24k | break; |
152 | 7.48k | case SO: |
153 | 7.48k | st.gl = 1; |
154 | 7.48k | break; |
155 | 15.6k | case SS2: |
156 | 15.6k | if (! st.design[2]) { |
157 | 1.52k | wtf_push_unknown(os, p, 1); |
158 | 1.52k | break; |
159 | 1.52k | } |
160 | 14.1k | st.ss = 2; |
161 | 14.1k | continue; |
162 | 13.3k | case SS3: |
163 | 13.3k | if (! st.design[3]) { |
164 | 2.87k | wtf_push_unknown(os, p, 1); |
165 | 2.87k | break; |
166 | 2.87k | } |
167 | 10.4k | st.ss = 3; |
168 | 10.4k | continue; |
169 | 47.2M | } |
170 | 44.8M | break; |
171 | 44.8M | case WC_ISO_MBYTE1: |
172 | 1.24M | switch (WC_ISO_MAP[*p]) { |
173 | 10.3k | case GL2: |
174 | 10.3k | if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) { |
175 | 9.75k | Strcat_char(os, (char)*q); |
176 | 9.75k | Strcat_char(os, (char)*p); |
177 | 9.75k | break; |
178 | 9.75k | } |
179 | 869k | case GL: |
180 | 869k | wtf_push_iso2022(os, gl_ccs, ((wc_uint32)*q << 8) | *p); |
181 | 869k | break; |
182 | 369k | default: |
183 | 369k | wtf_push_unknown(os, q, 2); |
184 | 369k | break; |
185 | 1.24M | } |
186 | 1.24M | break; |
187 | 1.24M | case WC_EUC_MBYTE1: |
188 | 994k | switch (WC_ISO_MAP[*p]) { |
189 | 16.0k | case GR2: |
190 | 16.0k | if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) { |
191 | 13.0k | wtf_push_unknown(os, q, 2); |
192 | 13.0k | break; |
193 | 13.0k | } |
194 | 904k | case GR: |
195 | 904k | if (gr_ccs == WC_CCS_CNS_11643_X) { |
196 | 299k | state = WC_EUC_TW_MBYTE2; |
197 | 299k | continue; |
198 | 299k | } |
199 | 604k | wtf_push_iso2022(os, gr_ccs, ((wc_uint32)*q << 8) | *p); |
200 | 604k | break; |
201 | 77.1k | default: |
202 | 77.1k | wtf_push_unknown(os, q, 2); |
203 | 77.1k | break; |
204 | 994k | } |
205 | 694k | break; |
206 | 694k | case WC_EUC_TW_MBYTE2: |
207 | 299k | if (WC_ISO_MAP[*p] == GR) { |
208 | 293k | if (0xa1 <= *q && *q <= 0xa7) { |
209 | 166k | wtf_push_iso2022(os, WC_CCS_CNS_11643_1 + (*q - 0xa1), |
210 | 166k | ((wc_uint32)*(q+1) << 8) | *p); |
211 | 166k | break; |
212 | 166k | } |
213 | 127k | if (0xa8 <= *q && *q <= 0xb0) { |
214 | 104k | wtf_push_iso2022(os, WC_CCS_CNS_11643_8 + (*q - 0xa8), |
215 | 104k | ((wc_uint32)*(q+1) << 8) | *p); |
216 | 104k | break; |
217 | 104k | } |
218 | 127k | } |
219 | 28.8k | wtf_push_unknown(os, q, 3); |
220 | 28.8k | break; |
221 | 20.6k | case WC_ISO_CSWSR: |
222 | 20.6k | if (*p == WC_C_ESC && *(p+1) == WC_C_CSWSR) { |
223 | 1.83k | if (*(p+2) == WC_F_ISO_BASE) { |
224 | 1.11k | state = st.state = WC_ISO_NOSTATE; |
225 | 1.11k | p += 2; |
226 | 1.11k | continue; |
227 | 1.11k | } else if (*(p+2) > WC_F_ISO_BASE && *(p+2) <= 0x7e) { |
228 | 219 | p += 2; |
229 | 219 | continue; |
230 | 219 | } |
231 | 1.83k | } |
232 | 19.2k | wtf_push_unknown(os, p, 1); |
233 | 19.2k | continue; |
234 | 0 | case WC_ISO_CSWOSR: |
235 | 0 | wtf_push_unknown(os, p, ep - p); |
236 | 0 | return os; |
237 | 0 | break; |
238 | 49.7M | } |
239 | 47.0M | st.ss = 0; |
240 | 47.0M | state = WC_ISO_NOSTATE; |
241 | 47.0M | } |
242 | 2.60k | switch (state) { |
243 | 50 | case WC_ISO_MBYTE1: |
244 | 109 | case WC_EUC_MBYTE1: |
245 | 109 | wtf_push_unknown(os, p-1, 1); |
246 | 109 | break; |
247 | 0 | case WC_EUC_TW_MBYTE1: |
248 | 0 | wtf_push_unknown(os, p-2, 2); |
249 | 0 | break; |
250 | 2.60k | } |
251 | 2.60k | return os; |
252 | 2.60k | } |
253 | | |
254 | | int |
255 | | wc_parse_iso2022_esc(wc_uchar **ptr, wc_status *st) |
256 | 116k | { |
257 | 116k | wc_uchar *p = *ptr, state, f = 0, g = 0, cs = 0; |
258 | | |
259 | 116k | if (*p != WC_C_ESC) |
260 | 0 | return 0; |
261 | 116k | state = *p; |
262 | 273k | for (p++; *p && state; p++) { |
263 | 200k | switch (state) { |
264 | 113k | case WC_C_ESC: /* ESC */ |
265 | 113k | switch (*p) { |
266 | 21.5k | case WC_C_MBCS: /* ESC '$' */ |
267 | 21.5k | state = *p; |
268 | 21.5k | continue; |
269 | 1.73k | case WC_C_G0_CS94: /* ESC '(' */ |
270 | 17.0k | case WC_C_G1_CS94: /* ESC ')' */ |
271 | 18.5k | case WC_C_G2_CS94: /* ESC '*' */ |
272 | 30.0k | case WC_C_G3_CS94: /* ESC '+' */ |
273 | 30.0k | state = cs = WC_C_G0_CS94; |
274 | 30.0k | g = *p & 0x03; |
275 | 30.0k | continue; |
276 | 1.92k | case WC_C_G0_CS96: /* ESC ',' */ /* ISO 2022 does not permit */ |
277 | 3.73k | case WC_C_G1_CS96: /* ESC '-' */ |
278 | 10.1k | case WC_C_G2_CS96: /* ESC '.' */ |
279 | 10.8k | case WC_C_G3_CS96: /* ESC '/' */ |
280 | 10.8k | state = cs = WC_C_G0_CS96; |
281 | 10.8k | g = *p & 0x03; |
282 | 10.8k | continue; |
283 | 2.96k | case WC_C_C0: /* ESC '!' */ /* not supported */ |
284 | 3.26k | case WC_C_C1: /* ESC '"' */ /* not supported */ |
285 | 6.06k | case WC_C_REP: /* ESC '&' */ /* not supported */ |
286 | 6.06k | state = cs = WC_C_C0; |
287 | 6.06k | continue; |
288 | 8.78k | case WC_C_CSWSR: /* ESC '%' */ /* not supported */ |
289 | 8.78k | state = cs = WC_C_CSWSR; |
290 | 8.78k | continue; |
291 | 195 | case WC_C_SS2: /* ESC 'N' */ |
292 | 195 | st->ss = 2; *ptr = p; return 1; |
293 | 403 | case WC_C_SS3: /* ESC 'O' */ |
294 | 403 | st->ss = 3; *ptr = p; return 1; |
295 | 1.30k | case WC_C_LS2: /* ESC 'n' */ |
296 | 1.30k | st->gl = 2; *ptr = p; return 1; |
297 | 280 | case WC_C_LS3: /* ESC 'o' */ |
298 | 280 | st->gl = 3; *ptr = p; return 1; |
299 | 810 | case WC_C_LS1R: /* ESC '~' */ |
300 | 810 | st->gr = 1; *ptr = p; return 1; |
301 | 2.55k | case WC_C_LS2R: /* ESC '}' */ |
302 | 2.55k | st->gr = 2; *ptr = p; return 1; |
303 | 303 | case WC_C_LS3R: /* ESC '|' */ |
304 | 303 | st->gr = 3; *ptr = p; return 1; |
305 | 30.6k | default: |
306 | 30.6k | return 0; |
307 | 113k | } |
308 | 0 | break; |
309 | 21.4k | case WC_C_MBCS: /* ESC '$' */ |
310 | 21.4k | switch (*p) { |
311 | 2.68k | case WC_F_JIS_C_6226: /* ESC '$' @ */ |
312 | 3.76k | case WC_F_JIS_X_0208: /* ESC '$' B */ |
313 | 5.10k | case WC_F_GB_2312: /* ESC '$' A */ |
314 | 5.10k | state = 0; |
315 | 5.10k | cs = WC_C_G0_CS94 | 0x80; |
316 | 5.10k | g = 0; |
317 | 5.10k | f = *p; |
318 | 5.10k | break; |
319 | 1.87k | case WC_C_G0_CS94: /* ESC '$' '(' */ |
320 | 3.15k | case WC_C_G1_CS94: /* ESC '$' ')' */ |
321 | 3.40k | case WC_C_G2_CS94: /* ESC '$' '*' */ |
322 | 3.70k | case WC_C_G3_CS94: /* ESC '$' '+' */ |
323 | 3.70k | state = cs = WC_C_G0_CS94 | 0x80; |
324 | 3.70k | g = *p & 0x03; |
325 | 3.70k | continue; |
326 | 392 | case WC_C_G0_CS96: /* ESC '$' ',' */ /* ISO 2022 does not permit */ |
327 | 756 | case WC_C_G1_CS96: /* ESC '$' '-' */ |
328 | 4.17k | case WC_C_G2_CS96: /* ESC '$' '.' */ |
329 | 5.24k | case WC_C_G3_CS96: /* ESC '$' '/' */ |
330 | 5.24k | state = cs = WC_C_G0_CS96 | 0x80; |
331 | 5.24k | g = *p & 0x03; |
332 | 5.24k | continue; |
333 | 7.43k | default: |
334 | 7.43k | return 0; |
335 | 21.4k | } |
336 | 5.10k | break; |
337 | 29.9k | case WC_C_G0_CS94: /* ESC [()*+] F */ |
338 | 29.9k | if (*p == WC_C_CS942) { /* ESC [()*+] '!' */ |
339 | 549 | state = cs = WC_C_CS942 | 0x80; |
340 | 549 | g = *p & 0x03; |
341 | 549 | continue; |
342 | 549 | } |
343 | 40.1k | case WC_C_G0_CS96: /* ESC [,-./] F */ |
344 | 43.8k | case WC_C_G0_CS94 | 0x80: /* ESC '$' [()*+] F */ |
345 | 49.0k | case WC_C_G0_CS96 | 0x80: /* ESC '$' [,-./] F */ |
346 | 49.5k | case WC_C_CS942 | 0x80: /* ESC [()*+] '!' F */ |
347 | 55.6k | case WC_C_C0: /* ESC [!"&] F */ |
348 | 55.9k | case WC_C_CSWSR | 0x80: /* ESC '%' '/' F */ |
349 | 55.9k | state = 0; |
350 | 55.9k | f = *p; |
351 | 55.9k | break; |
352 | 8.76k | case WC_C_CSWSR: /* ESC '%' F */ |
353 | 8.76k | if (*p == WC_C_CSWOSR) { /* ESC '%' '/' */ |
354 | 336 | state = cs = WC_C_CSWSR | 0x80; |
355 | 336 | continue; |
356 | 336 | } |
357 | 8.42k | state = 0; |
358 | 8.42k | f = *p; |
359 | 8.42k | break; |
360 | 0 | default: |
361 | 0 | return 0; |
362 | 200k | } |
363 | 200k | } |
364 | 72.8k | if (f < WC_F_ISO_BASE || f > 0x7e) |
365 | 46.1k | return 0; |
366 | 26.7k | switch (cs) { |
367 | 2.96k | case WC_C_G0_CS94: |
368 | 2.96k | st->design[g] = WC_CCS_SET_CS94(f); |
369 | 2.96k | break; |
370 | 7.37k | case WC_C_G0_CS94 | 0x80: |
371 | 7.37k | st->design[g] = WC_CCS_SET_CS94W(f); |
372 | 7.37k | break; |
373 | 3.01k | case WC_C_G0_CS96: |
374 | 3.01k | st->design[g] = WC_CCS_SET_CS96(f); |
375 | 3.01k | break; |
376 | 3.37k | case WC_C_G0_CS96 | 0x80: |
377 | 3.37k | st->design[g] = WC_CCS_SET_CS96W(f); |
378 | 3.37k | break; |
379 | 279 | case WC_C_CS942 | 0x80: |
380 | 279 | st->design[g] = WC_CCS_SET_CS942(f); |
381 | 279 | break; |
382 | 5.61k | case WC_C_CSWSR: |
383 | 5.61k | if (f == WC_F_ISO_BASE) |
384 | 4.37k | st->state = WC_ISO_NOSTATE; |
385 | 1.24k | else |
386 | 1.24k | st->state = WC_ISO_CSWSR; |
387 | 5.61k | break; |
388 | 0 | case WC_C_CSWOSR: |
389 | 0 | st->state = WC_ISO_CSWOSR; |
390 | 0 | break; |
391 | 26.7k | } |
392 | 26.7k | *ptr = p - 1; |
393 | 26.7k | return 1; |
394 | 26.7k | } |
395 | | |
396 | | void |
397 | | wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st) |
398 | 13.5M | { |
399 | 13.5M | wc_uchar g = 0; |
400 | 13.5M | wc_bool is_wide = WC_FALSE, retry = WC_FALSE; |
401 | 13.5M | wc_wchar_t cc2; |
402 | | |
403 | 25.4M | while (1) { |
404 | 25.4M | switch (WC_CCS_TYPE(cc.ccs)) { |
405 | 719k | case WC_CCS_A_CS94: |
406 | 719k | if (cc.ccs == WC_CCS_US_ASCII) |
407 | 688k | cc.ccs = st->g0_ccs; |
408 | 719k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
409 | 717k | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
410 | 719k | break; |
411 | 13.1M | case WC_CCS_A_CS94W: |
412 | 13.1M | is_wide = 1; |
413 | 13.1M | switch (cc.ccs) { |
414 | 0 | #ifdef USE_UNICODE |
415 | 3.04k | case WC_CCS_JIS_X_0212: |
416 | 3.04k | 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 | 3.04k | break; |
426 | 3.04k | case WC_CCS_JIS_X_0213_1: |
427 | 31.9k | case WC_CCS_JIS_X_0213_2: |
428 | 31.9k | 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 | 31.9k | break; |
437 | 13.1M | #endif |
438 | 13.1M | } |
439 | 13.1M | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
440 | 13.1M | g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
441 | 13.1M | break; |
442 | 5.40M | case WC_CCS_A_CS96: |
443 | 5.40M | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
444 | 5.40M | g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
445 | 5.40M | break; |
446 | 5.05k | case WC_CCS_A_CS96W: |
447 | 5.05k | is_wide = 1; |
448 | 5.05k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
449 | 4.71k | g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
450 | 5.05k | break; |
451 | 1.89k | case WC_CCS_A_CS942: |
452 | 1.89k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
453 | 1.67k | g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
454 | 1.89k | break; |
455 | 288k | case WC_CCS_A_UNKNOWN_W: |
456 | 288k | if (WcOption.no_replace) |
457 | 0 | return; |
458 | 288k | is_wide = 1; |
459 | 288k | cc.ccs = WC_CCS_US_ASCII; |
460 | 288k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
461 | 288k | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
462 | 288k | cc.code = ((wc_uint32)WC_REPLACE_W[0] << 8) | WC_REPLACE_W[1]; |
463 | 288k | break; |
464 | 505k | case WC_CCS_A_UNKNOWN: |
465 | 505k | if (WcOption.no_replace) |
466 | 0 | return; |
467 | 505k | cc.ccs = WC_CCS_US_ASCII; |
468 | 505k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
469 | 505k | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
470 | 505k | cc.code = (wc_uint32)WC_REPLACE[0]; |
471 | 505k | break; |
472 | 5.45M | default: |
473 | 5.45M | if ((cc.ccs == WC_CCS_JOHAB || cc.ccs == WC_CCS_JOHAB_1 || |
474 | 5.45M | cc.ccs == WC_CCS_JOHAB_2 || cc.ccs == WC_CCS_JOHAB_3) && |
475 | 1.85k | cs94w_gmap[WC_F_KS_X_1001 - WC_F_ISO_BASE]) { |
476 | 1.65k | wc_wchar_t cc2 = wc_johab_to_ksx1001(cc); |
477 | 1.65k | if (cc2.ccs == WC_CCS_KS_X_1001) { |
478 | 603 | cc = cc2; |
479 | 603 | continue; |
480 | 603 | } |
481 | 1.65k | } |
482 | 5.45M | #ifdef USE_UNICODE |
483 | 5.45M | if (WcOption.ucs_conv) |
484 | 5.45M | 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 | 5.45M | continue; |
489 | 25.4M | } |
490 | 20.0M | if (! g) { |
491 | 6.53M | #ifdef USE_UNICODE |
492 | 6.53M | if (WcOption.ucs_conv && ! retry) |
493 | 6.53M | 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 | 6.53M | retry = WC_TRUE; |
498 | 6.53M | continue; |
499 | 6.53M | } |
500 | | |
501 | 13.5M | wc_push_iso2022_esc(os, cc.ccs, g, 1, st); |
502 | 13.5M | if (is_wide) |
503 | 6.94M | Strcat_char(os, (char)((cc.code >> 8) & 0x7f)); |
504 | 13.5M | Strcat_char(os, (char)(cc.code & 0x7f)); |
505 | 13.5M | return; |
506 | 20.0M | } |
507 | 13.5M | } |
508 | | |
509 | | void |
510 | | wc_push_to_iso2022_end(Str os, wc_status *st) |
511 | 819 | { |
512 | 819 | if (st->design[1] != 0 && st->design[1] != st->g1_ccs) |
513 | 136 | wc_push_iso2022_esc(os, st->g1_ccs, WC_C_G1_CS94, 0, st); |
514 | 819 | wc_push_iso2022_esc(os, st->g0_ccs, WC_C_G0_CS94, 1, st); |
515 | 819 | } |
516 | | |
517 | | void |
518 | | wc_push_iso2022_esc(Str os, wc_ccs ccs, wc_uchar g, wc_uint8 invoke, wc_status *st) |
519 | 13.5M | { |
520 | 13.5M | wc_uint8 g_invoke = g & 0x03; |
521 | | |
522 | 13.5M | if (st->design[g_invoke] != ccs) { |
523 | 11.1M | Strcat_char(os, WC_C_ESC); |
524 | 11.1M | if (WC_CCS_IS_WIDE(ccs)) { |
525 | 5.89M | Strcat_char(os, WC_C_MBCS); |
526 | 5.89M | if (g_invoke != 0 || |
527 | 10.0k | (ccs != WC_CCS_JIS_C_6226 && |
528 | 10.0k | ccs != WC_CCS_JIS_X_0208 && |
529 | 510 | ccs != WC_CCS_GB_2312)) |
530 | 5.88M | Strcat_char(os, (char)g); |
531 | 5.89M | } else { |
532 | 5.23M | Strcat_char(os, (char)g); |
533 | 5.23M | if ((ccs & WC_CCS_A_ISO_2022) == WC_CCS_A_CS942) |
534 | 0 | Strcat_char(os, WC_C_CS942); |
535 | 5.23M | } |
536 | 11.1M | Strcat_char(os, (char)WC_CCS_GET_F(ccs)); |
537 | 11.1M | st->design[g_invoke] = ccs; |
538 | 11.1M | } |
539 | 13.5M | if (! invoke) |
540 | 136 | return; |
541 | | |
542 | 13.5M | switch (g_invoke) { |
543 | 1.88M | case 0: |
544 | 1.88M | if (st->gl != 0) { |
545 | 186k | Strcat_char(os, WC_C_SI); |
546 | 186k | st->gl = 0; |
547 | 186k | } |
548 | 1.88M | break; |
549 | 6.15M | case 1: |
550 | 6.15M | if (st->gl != 1) { |
551 | 186k | Strcat_char(os, WC_C_SO); |
552 | 186k | st->gl = 1; |
553 | 186k | } |
554 | 6.15M | break; |
555 | 5.37M | case 2: |
556 | 5.37M | Strcat_char(os, WC_C_ESC); |
557 | 5.37M | Strcat_char(os, WC_C_SS2); |
558 | 5.37M | break; |
559 | 87.8k | case 3: |
560 | 87.8k | Strcat_char(os, WC_C_ESC); |
561 | 87.8k | Strcat_char(os, WC_C_SS3); |
562 | 87.8k | break; |
563 | 13.5M | } |
564 | 13.5M | } |
565 | | |
566 | | void |
567 | | wc_push_to_euc(Str os, wc_wchar_t cc, wc_status *st) |
568 | 4.82M | { |
569 | 4.82M | wc_ccs g1_ccs = st->ces_info->gset[1].ccs; |
570 | | |
571 | 9.38M | while (1) { |
572 | 9.38M | if (cc.ccs == g1_ccs) { |
573 | 1.33M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
574 | 1.33M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
575 | 1.33M | return; |
576 | 1.33M | } |
577 | 8.04M | switch (cc.ccs) { |
578 | 1.17M | case WC_CCS_US_ASCII: |
579 | 1.17M | Strcat_char(os, (char)cc.code); |
580 | 1.17M | return; |
581 | 52.6k | case WC_CCS_C1: |
582 | 52.6k | Strcat_char(os, (char)(cc.code | 0x80)); |
583 | 52.6k | return; |
584 | 1.98M | case WC_CCS_UNKNOWN_W: |
585 | 1.98M | if (!WcOption.no_replace) |
586 | 1.98M | Strcat_charp(os, WC_REPLACE_W); |
587 | 1.98M | return; |
588 | 275k | case WC_CCS_UNKNOWN: |
589 | 275k | if (!WcOption.no_replace) |
590 | 275k | Strcat_charp(os, WC_REPLACE); |
591 | 275k | return; |
592 | 388 | case WC_CCS_JOHAB: |
593 | 388 | case WC_CCS_JOHAB_1: |
594 | 388 | case WC_CCS_JOHAB_2: |
595 | 388 | case WC_CCS_JOHAB_3: |
596 | 388 | if (st->ces_info->id == WC_CES_EUC_KR) { |
597 | 194 | cc = wc_johab_to_ksx1001(cc); |
598 | 194 | continue; |
599 | 194 | } |
600 | 4.55M | default: |
601 | 4.55M | #ifdef USE_UNICODE |
602 | 4.55M | if (WcOption.ucs_conv) |
603 | 4.55M | 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 | 4.55M | continue; |
608 | 8.04M | } |
609 | 8.04M | } |
610 | 4.82M | } |
611 | | |
612 | | void |
613 | | wc_push_to_eucjp(Str os, wc_wchar_t cc, wc_status *st) |
614 | 4.48M | { |
615 | 4.51M | while (1) { |
616 | 4.51M | switch (cc.ccs) { |
617 | 20.2k | case WC_CCS_US_ASCII: |
618 | 20.2k | Strcat_char(os, (char)cc.code); |
619 | 20.2k | return; |
620 | 11.0k | case WC_CCS_JIS_X_0201K: |
621 | 11.0k | 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 | 11.0k | } else if (WcOption.fix_width_conv) |
626 | 11.0k | cc.ccs = WC_CCS_UNKNOWN; |
627 | 0 | else |
628 | 0 | cc = wc_jisx0201k_to_jisx0208(cc); |
629 | 11.0k | continue; |
630 | 4.40M | case WC_CCS_JIS_X_0208: |
631 | 4.40M | break; |
632 | 1.35k | case WC_CCS_JIS_X_0213_1: |
633 | 1.35k | if (WcOption.use_jisx0213) |
634 | 0 | break; |
635 | 1.35k | #ifdef USE_UNICODE |
636 | 1.35k | else if (WcOption.ucs_conv && WcOption.use_jisx0212) |
637 | 0 | cc = wc_jisx0213_to_jisx0212(cc); |
638 | 1.35k | #endif |
639 | 1.35k | else |
640 | 1.35k | cc.ccs = WC_CCS_UNKNOWN_W; |
641 | 1.35k | continue; |
642 | 1.35k | case WC_CCS_JIS_X_0212: |
643 | 972 | if (WcOption.use_jisx0212) { |
644 | 0 | Strcat_char(os, WC_C_SS3R); |
645 | 0 | break; |
646 | 0 | } |
647 | 972 | #ifdef USE_UNICODE |
648 | 972 | else if (WcOption.ucs_conv && WcOption.use_jisx0213) |
649 | 0 | cc = wc_jisx0212_to_jisx0213(cc); |
650 | 972 | #endif |
651 | 972 | else |
652 | 972 | cc.ccs = WC_CCS_UNKNOWN_W; |
653 | 972 | continue; |
654 | 1.01k | case WC_CCS_JIS_X_0213_2: |
655 | 1.01k | if (WcOption.use_jisx0213) { |
656 | 0 | Strcat_char(os, WC_C_SS3R); |
657 | 0 | break; |
658 | 0 | } |
659 | 1.01k | #ifdef USE_UNICODE |
660 | 1.01k | else if (WcOption.ucs_conv && WcOption.use_jisx0212) |
661 | 0 | cc = wc_jisx0213_to_jisx0212(cc); |
662 | 1.01k | #endif |
663 | 1.01k | else |
664 | 1.01k | cc.ccs = WC_CCS_UNKNOWN_W; |
665 | 1.01k | continue; |
666 | 17.0k | case WC_CCS_C1: |
667 | 17.0k | Strcat_char(os, (char)(cc.code | 0x80)); |
668 | 17.0k | return; |
669 | 5.37k | case WC_CCS_UNKNOWN_W: |
670 | 5.37k | if (!WcOption.no_replace) |
671 | 5.37k | Strcat_charp(os, WC_REPLACE_W); |
672 | 5.37k | return; |
673 | 34.2k | case WC_CCS_UNKNOWN: |
674 | 34.2k | if (!WcOption.no_replace) |
675 | 34.2k | Strcat_charp(os, WC_REPLACE); |
676 | 34.2k | return; |
677 | 24.5k | default: |
678 | 24.5k | #ifdef USE_UNICODE |
679 | 24.5k | if (WcOption.ucs_conv) |
680 | 24.5k | 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 | 24.5k | continue; |
685 | 4.51M | } |
686 | 4.40M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
687 | 4.40M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
688 | 4.40M | return; |
689 | 4.51M | } |
690 | 4.48M | } |
691 | | |
692 | | void |
693 | | wc_push_to_euctw(Str os, wc_wchar_t cc, wc_status *st) |
694 | 11.3M | { |
695 | 21.2M | while (1) { |
696 | 21.2M | switch (cc.ccs) { |
697 | 1.19M | case WC_CCS_US_ASCII: |
698 | 1.19M | Strcat_char(os, (char)cc.code); |
699 | 1.19M | return; |
700 | 6.54M | case WC_CCS_CNS_11643_1: |
701 | 6.54M | break; |
702 | 12.1k | case WC_CCS_CNS_11643_2: |
703 | 476k | case WC_CCS_CNS_11643_3: |
704 | 478k | case WC_CCS_CNS_11643_4: |
705 | 641k | case WC_CCS_CNS_11643_5: |
706 | 647k | case WC_CCS_CNS_11643_6: |
707 | 648k | case WC_CCS_CNS_11643_7: |
708 | 648k | Strcat_char(os, WC_C_SS2R); |
709 | 648k | Strcat_char(os, (char)(0xA1 + (cc.ccs - WC_CCS_CNS_11643_1))); |
710 | 648k | break; |
711 | 6.89k | case WC_CCS_CNS_11643_8: |
712 | 10.9k | case WC_CCS_CNS_11643_9: |
713 | 11.3k | case WC_CCS_CNS_11643_10: |
714 | 19.9k | case WC_CCS_CNS_11643_11: |
715 | 20.5k | case WC_CCS_CNS_11643_12: |
716 | 106k | case WC_CCS_CNS_11643_13: |
717 | 106k | case WC_CCS_CNS_11643_14: |
718 | 107k | case WC_CCS_CNS_11643_15: |
719 | 110k | case WC_CCS_CNS_11643_16: |
720 | 110k | Strcat_char(os, WC_C_SS2R); |
721 | 110k | Strcat_char(os, (char)(0xA8 + (cc.ccs - WC_CCS_CNS_11643_8))); |
722 | 110k | break; |
723 | 257k | case WC_CCS_C1: |
724 | 257k | Strcat_char(os, (char)(cc.code | 0x80)); |
725 | 257k | return; |
726 | 1.56M | case WC_CCS_UNKNOWN_W: |
727 | 1.56M | if (!WcOption.no_replace) |
728 | 1.56M | Strcat_charp(os, WC_REPLACE_W); |
729 | 1.56M | return; |
730 | 988k | case WC_CCS_UNKNOWN: |
731 | 988k | if (!WcOption.no_replace) |
732 | 988k | Strcat_charp(os, WC_REPLACE); |
733 | 988k | return; |
734 | 9.91M | default: |
735 | 9.91M | #ifdef USE_UNICODE |
736 | 9.91M | if (WcOption.ucs_conv) |
737 | 9.91M | 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.91M | continue; |
742 | 21.2M | } |
743 | 7.30M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
744 | 7.30M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
745 | 7.30M | return; |
746 | 21.2M | } |
747 | 11.3M | } |
748 | | |
749 | | void |
750 | | wc_push_to_iso8859(Str os, wc_wchar_t cc, wc_status *st) |
751 | 10.9M | { |
752 | 10.9M | wc_ccs g1_ccs = st->ces_info->gset[1].ccs; |
753 | | |
754 | 15.8M | while (1) { |
755 | 15.8M | if (cc.ccs == g1_ccs) { |
756 | 3.06k | Strcat_char(os, (char)(cc.code | 0x80)); |
757 | 3.06k | return; |
758 | 3.06k | } |
759 | 15.8M | switch (cc.ccs) { |
760 | 2.05M | case WC_CCS_US_ASCII: |
761 | 2.05M | Strcat_char(os, (char)cc.code); |
762 | 2.05M | return; |
763 | 160k | case WC_CCS_C1: |
764 | 160k | Strcat_char(os, (char)(cc.code | 0x80)); |
765 | 160k | return; |
766 | 2.54M | case WC_CCS_UNKNOWN_W: |
767 | 2.54M | if (!WcOption.no_replace) |
768 | 2.54M | Strcat_charp(os, WC_REPLACE_W); |
769 | 2.54M | return; |
770 | 6.22M | case WC_CCS_UNKNOWN: |
771 | 6.22M | if (!WcOption.no_replace) |
772 | 6.22M | Strcat_charp(os, WC_REPLACE); |
773 | 6.22M | return; |
774 | 4.85M | default: |
775 | 4.85M | #ifdef USE_UNICODE |
776 | 4.85M | if (WcOption.ucs_conv) |
777 | 4.85M | 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 | 4.85M | continue; |
782 | 15.8M | } |
783 | 15.8M | } |
784 | 10.9M | } |
785 | | |
786 | | void |
787 | | wc_create_gmap(wc_status *st) |
788 | 765 | { |
789 | 765 | wc_gset *gset = st->ces_info->gset; |
790 | 765 | wc_uchar *gset_ext = st->ces_info->gset_ext; |
791 | 765 | int i, f; |
792 | | |
793 | 765 | if (WcOption.strict_iso2022) { |
794 | 49.7k | for (i = 0; i < WC_F_ISO_BASE; i++) { |
795 | 48.9k | cs94_gmap[i] = 0; |
796 | 48.9k | cs96_gmap[i] = 0; |
797 | 48.9k | cs94w_gmap[i] = 0; |
798 | 48.9k | cs96w_gmap[i] = 0; |
799 | 48.9k | cs942_gmap[i] = 0; |
800 | 48.9k | } |
801 | 765 | } 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.43k | for (i = 0; gset[i].ccs; i++) { |
811 | 4.67k | f = WC_CCS_GET_F(gset[i].ccs) - WC_F_ISO_BASE; |
812 | 4.67k | switch (WC_CCS_TYPE(gset[i].ccs)) { |
813 | 765 | case WC_CCS_A_CS94: |
814 | 765 | 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 | 765 | } |
820 | 765 | cs94_gmap[f] = gset[i].g; |
821 | 765 | break; |
822 | 3.71k | case WC_CCS_A_CS94W: |
823 | 3.71k | switch (gset[i].ccs) { |
824 | 97 | case WC_CCS_JIS_X_0212: |
825 | 97 | if (!WcOption.use_jisx0212) |
826 | 97 | continue; |
827 | 0 | break; |
828 | 1 | case WC_CCS_JIS_X_0213_1: |
829 | 2 | case WC_CCS_JIS_X_0213_2: |
830 | 2 | if (!WcOption.use_jisx0213) |
831 | 2 | continue; |
832 | 0 | break; |
833 | 3.71k | } |
834 | 3.61k | cs94w_gmap[f] = gset[i].g; |
835 | 3.61k | break; |
836 | 194 | case WC_CCS_A_CS96: |
837 | 194 | cs96_gmap[f] = gset[i].g; |
838 | 194 | 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.67k | } |
846 | 4.67k | } |
847 | 765 | } |
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 | } |