Line | Count | Source (jump to first uncovered line) |
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 | 803k | #define C0 WC_ISO_MAP_C0 |
13 | 2.24M | #define C1 WC_ISO_MAP_C1 |
14 | 5.74M | #define GL WC_ISO_MAP_GL |
15 | 45.6M | #define GR WC_ISO_MAP_GR |
16 | 35.1k | #define GL2 WC_ISO_MAP_GL96 |
17 | 519k | #define GR2 WC_ISO_MAP_GR96 |
18 | 4.66k | #define SO WC_ISO_MAP_SO |
19 | 5.03k | #define SI WC_ISO_MAP_SI |
20 | 87.4k | #define ESC WC_ISO_MAP_ESC |
21 | 7.28k | #define SS2 WC_ISO_MAP_SS2 |
22 | 7.27k | #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 | 48.7M | { |
53 | 48.7M | switch (ccs) { |
54 | 12.9k | case WC_CCS_JIS_C_6226: |
55 | 153k | case WC_CCS_JIS_X_0208: |
56 | 194k | case WC_CCS_JIS_X_0213_1: |
57 | 194k | ccs = wc_jisx0208_or_jisx02131(code); |
58 | 194k | break; |
59 | 10.6k | case WC_CCS_JIS_X_0212: |
60 | 56.8k | case WC_CCS_JIS_X_0213_2: |
61 | 56.8k | ccs = wc_jisx0212_or_jisx02132(code); |
62 | 56.8k | break; |
63 | 13.9k | case WC_CCS_JIS_X_0201: |
64 | 32.3k | case WC_CCS_GB_1988: |
65 | 32.3k | ccs = WC_CCS_US_ASCII; |
66 | 32.3k | break; |
67 | 48.7M | } |
68 | 48.7M | wtf_push(os, ccs, code); |
69 | 48.7M | } |
70 | | |
71 | | Str |
72 | | wc_conv_from_iso2022(Str is, wc_ces ces) |
73 | 2.87k | { |
74 | 2.87k | Str os; |
75 | 2.87k | wc_uchar *sp = (wc_uchar *)is->ptr; |
76 | 2.87k | wc_uchar *ep = sp + is->length; |
77 | 2.87k | wc_uchar *p, *q = NULL; |
78 | 2.87k | int state = WC_ISO_NOSTATE; |
79 | 2.87k | wc_status st; |
80 | 2.87k | wc_ccs gl_ccs, gr_ccs; |
81 | | |
82 | 5.82k | for (p = sp; p < ep && !(WC_ISO_MAP[*p] & WC_ISO_MAP_DETECT); p++) |
83 | 2.95k | ; |
84 | 2.87k | if (p == ep) |
85 | 263 | return is; |
86 | 2.61k | os = Strnew_size(is->length); |
87 | 2.61k | if (p > sp) |
88 | 304 | Strcat_charp_n(os, is->ptr, (int)(p - sp)); |
89 | | |
90 | 2.61k | wc_input_init(ces, &st); |
91 | 2.61k | gl_ccs = st.design[st.gl]; |
92 | 2.61k | gr_ccs = st.design[st.gr]; |
93 | | |
94 | 55.2M | for (; p < ep; p++) { |
95 | 55.2M | switch (state) { |
96 | 53.2M | case WC_ISO_NOSTATE: |
97 | 53.2M | switch (WC_ISO_MAP[*p]) { |
98 | 27.5k | case GL2: |
99 | 27.5k | gl_ccs = st.ss ? st.design[st.ss] |
100 | 27.5k | : st.design[st.gl]; |
101 | 27.5k | if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) { |
102 | 19.3k | Strcat_char(os, (char)*p); |
103 | 19.3k | break; |
104 | 19.3k | } |
105 | 4.80M | case GL: |
106 | 4.80M | gl_ccs = st.ss ? st.design[st.ss] |
107 | 4.80M | : st.design[st.gl]; |
108 | 4.80M | if (WC_CCS_IS_WIDE(gl_ccs)) { |
109 | 1.10M | q = p; |
110 | 1.10M | state = WC_ISO_MBYTE1; |
111 | 1.10M | continue; |
112 | 3.70M | } else if (gl_ccs == WC_CES_US_ASCII) |
113 | 0 | Strcat_char(os, (char)*p); |
114 | 3.70M | else |
115 | 3.70M | wtf_push_iso2022(os, gl_ccs, (wc_uint32)*p); |
116 | 3.70M | break; |
117 | 3.70M | case GR2: |
118 | 494k | gr_ccs = st.ss ? st.design[st.ss] |
119 | 494k | : st.design[st.gr]; |
120 | 494k | if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) { |
121 | 445k | wtf_push_unknown(os, p, 1); |
122 | 445k | break; |
123 | 445k | } |
124 | 44.8M | case GR: |
125 | 44.8M | gr_ccs = st.ss ? st.design[st.ss] |
126 | 44.8M | : st.design[st.gr]; |
127 | 44.8M | if (WC_CCS_IS_WIDE(gr_ccs)) { |
128 | 648k | q = p; |
129 | 648k | state = WC_EUC_MBYTE1; |
130 | 648k | continue; |
131 | 44.1M | } else if (gr_ccs) |
132 | 43.6M | wtf_push_iso2022(os, gr_ccs, (wc_uint32)*p); |
133 | 589k | else |
134 | 589k | wtf_push_unknown(os, p, 1); |
135 | 44.1M | break; |
136 | 44.1M | case C0: |
137 | 803k | Strcat_char(os, (char)*p); |
138 | 803k | break; |
139 | 2.24M | case C1: |
140 | 2.24M | wtf_push(os, WC_CCS_C1, (wc_uint32)*p); |
141 | 2.24M | break; |
142 | 87.4k | case ESC: |
143 | 87.4k | st.ss = 0; |
144 | 87.4k | if (wc_parse_iso2022_esc(&p, &st)) |
145 | 23.8k | state = st.state; |
146 | 63.6k | else |
147 | 63.6k | Strcat_char(os, (char)*p); |
148 | 87.4k | continue; |
149 | 5.03k | case SI: |
150 | 5.03k | st.gl = 0; |
151 | 5.03k | break; |
152 | 4.66k | case SO: |
153 | 4.66k | st.gl = 1; |
154 | 4.66k | break; |
155 | 7.28k | case SS2: |
156 | 7.28k | if (! st.design[2]) { |
157 | 1.10k | wtf_push_unknown(os, p, 1); |
158 | 1.10k | break; |
159 | 1.10k | } |
160 | 6.17k | st.ss = 2; |
161 | 6.17k | continue; |
162 | 7.27k | case SS3: |
163 | 7.27k | if (! st.design[3]) { |
164 | 1.63k | wtf_push_unknown(os, p, 1); |
165 | 1.63k | break; |
166 | 1.63k | } |
167 | 5.63k | st.ss = 3; |
168 | 5.63k | continue; |
169 | 53.2M | } |
170 | 51.4M | break; |
171 | 51.4M | case WC_ISO_MBYTE1: |
172 | 1.10M | switch (WC_ISO_MAP[*p]) { |
173 | 7.58k | case GL2: |
174 | 7.58k | if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) { |
175 | 6.99k | Strcat_char(os, (char)*q); |
176 | 6.99k | Strcat_char(os, (char)*p); |
177 | 6.99k | break; |
178 | 6.99k | } |
179 | 937k | case GL: |
180 | 937k | wtf_push_iso2022(os, gl_ccs, ((wc_uint32)*q << 8) | *p); |
181 | 937k | break; |
182 | 157k | default: |
183 | 157k | wtf_push_unknown(os, q, 2); |
184 | 157k | break; |
185 | 1.10M | } |
186 | 1.10M | break; |
187 | 1.10M | case WC_EUC_MBYTE1: |
188 | 648k | switch (WC_ISO_MAP[*p]) { |
189 | 24.5k | case GR2: |
190 | 24.5k | if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) { |
191 | 11.0k | wtf_push_unknown(os, q, 2); |
192 | 11.0k | break; |
193 | 11.0k | } |
194 | 557k | case GR: |
195 | 557k | if (gr_ccs == WC_CCS_CNS_11643_X) { |
196 | 254k | state = WC_EUC_TW_MBYTE2; |
197 | 254k | continue; |
198 | 254k | } |
199 | 303k | wtf_push_iso2022(os, gr_ccs, ((wc_uint32)*q << 8) | *p); |
200 | 303k | break; |
201 | 79.8k | default: |
202 | 79.8k | wtf_push_unknown(os, q, 2); |
203 | 79.8k | break; |
204 | 648k | } |
205 | 394k | break; |
206 | 394k | case WC_EUC_TW_MBYTE2: |
207 | 254k | if (WC_ISO_MAP[*p] == GR) { |
208 | 249k | if (0xa1 <= *q && *q <= 0xa7) { |
209 | 189k | wtf_push_iso2022(os, WC_CCS_CNS_11643_1 + (*q - 0xa1), |
210 | 189k | ((wc_uint32)*(q+1) << 8) | *p); |
211 | 189k | break; |
212 | 189k | } |
213 | 59.6k | if (0xa8 <= *q && *q <= 0xb0) { |
214 | 46.7k | wtf_push_iso2022(os, WC_CCS_CNS_11643_8 + (*q - 0xa8), |
215 | 46.7k | ((wc_uint32)*(q+1) << 8) | *p); |
216 | 46.7k | break; |
217 | 46.7k | } |
218 | 59.6k | } |
219 | 17.8k | wtf_push_unknown(os, q, 3); |
220 | 17.8k | break; |
221 | 16.7k | case WC_ISO_CSWSR: |
222 | 16.7k | if (*p == WC_C_ESC && *(p+1) == WC_C_CSWSR) { |
223 | 1.15k | if (*(p+2) == WC_F_ISO_BASE) { |
224 | 378 | state = st.state = WC_ISO_NOSTATE; |
225 | 378 | p += 2; |
226 | 378 | continue; |
227 | 773 | } else if (*(p+2) > WC_F_ISO_BASE && *(p+2) <= 0x7e) { |
228 | 253 | p += 2; |
229 | 253 | continue; |
230 | 253 | } |
231 | 1.15k | } |
232 | 16.1k | wtf_push_unknown(os, p, 1); |
233 | 16.1k | continue; |
234 | 0 | case WC_ISO_CSWOSR: |
235 | 0 | wtf_push_unknown(os, p, ep - p); |
236 | 0 | return os; |
237 | 0 | break; |
238 | 55.2M | } |
239 | 53.1M | st.ss = 0; |
240 | 53.1M | state = WC_ISO_NOSTATE; |
241 | 53.1M | } |
242 | 2.61k | switch (state) { |
243 | 54 | case WC_ISO_MBYTE1: |
244 | 110 | case WC_EUC_MBYTE1: |
245 | 110 | wtf_push_unknown(os, p-1, 1); |
246 | 110 | break; |
247 | 0 | case WC_EUC_TW_MBYTE1: |
248 | 0 | wtf_push_unknown(os, p-2, 2); |
249 | 0 | break; |
250 | 2.61k | } |
251 | 2.61k | return os; |
252 | 2.61k | } |
253 | | |
254 | | int |
255 | | wc_parse_iso2022_esc(wc_uchar **ptr, wc_status *st) |
256 | 95.0k | { |
257 | 95.0k | wc_uchar *p = *ptr, state, f = 0, g = 0, cs = 0; |
258 | | |
259 | 95.0k | if (*p != WC_C_ESC) |
260 | 0 | return 0; |
261 | 95.0k | state = *p; |
262 | 240k | for (p++; *p && state; p++) { |
263 | 174k | switch (state) { |
264 | 92.4k | case WC_C_ESC: /* ESC */ |
265 | 92.4k | switch (*p) { |
266 | 24.7k | case WC_C_MBCS: /* ESC '$' */ |
267 | 24.7k | state = *p; |
268 | 24.7k | continue; |
269 | 1.06k | case WC_C_G0_CS94: /* ESC '(' */ |
270 | 17.4k | case WC_C_G1_CS94: /* ESC ')' */ |
271 | 19.3k | case WC_C_G2_CS94: /* ESC '*' */ |
272 | 33.2k | case WC_C_G3_CS94: /* ESC '+' */ |
273 | 33.2k | state = cs = WC_C_G0_CS94; |
274 | 33.2k | g = *p & 0x03; |
275 | 33.2k | continue; |
276 | 3.03k | case WC_C_G0_CS96: /* ESC ',' */ /* ISO 2022 does not permit */ |
277 | 3.21k | case WC_C_G1_CS96: /* ESC '-' */ |
278 | 5.16k | case WC_C_G2_CS96: /* ESC '.' */ |
279 | 6.11k | case WC_C_G3_CS96: /* ESC '/' */ |
280 | 6.11k | state = cs = WC_C_G0_CS96; |
281 | 6.11k | g = *p & 0x03; |
282 | 6.11k | continue; |
283 | 522 | case WC_C_C0: /* ESC '!' */ /* not supported */ |
284 | 809 | case WC_C_C1: /* ESC '"' */ /* not supported */ |
285 | 3.74k | case WC_C_REP: /* ESC '&' */ /* not supported */ |
286 | 3.74k | state = cs = WC_C_C0; |
287 | 3.74k | continue; |
288 | 3.81k | case WC_C_CSWSR: /* ESC '%' */ /* not supported */ |
289 | 3.81k | state = cs = WC_C_CSWSR; |
290 | 3.81k | continue; |
291 | 414 | case WC_C_SS2: /* ESC 'N' */ |
292 | 414 | st->ss = 2; *ptr = p; return 1; |
293 | 565 | case WC_C_SS3: /* ESC 'O' */ |
294 | 565 | st->ss = 3; *ptr = p; return 1; |
295 | 1.54k | case WC_C_LS2: /* ESC 'n' */ |
296 | 1.54k | st->gl = 2; *ptr = p; return 1; |
297 | 1.76k | case WC_C_LS3: /* ESC 'o' */ |
298 | 1.76k | st->gl = 3; *ptr = p; return 1; |
299 | 354 | case WC_C_LS1R: /* ESC '~' */ |
300 | 354 | st->gr = 1; *ptr = p; return 1; |
301 | 2.02k | case WC_C_LS2R: /* ESC '}' */ |
302 | 2.02k | st->gr = 2; *ptr = p; return 1; |
303 | 345 | case WC_C_LS3R: /* ESC '|' */ |
304 | 345 | st->gr = 3; *ptr = p; return 1; |
305 | 13.8k | default: |
306 | 13.8k | return 0; |
307 | 92.4k | } |
308 | 0 | break; |
309 | 24.6k | case WC_C_MBCS: /* ESC '$' */ |
310 | 24.6k | switch (*p) { |
311 | 3.65k | case WC_F_JIS_C_6226: /* ESC '$' @ */ |
312 | 4.53k | case WC_F_JIS_X_0208: /* ESC '$' B */ |
313 | 6.20k | case WC_F_GB_2312: /* ESC '$' A */ |
314 | 6.20k | state = 0; |
315 | 6.20k | cs = WC_C_G0_CS94 | 0x80; |
316 | 6.20k | g = 0; |
317 | 6.20k | f = *p; |
318 | 6.20k | break; |
319 | 1.31k | case WC_C_G0_CS94: /* ESC '$' '(' */ |
320 | 2.48k | case WC_C_G1_CS94: /* ESC '$' ')' */ |
321 | 2.80k | case WC_C_G2_CS94: /* ESC '$' '*' */ |
322 | 3.20k | case WC_C_G3_CS94: /* ESC '$' '+' */ |
323 | 3.20k | state = cs = WC_C_G0_CS94 | 0x80; |
324 | 3.20k | g = *p & 0x03; |
325 | 3.20k | continue; |
326 | 552 | case WC_C_G0_CS96: /* ESC '$' ',' */ /* ISO 2022 does not permit */ |
327 | 2.85k | case WC_C_G1_CS96: /* ESC '$' '-' */ |
328 | 5.02k | case WC_C_G2_CS96: /* ESC '$' '.' */ |
329 | 6.67k | case WC_C_G3_CS96: /* ESC '$' '/' */ |
330 | 6.67k | state = cs = WC_C_G0_CS96 | 0x80; |
331 | 6.67k | g = *p & 0x03; |
332 | 6.67k | continue; |
333 | 8.61k | default: |
334 | 8.61k | return 0; |
335 | 24.6k | } |
336 | 6.20k | break; |
337 | 33.1k | case WC_C_G0_CS94: /* ESC [()*+] F */ |
338 | 33.1k | if (*p == WC_C_CS942) { /* ESC [()*+] '!' */ |
339 | 1.09k | state = cs = WC_C_CS942 | 0x80; |
340 | 1.09k | g = *p & 0x03; |
341 | 1.09k | continue; |
342 | 1.09k | } |
343 | 38.1k | case WC_C_G0_CS96: /* ESC [,-./] F */ |
344 | 41.2k | case WC_C_G0_CS94 | 0x80: /* ESC '$' [()*+] F */ |
345 | 47.8k | case WC_C_G0_CS96 | 0x80: /* ESC '$' [,-./] F */ |
346 | 48.9k | case WC_C_CS942 | 0x80: /* ESC [()*+] '!' F */ |
347 | 52.6k | case WC_C_C0: /* ESC [!"&] F */ |
348 | 52.8k | case WC_C_CSWSR | 0x80: /* ESC '%' '/' F */ |
349 | 52.8k | state = 0; |
350 | 52.8k | f = *p; |
351 | 52.8k | break; |
352 | 3.78k | case WC_C_CSWSR: /* ESC '%' F */ |
353 | 3.78k | if (*p == WC_C_CSWOSR) { /* ESC '%' '/' */ |
354 | 216 | state = cs = WC_C_CSWSR | 0x80; |
355 | 216 | continue; |
356 | 216 | } |
357 | 3.57k | state = 0; |
358 | 3.57k | f = *p; |
359 | 3.57k | break; |
360 | 0 | default: |
361 | 0 | return 0; |
362 | 174k | } |
363 | 174k | } |
364 | 65.6k | if (f < WC_F_ISO_BASE || f > 0x7e) |
365 | 43.9k | return 0; |
366 | 21.6k | switch (cs) { |
367 | 2.68k | case WC_C_G0_CS94: |
368 | 2.68k | st->design[g] = WC_CCS_SET_CS94(f); |
369 | 2.68k | break; |
370 | 7.53k | case WC_C_G0_CS94 | 0x80: |
371 | 7.53k | st->design[g] = WC_CCS_SET_CS94W(f); |
372 | 7.53k | break; |
373 | 3.23k | case WC_C_G0_CS96: |
374 | 3.23k | st->design[g] = WC_CCS_SET_CS96(f); |
375 | 3.23k | break; |
376 | 4.10k | case WC_C_G0_CS96 | 0x80: |
377 | 4.10k | st->design[g] = WC_CCS_SET_CS96W(f); |
378 | 4.10k | break; |
379 | 603 | case WC_C_CS942 | 0x80: |
380 | 603 | st->design[g] = WC_CCS_SET_CS942(f); |
381 | 603 | break; |
382 | 1.04k | case WC_C_CSWSR: |
383 | 1.04k | if (f == WC_F_ISO_BASE) |
384 | 510 | st->state = WC_ISO_NOSTATE; |
385 | 536 | else |
386 | 536 | st->state = WC_ISO_CSWSR; |
387 | 1.04k | break; |
388 | 0 | case WC_C_CSWOSR: |
389 | 0 | st->state = WC_ISO_CSWOSR; |
390 | 0 | break; |
391 | 21.6k | } |
392 | 21.6k | *ptr = p - 1; |
393 | 21.6k | return 1; |
394 | 21.6k | } |
395 | | |
396 | | void |
397 | | wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st) |
398 | 12.0M | { |
399 | 12.0M | wc_uchar g = 0; |
400 | 12.0M | wc_bool is_wide = WC_FALSE, retry = WC_FALSE; |
401 | 12.0M | wc_wchar_t cc2; |
402 | | |
403 | 23.0M | while (1) { |
404 | 23.0M | switch (WC_CCS_TYPE(cc.ccs)) { |
405 | 779k | case WC_CCS_A_CS94: |
406 | 779k | if (cc.ccs == WC_CCS_US_ASCII) |
407 | 756k | cc.ccs = st->g0_ccs; |
408 | 779k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
409 | 771k | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
410 | 779k | break; |
411 | 15.1M | case WC_CCS_A_CS94W: |
412 | 15.1M | is_wide = 1; |
413 | 15.1M | switch (cc.ccs) { |
414 | 0 | #ifdef USE_UNICODE |
415 | 498 | case WC_CCS_JIS_X_0212: |
416 | 498 | if (!WcOption.use_jisx0212 && WcOption.use_jisx0213 && |
417 | 498 | 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 | 498 | break; |
426 | 32.9k | case WC_CCS_JIS_X_0213_1: |
427 | 33.3k | case WC_CCS_JIS_X_0213_2: |
428 | 33.3k | if (!WcOption.use_jisx0213 && WcOption.use_jisx0212 && |
429 | 33.3k | 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 | 33.3k | break; |
437 | 15.1M | #endif |
438 | 15.1M | } |
439 | 15.1M | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
440 | 15.1M | g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
441 | 15.1M | break; |
442 | 2.52M | case WC_CCS_A_CS96: |
443 | 2.52M | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
444 | 2.52M | g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
445 | 2.52M | break; |
446 | 2.82k | case WC_CCS_A_CS96W: |
447 | 2.82k | is_wide = 1; |
448 | 2.82k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
449 | 346 | g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
450 | 2.82k | break; |
451 | 178k | case WC_CCS_A_CS942: |
452 | 178k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
453 | 178k | g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
454 | 178k | break; |
455 | 173k | case WC_CCS_A_UNKNOWN_W: |
456 | 173k | if (WcOption.no_replace) |
457 | 0 | return; |
458 | 173k | is_wide = 1; |
459 | 173k | cc.ccs = WC_CCS_US_ASCII; |
460 | 173k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
461 | 173k | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
462 | 173k | cc.code = ((wc_uint32)WC_REPLACE_W[0] << 8) | WC_REPLACE_W[1]; |
463 | 173k | break; |
464 | 943k | case WC_CCS_A_UNKNOWN: |
465 | 943k | if (WcOption.no_replace) |
466 | 0 | return; |
467 | 943k | cc.ccs = WC_CCS_US_ASCII; |
468 | 943k | if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE) |
469 | 943k | g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE]; |
470 | 943k | cc.code = (wc_uint32)WC_REPLACE[0]; |
471 | 943k | break; |
472 | 3.26M | default: |
473 | 3.26M | if ((cc.ccs == WC_CCS_JOHAB || cc.ccs == WC_CCS_JOHAB_1 || |
474 | 3.26M | cc.ccs == WC_CCS_JOHAB_2 || cc.ccs == WC_CCS_JOHAB_3) && |
475 | 3.26M | cs94w_gmap[WC_F_KS_X_1001 - WC_F_ISO_BASE]) { |
476 | 3.33k | wc_wchar_t cc2 = wc_johab_to_ksx1001(cc); |
477 | 3.33k | if (cc2.ccs == WC_CCS_KS_X_1001) { |
478 | 1.55k | cc = cc2; |
479 | 1.55k | continue; |
480 | 1.55k | } |
481 | 3.33k | } |
482 | 3.26M | #ifdef USE_UNICODE |
483 | 3.26M | if (WcOption.ucs_conv) |
484 | 3.26M | 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 | 3.26M | continue; |
489 | 23.0M | } |
490 | 19.7M | if (! g) { |
491 | 7.70M | #ifdef USE_UNICODE |
492 | 7.70M | if (WcOption.ucs_conv && ! retry) |
493 | 7.70M | 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.70M | retry = WC_TRUE; |
498 | 7.70M | continue; |
499 | 7.70M | } |
500 | | |
501 | 12.0M | wc_push_iso2022_esc(os, cc.ccs, g, 1, st); |
502 | 12.0M | if (is_wide) |
503 | 7.85M | Strcat_char(os, (char)((cc.code >> 8) & 0x7f)); |
504 | 12.0M | Strcat_char(os, (char)(cc.code & 0x7f)); |
505 | 12.0M | return; |
506 | 19.7M | } |
507 | 12.0M | } |
508 | | |
509 | | void |
510 | | wc_push_to_iso2022_end(Str os, wc_status *st) |
511 | 742 | { |
512 | 742 | if (st->design[1] != 0 && st->design[1] != st->g1_ccs) |
513 | 141 | wc_push_iso2022_esc(os, st->g1_ccs, WC_C_G1_CS94, 0, st); |
514 | 742 | wc_push_iso2022_esc(os, st->g0_ccs, WC_C_G0_CS94, 1, st); |
515 | 742 | } |
516 | | |
517 | | void |
518 | | wc_push_iso2022_esc(Str os, wc_ccs ccs, wc_uchar g, wc_uint8 invoke, wc_status *st) |
519 | 12.0M | { |
520 | 12.0M | wc_uint8 g_invoke = g & 0x03; |
521 | | |
522 | 12.0M | if (st->design[g_invoke] != ccs) { |
523 | 9.53M | Strcat_char(os, WC_C_ESC); |
524 | 9.53M | if (WC_CCS_IS_WIDE(ccs)) { |
525 | 7.11M | Strcat_char(os, WC_C_MBCS); |
526 | 7.11M | if (g_invoke != 0 || |
527 | 7.11M | (ccs != WC_CCS_JIS_C_6226 && |
528 | 28.4k | ccs != WC_CCS_JIS_X_0208 && |
529 | 28.4k | ccs != WC_CCS_GB_2312)) |
530 | 7.08M | Strcat_char(os, (char)g); |
531 | 7.11M | } else { |
532 | 2.41M | Strcat_char(os, (char)g); |
533 | 2.41M | if ((ccs & WC_CCS_A_ISO_2022) == WC_CCS_A_CS942) |
534 | 0 | Strcat_char(os, WC_C_CS942); |
535 | 2.41M | } |
536 | 9.53M | Strcat_char(os, (char)WC_CCS_GET_F(ccs)); |
537 | 9.53M | st->design[g_invoke] = ccs; |
538 | 9.53M | } |
539 | 12.0M | if (! invoke) |
540 | 141 | return; |
541 | | |
542 | 12.0M | switch (g_invoke) { |
543 | 1.99M | case 0: |
544 | 1.99M | if (st->gl != 0) { |
545 | 342k | Strcat_char(os, WC_C_SI); |
546 | 342k | st->gl = 0; |
547 | 342k | } |
548 | 1.99M | break; |
549 | 7.37M | case 1: |
550 | 7.37M | if (st->gl != 1) { |
551 | 342k | Strcat_char(os, WC_C_SO); |
552 | 342k | st->gl = 1; |
553 | 342k | } |
554 | 7.37M | break; |
555 | 2.52M | case 2: |
556 | 2.52M | Strcat_char(os, WC_C_ESC); |
557 | 2.52M | Strcat_char(os, WC_C_SS2); |
558 | 2.52M | break; |
559 | 183k | case 3: |
560 | 183k | Strcat_char(os, WC_C_ESC); |
561 | 183k | Strcat_char(os, WC_C_SS3); |
562 | 183k | break; |
563 | 12.0M | } |
564 | 12.0M | } |
565 | | |
566 | | void |
567 | | wc_push_to_euc(Str os, wc_wchar_t cc, wc_status *st) |
568 | 4.01M | { |
569 | 4.01M | wc_ccs g1_ccs = st->ces_info->gset[1].ccs; |
570 | | |
571 | 7.93M | while (1) { |
572 | 7.93M | if (cc.ccs == g1_ccs) { |
573 | 1.44M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
574 | 1.44M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
575 | 1.44M | return; |
576 | 1.44M | } |
577 | 6.48M | switch (cc.ccs) { |
578 | 2.30M | case WC_CCS_US_ASCII: |
579 | 2.30M | Strcat_char(os, (char)cc.code); |
580 | 2.30M | return; |
581 | 3.17k | case WC_CCS_C1: |
582 | 3.17k | Strcat_char(os, (char)(cc.code | 0x80)); |
583 | 3.17k | return; |
584 | 165k | case WC_CCS_UNKNOWN_W: |
585 | 165k | if (!WcOption.no_replace) |
586 | 165k | Strcat_charp(os, WC_REPLACE_W); |
587 | 165k | return; |
588 | 85.6k | case WC_CCS_UNKNOWN: |
589 | 85.6k | if (!WcOption.no_replace) |
590 | 85.6k | Strcat_charp(os, WC_REPLACE); |
591 | 85.6k | return; |
592 | 104k | case WC_CCS_JOHAB: |
593 | 104k | case WC_CCS_JOHAB_1: |
594 | 104k | case WC_CCS_JOHAB_2: |
595 | 104k | case WC_CCS_JOHAB_3: |
596 | 104k | if (st->ces_info->id == WC_CES_EUC_KR) { |
597 | 104k | cc = wc_johab_to_ksx1001(cc); |
598 | 104k | continue; |
599 | 104k | } |
600 | 3.82M | default: |
601 | 3.82M | #ifdef USE_UNICODE |
602 | 3.82M | if (WcOption.ucs_conv) |
603 | 3.82M | 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 | 3.82M | continue; |
608 | 6.48M | } |
609 | 6.48M | } |
610 | 4.01M | } |
611 | | |
612 | | void |
613 | | wc_push_to_eucjp(Str os, wc_wchar_t cc, wc_status *st) |
614 | 5.75M | { |
615 | 6.18M | while (1) { |
616 | 6.18M | switch (cc.ccs) { |
617 | 19.9k | case WC_CCS_US_ASCII: |
618 | 19.9k | Strcat_char(os, (char)cc.code); |
619 | 19.9k | return; |
620 | 20.1k | case WC_CCS_JIS_X_0201K: |
621 | 20.1k | 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 | 20.1k | } else if (WcOption.fix_width_conv) |
626 | 20.1k | cc.ccs = WC_CCS_UNKNOWN; |
627 | 0 | else |
628 | 0 | cc = wc_jisx0201k_to_jisx0208(cc); |
629 | 20.1k | continue; |
630 | 5.54M | case WC_CCS_JIS_X_0208: |
631 | 5.54M | break; |
632 | 862 | case WC_CCS_JIS_X_0213_1: |
633 | 862 | if (WcOption.use_jisx0213) |
634 | 0 | break; |
635 | 862 | #ifdef USE_UNICODE |
636 | 862 | else if (WcOption.ucs_conv && WcOption.use_jisx0212) |
637 | 0 | cc = wc_jisx0213_to_jisx0212(cc); |
638 | 862 | #endif |
639 | 862 | else |
640 | 862 | cc.ccs = WC_CCS_UNKNOWN_W; |
641 | 862 | continue; |
642 | 862 | case WC_CCS_JIS_X_0212: |
643 | 248 | if (WcOption.use_jisx0212) { |
644 | 0 | Strcat_char(os, WC_C_SS3R); |
645 | 0 | break; |
646 | 0 | } |
647 | 248 | #ifdef USE_UNICODE |
648 | 248 | else if (WcOption.ucs_conv && WcOption.use_jisx0213) |
649 | 0 | cc = wc_jisx0212_to_jisx0213(cc); |
650 | 248 | #endif |
651 | 248 | else |
652 | 248 | cc.ccs = WC_CCS_UNKNOWN_W; |
653 | 248 | continue; |
654 | 248 | case WC_CCS_JIS_X_0213_2: |
655 | 233 | if (WcOption.use_jisx0213) { |
656 | 0 | Strcat_char(os, WC_C_SS3R); |
657 | 0 | break; |
658 | 0 | } |
659 | 233 | #ifdef USE_UNICODE |
660 | 233 | else if (WcOption.ucs_conv && WcOption.use_jisx0212) |
661 | 0 | cc = wc_jisx0213_to_jisx0212(cc); |
662 | 233 | #endif |
663 | 233 | else |
664 | 233 | cc.ccs = WC_CCS_UNKNOWN_W; |
665 | 233 | continue; |
666 | 31.2k | case WC_CCS_C1: |
667 | 31.2k | Strcat_char(os, (char)(cc.code | 0x80)); |
668 | 31.2k | return; |
669 | 10.5k | case WC_CCS_UNKNOWN_W: |
670 | 10.5k | if (!WcOption.no_replace) |
671 | 10.5k | Strcat_charp(os, WC_REPLACE_W); |
672 | 10.5k | return; |
673 | 142k | case WC_CCS_UNKNOWN: |
674 | 142k | if (!WcOption.no_replace) |
675 | 142k | Strcat_charp(os, WC_REPLACE); |
676 | 142k | return; |
677 | 410k | default: |
678 | 410k | #ifdef USE_UNICODE |
679 | 410k | if (WcOption.ucs_conv) |
680 | 410k | 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 | 410k | continue; |
685 | 6.18M | } |
686 | 5.54M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
687 | 5.54M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
688 | 5.54M | return; |
689 | 6.18M | } |
690 | 5.75M | } |
691 | | |
692 | | void |
693 | | wc_push_to_euctw(Str os, wc_wchar_t cc, wc_status *st) |
694 | 8.36M | { |
695 | 15.4M | while (1) { |
696 | 15.4M | switch (cc.ccs) { |
697 | 31.7k | case WC_CCS_US_ASCII: |
698 | 31.7k | Strcat_char(os, (char)cc.code); |
699 | 31.7k | return; |
700 | 5.01M | case WC_CCS_CNS_11643_1: |
701 | 5.01M | break; |
702 | 14.0k | case WC_CCS_CNS_11643_2: |
703 | 539k | case WC_CCS_CNS_11643_3: |
704 | 606k | case WC_CCS_CNS_11643_4: |
705 | 749k | case WC_CCS_CNS_11643_5: |
706 | 785k | case WC_CCS_CNS_11643_6: |
707 | 787k | case WC_CCS_CNS_11643_7: |
708 | 787k | Strcat_char(os, WC_C_SS2R); |
709 | 787k | Strcat_char(os, (char)(0xA1 + (cc.ccs - WC_CCS_CNS_11643_1))); |
710 | 787k | break; |
711 | 208 | case WC_CCS_CNS_11643_8: |
712 | 3.65k | case WC_CCS_CNS_11643_9: |
713 | 3.87k | case WC_CCS_CNS_11643_10: |
714 | 36.6k | case WC_CCS_CNS_11643_11: |
715 | 37.1k | case WC_CCS_CNS_11643_12: |
716 | 71.5k | case WC_CCS_CNS_11643_13: |
717 | 72.8k | case WC_CCS_CNS_11643_14: |
718 | 73.2k | case WC_CCS_CNS_11643_15: |
719 | 76.5k | case WC_CCS_CNS_11643_16: |
720 | 76.5k | Strcat_char(os, WC_C_SS2R); |
721 | 76.5k | Strcat_char(os, (char)(0xA8 + (cc.ccs - WC_CCS_CNS_11643_8))); |
722 | 76.5k | break; |
723 | 225k | case WC_CCS_C1: |
724 | 225k | Strcat_char(os, (char)(cc.code | 0x80)); |
725 | 225k | return; |
726 | 1.93M | case WC_CCS_UNKNOWN_W: |
727 | 1.93M | if (!WcOption.no_replace) |
728 | 1.93M | Strcat_charp(os, WC_REPLACE_W); |
729 | 1.93M | return; |
730 | 290k | case WC_CCS_UNKNOWN: |
731 | 290k | if (!WcOption.no_replace) |
732 | 290k | Strcat_charp(os, WC_REPLACE); |
733 | 290k | return; |
734 | 7.10M | default: |
735 | 7.10M | #ifdef USE_UNICODE |
736 | 7.10M | if (WcOption.ucs_conv) |
737 | 7.10M | 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 | 7.10M | continue; |
742 | 15.4M | } |
743 | 5.87M | Strcat_char(os, (char)((cc.code >> 8) | 0x80)); |
744 | 5.87M | Strcat_char(os, (char)((cc.code & 0xff) | 0x80)); |
745 | 5.87M | return; |
746 | 15.4M | } |
747 | 8.36M | } |
748 | | |
749 | | void |
750 | | wc_push_to_iso8859(Str os, wc_wchar_t cc, wc_status *st) |
751 | 10.4M | { |
752 | 10.4M | wc_ccs g1_ccs = st->ces_info->gset[1].ccs; |
753 | | |
754 | 16.2M | while (1) { |
755 | 16.2M | if (cc.ccs == g1_ccs) { |
756 | 424k | Strcat_char(os, (char)(cc.code | 0x80)); |
757 | 424k | return; |
758 | 424k | } |
759 | 15.8M | switch (cc.ccs) { |
760 | 1.83M | case WC_CCS_US_ASCII: |
761 | 1.83M | Strcat_char(os, (char)cc.code); |
762 | 1.83M | return; |
763 | 309k | case WC_CCS_C1: |
764 | 309k | Strcat_char(os, (char)(cc.code | 0x80)); |
765 | 309k | return; |
766 | 3.14M | case WC_CCS_UNKNOWN_W: |
767 | 3.14M | if (!WcOption.no_replace) |
768 | 3.14M | Strcat_charp(os, WC_REPLACE_W); |
769 | 3.14M | return; |
770 | 4.76M | case WC_CCS_UNKNOWN: |
771 | 4.76M | if (!WcOption.no_replace) |
772 | 4.76M | Strcat_charp(os, WC_REPLACE); |
773 | 4.76M | return; |
774 | 5.80M | default: |
775 | 5.80M | #ifdef USE_UNICODE |
776 | 5.80M | if (WcOption.ucs_conv) |
777 | 5.80M | 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 | 5.80M | continue; |
782 | 15.8M | } |
783 | 15.8M | } |
784 | 10.4M | } |
785 | | |
786 | | void |
787 | | wc_create_gmap(wc_status *st) |
788 | 679 | { |
789 | 679 | wc_gset *gset = st->ces_info->gset; |
790 | 679 | wc_uchar *gset_ext = st->ces_info->gset_ext; |
791 | 679 | int i, f; |
792 | | |
793 | 679 | if (WcOption.strict_iso2022) { |
794 | 44.1k | for (i = 0; i < WC_F_ISO_BASE; i++) { |
795 | 43.4k | cs94_gmap[i] = 0; |
796 | 43.4k | cs96_gmap[i] = 0; |
797 | 43.4k | cs94w_gmap[i] = 0; |
798 | 43.4k | cs96w_gmap[i] = 0; |
799 | 43.4k | cs942_gmap[i] = 0; |
800 | 43.4k | } |
801 | 679 | } 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 | 4.87k | for (i = 0; gset[i].ccs; i++) { |
811 | 4.19k | f = WC_CCS_GET_F(gset[i].ccs) - WC_F_ISO_BASE; |
812 | 4.19k | switch (WC_CCS_TYPE(gset[i].ccs)) { |
813 | 679 | case WC_CCS_A_CS94: |
814 | 679 | 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 | 679 | } |
820 | 679 | cs94_gmap[f] = gset[i].g; |
821 | 679 | break; |
822 | 3.34k | case WC_CCS_A_CS94W: |
823 | 3.34k | switch (gset[i].ccs) { |
824 | 86 | case WC_CCS_JIS_X_0212: |
825 | 86 | if (!WcOption.use_jisx0212) |
826 | 86 | 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.34k | } |
834 | 3.25k | cs94w_gmap[f] = gset[i].g; |
835 | 3.25k | break; |
836 | 172 | case WC_CCS_A_CS96: |
837 | 172 | cs96_gmap[f] = gset[i].g; |
838 | 172 | 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.19k | } |
846 | 4.19k | } |
847 | 679 | } |
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 | } |