Coverage Report

Created: 2026-04-12 06:47

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