Coverage Report

Created: 2025-06-24 06:38

/src/w3m/libwc/iso2022.c
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
}