Coverage Report

Created: 2025-12-05 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/w3m/libwc/iso2022.c
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
}