Coverage Report

Created: 2026-01-09 06:14

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.11M
#define C0  WC_ISO_MAP_C0
13
7.72M
#define C1  WC_ISO_MAP_C1
14
5.47M
#define GL  WC_ISO_MAP_GL
15
40.5M
#define GR  WC_ISO_MAP_GR
16
57.4k
#define GL2 WC_ISO_MAP_GL96
17
1.45M
#define GR2 WC_ISO_MAP_GR96
18
7.01k
#define SO  WC_ISO_MAP_SO
19
6.12k
#define SI  WC_ISO_MAP_SI
20
75.8k
#define ESC WC_ISO_MAP_ESC
21
13.8k
#define SS2 WC_ISO_MAP_SS2
22
8.61k
#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.0M
{
53
43.0M
    switch (ccs) {
54
9.77k
    case WC_CCS_JIS_C_6226:
55
504k
    case WC_CCS_JIS_X_0208:
56
609k
    case WC_CCS_JIS_X_0213_1:
57
609k
  ccs = wc_jisx0208_or_jisx02131(code);
58
609k
  break;
59
9.14k
    case WC_CCS_JIS_X_0212:
60
11.5k
    case WC_CCS_JIS_X_0213_2:
61
11.5k
  ccs = wc_jisx0212_or_jisx02132(code);
62
11.5k
  break;
63
564
    case WC_CCS_JIS_X_0201:
64
960
    case WC_CCS_GB_1988:
65
960
  ccs = WC_CCS_US_ASCII;
66
960
  break;
67
43.0M
    }
68
43.0M
    wtf_push(os, ccs, code);
69
43.0M
}
70
71
Str
72
wc_conv_from_iso2022(Str is, wc_ces ces)
73
2.99k
{
74
2.99k
    Str os;
75
2.99k
    wc_uchar *sp = (wc_uchar *)is->ptr;
76
2.99k
    wc_uchar *ep = sp + is->length;
77
2.99k
    wc_uchar *p, *q = NULL;
78
2.99k
    int state = WC_ISO_NOSTATE;
79
2.99k
    wc_status st;
80
2.99k
    wc_ccs gl_ccs, gr_ccs;
81
82
76.8k
    for (p = sp; p < ep && !(WC_ISO_MAP[*p] & WC_ISO_MAP_DETECT); p++)
83
73.8k
  ;
84
2.99k
    if (p == ep)
85
283
  return is;
86
2.71k
    os = Strnew_size(is->length);
87
2.71k
    if (p > sp)
88
332
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
89
90
2.71k
    wc_input_init(ces, &st);
91
2.71k
    gl_ccs = st.design[st.gl];
92
2.71k
    gr_ccs = st.design[st.gr];
93
94
56.0M
    for (; p < ep; p++) {
95
55.9M
  switch (state) {
96
53.7M
  case WC_ISO_NOSTATE:
97
53.7M
      switch (WC_ISO_MAP[*p]) {
98
31.9k
      case GL2:
99
31.9k
    gl_ccs = st.ss ? st.design[st.ss]
100
31.9k
      : st.design[st.gl];
101
31.9k
    if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) {
102
27.7k
        Strcat_char(os, (char)*p);
103
27.7k
        break;
104
27.7k
    }
105
4.25M
      case GL:
106
4.25M
    gl_ccs = st.ss ? st.design[st.ss]
107
4.25M
      : st.design[st.gl];
108
4.25M
    if (WC_CCS_IS_WIDE(gl_ccs)) {
109
1.60M
        q = p;
110
1.60M
        state = WC_ISO_MBYTE1;
111
1.60M
        continue;
112
2.65M
    } else if (gl_ccs == WC_CES_US_ASCII)
113
0
        Strcat_char(os, (char)*p);
114
2.65M
    else
115
2.65M
        wtf_push_iso2022(os, gl_ccs, (wc_uint32)*p);
116
2.65M
    break;
117
2.65M
      case GR2:
118
1.45M
    gr_ccs = st.ss ? st.design[st.ss]
119
1.45M
      : st.design[st.gr];
120
1.45M
    if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) {
121
437k
        wtf_push_unknown(os, p, 1);
122
437k
        break;
123
437k
    }
124
40.1M
      case GR:
125
40.1M
    gr_ccs = st.ss ? st.design[st.ss]
126
40.1M
      : st.design[st.gr];
127
40.1M
    if (WC_CCS_IS_WIDE(gr_ccs)) {
128
379k
        q = p;
129
379k
        state = WC_EUC_MBYTE1;
130
379k
        continue;
131
39.7M
    } else if (gr_ccs)
132
38.8M
        wtf_push_iso2022(os, gr_ccs, (wc_uint32)*p);
133
836k
    else
134
836k
        wtf_push_unknown(os, p, 1);
135
39.7M
    break;
136
39.7M
      case C0:
137
1.11M
    Strcat_char(os, (char)*p);
138
1.11M
    break;
139
7.72M
      case C1:
140
7.72M
    wtf_push(os, WC_CCS_C1, (wc_uint32)*p);
141
7.72M
    break;
142
75.8k
      case ESC:
143
75.8k
    st.ss = 0;
144
75.8k
    if (wc_parse_iso2022_esc(&p, &st))
145
17.1k
        state = st.state;
146
58.7k
    else
147
58.7k
        Strcat_char(os, (char)*p);
148
75.8k
    continue;
149
6.12k
      case SI:
150
6.12k
    st.gl = 0;
151
6.12k
    break;
152
7.01k
      case SO:
153
7.01k
    st.gl = 1;
154
7.01k
    break;
155
13.8k
      case SS2:
156
13.8k
    if (! st.design[2]) {
157
3.92k
        wtf_push_unknown(os, p, 1);
158
3.92k
        break;
159
3.92k
    }
160
9.89k
    st.ss = 2;
161
9.89k
    continue;
162
8.61k
      case SS3:
163
8.61k
    if (! st.design[3]) {
164
1.74k
        wtf_push_unknown(os, p, 1);
165
1.74k
        break;
166
1.74k
    }
167
6.87k
    st.ss = 3;
168
6.87k
    continue;
169
53.7M
      }
170
51.6M
      break;
171
51.6M
  case WC_ISO_MBYTE1:
172
1.60M
      switch (WC_ISO_MAP[*p]) {
173
25.4k
      case GL2:
174
25.4k
    if (!(WC_CCS_TYPE(gl_ccs) & WC_CCS_A_CS96)) {
175
25.0k
        Strcat_char(os, (char)*q);
176
25.0k
        Strcat_char(os, (char)*p);
177
25.0k
        break;
178
25.0k
    }
179
1.21M
      case GL:
180
1.21M
    wtf_push_iso2022(os, gl_ccs, ((wc_uint32)*q << 8) | *p);
181
1.21M
    break;
182
364k
      default:
183
364k
    wtf_push_unknown(os, q, 2);
184
364k
    break;
185
1.60M
      }
186
1.60M
      break;
187
1.60M
  case WC_EUC_MBYTE1:
188
379k
      switch (WC_ISO_MAP[*p]) {
189
4.65k
      case GR2:
190
4.65k
    if (!(WC_CCS_TYPE(gr_ccs) & WC_CCS_A_CS96)) {
191
4.45k
        wtf_push_unknown(os, q, 2);
192
4.45k
        break;
193
4.45k
    }
194
328k
      case GR:
195
328k
    if (gr_ccs == WC_CCS_CNS_11643_X) {
196
95.7k
        state = WC_EUC_TW_MBYTE2;
197
95.7k
        continue;
198
95.7k
    }
199
233k
    wtf_push_iso2022(os, gr_ccs, ((wc_uint32)*q << 8) | *p);
200
233k
    break;
201
46.6k
      default:
202
46.6k
    wtf_push_unknown(os, q, 2);
203
46.6k
    break;
204
379k
      }
205
284k
      break;
206
284k
  case WC_EUC_TW_MBYTE2:
207
95.7k
      if (WC_ISO_MAP[*p] == GR) {
208
92.2k
    if (0xa1 <= *q && *q <= 0xa7) {
209
56.9k
        wtf_push_iso2022(os, WC_CCS_CNS_11643_1 + (*q - 0xa1),
210
56.9k
      ((wc_uint32)*(q+1) << 8) | *p);
211
56.9k
        break;
212
56.9k
    }
213
35.2k
    if (0xa8 <= *q && *q <= 0xb0) {
214
22.1k
        wtf_push_iso2022(os, WC_CCS_CNS_11643_8 + (*q - 0xa8),
215
22.1k
      ((wc_uint32)*(q+1) << 8) | *p);
216
22.1k
        break;
217
22.1k
    }
218
35.2k
      }
219
16.5k
      wtf_push_unknown(os, q, 3);
220
16.5k
      break;
221
149k
  case WC_ISO_CSWSR:
222
149k
      if (*p == WC_C_ESC && *(p+1) == WC_C_CSWSR) {
223
853
    if (*(p+2) == WC_F_ISO_BASE) {
224
253
        state = st.state = WC_ISO_NOSTATE;
225
253
        p += 2;
226
253
        continue;
227
600
    } else if (*(p+2) > WC_F_ISO_BASE && *(p+2) <= 0x7e) {
228
199
        p += 2;
229
199
        continue;
230
199
    }
231
853
      }
232
148k
      wtf_push_unknown(os, p, 1);
233
148k
      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.9M
  }
239
53.6M
  st.ss = 0;
240
53.6M
  state = WC_ISO_NOSTATE;
241
53.6M
    }
242
2.71k
    switch (state) {
243
58
    case WC_ISO_MBYTE1:
244
91
    case WC_EUC_MBYTE1:
245
91
  wtf_push_unknown(os, p-1, 1);
246
91
  break;
247
0
    case WC_EUC_TW_MBYTE1:
248
0
  wtf_push_unknown(os, p-2, 2);
249
0
  break;
250
2.71k
    }
251
2.71k
    return os;
252
2.71k
}
253
254
int
255
wc_parse_iso2022_esc(wc_uchar **ptr, wc_status *st)
256
81.4k
{
257
81.4k
    wc_uchar *p = *ptr, state, f = 0, g = 0, cs = 0;
258
259
81.4k
    if (*p != WC_C_ESC)
260
0
  return 0;
261
81.4k
    state = *p;
262
161k
    for (p++; *p && state; p++) {
263
125k
  switch (state) {
264
77.9k
  case WC_C_ESC:   /* ESC */
265
77.9k
      switch (*p) {
266
19.1k
      case WC_C_MBCS: /* ESC '$' */
267
19.1k
    state = *p;
268
19.1k
    continue;
269
1.03k
      case WC_C_G0_CS94: /* ESC '(' */
270
6.23k
      case WC_C_G1_CS94: /* ESC ')' */
271
6.73k
      case WC_C_G2_CS94: /* ESC '*' */
272
10.1k
      case WC_C_G3_CS94: /* ESC '+' */
273
10.1k
    state = cs = WC_C_G0_CS94;
274
10.1k
    g = *p & 0x03;
275
10.1k
    continue;
276
909
      case WC_C_G0_CS96: /* ESC ',' */ /* ISO 2022 does not permit */
277
1.15k
      case WC_C_G1_CS96: /* ESC '-' */
278
3.46k
      case WC_C_G2_CS96: /* ESC '.' */
279
4.14k
      case WC_C_G3_CS96: /* ESC '/' */
280
4.14k
    state = cs = WC_C_G0_CS96;
281
4.14k
    g = *p & 0x03;
282
4.14k
    continue;
283
1.27k
      case WC_C_C0: /* ESC '!' */ /* not supported */
284
1.62k
      case WC_C_C1: /* ESC '"' */ /* not supported */
285
2.42k
      case WC_C_REP: /* ESC '&' */ /* not supported */
286
2.42k
    state = cs = WC_C_C0;
287
2.42k
    continue;
288
1.80k
      case WC_C_CSWSR: /* ESC '%' */ /* not supported */
289
1.80k
    state = cs = WC_C_CSWSR;
290
1.80k
    continue;
291
240
      case WC_C_SS2: /* ESC 'N' */
292
240
    st->ss = 2; *ptr = p; return 1;
293
275
      case WC_C_SS3: /* ESC 'O' */
294
275
    st->ss = 3; *ptr = p; return 1;
295
501
      case WC_C_LS2: /* ESC 'n' */
296
501
    st->gl = 2; *ptr = p; return 1;
297
214
      case WC_C_LS3: /* ESC 'o' */
298
214
    st->gl = 3; *ptr = p; return 1;
299
410
      case WC_C_LS1R: /* ESC '~' */
300
410
    st->gr = 1; *ptr = p; return 1;
301
1.61k
      case WC_C_LS2R: /* ESC '}' */
302
1.61k
    st->gr = 2; *ptr = p; return 1;
303
287
      case WC_C_LS3R: /* ESC '|' */
304
287
    st->gr = 3; *ptr = p; return 1;
305
36.7k
      default:
306
36.7k
    return 0;
307
77.9k
      }
308
0
      break;
309
19.0k
  case WC_C_MBCS:   /* ESC '$' */
310
19.0k
      switch (*p) {
311
1.99k
      case WC_F_JIS_C_6226: /* ESC '$' @ */
312
3.71k
      case WC_F_JIS_X_0208: /* ESC '$' B */
313
4.49k
      case WC_F_GB_2312: /* ESC '$' A */
314
4.49k
    state = 0;
315
4.49k
    cs = WC_C_G0_CS94 | 0x80;
316
4.49k
    g = 0;
317
4.49k
    f = *p;
318
4.49k
    break;
319
2.06k
      case WC_C_G0_CS94: /* ESC '$' '(' */
320
2.80k
      case WC_C_G1_CS94: /* ESC '$' ')' */
321
3.21k
      case WC_C_G2_CS94: /* ESC '$' '*' */
322
7.05k
      case WC_C_G3_CS94: /* ESC '$' '+' */
323
7.05k
    state = cs = WC_C_G0_CS94 | 0x80;
324
7.05k
    g = *p & 0x03;
325
7.05k
    continue;
326
418
      case WC_C_G0_CS96: /* ESC '$' ',' */ /* ISO 2022 does not permit */
327
687
      case WC_C_G1_CS96: /* ESC '$' '-' */
328
1.78k
      case WC_C_G2_CS96: /* ESC '$' '.' */
329
2.59k
      case WC_C_G3_CS96: /* ESC '$' '/' */
330
2.59k
    state = cs = WC_C_G0_CS96 | 0x80;
331
2.59k
    g = *p & 0x03;
332
2.59k
    continue;
333
4.92k
      default:
334
4.92k
    return 0;
335
19.0k
      }
336
4.49k
      break;
337
10.1k
  case WC_C_G0_CS94: /* ESC [()*+] F */
338
10.1k
      if (*p == WC_C_CS942) { /* ESC [()*+] '!' */
339
509
    state = cs = WC_C_CS942 | 0x80;
340
509
    g = *p & 0x03;
341
509
    continue;
342
509
      }
343
13.6k
  case WC_C_G0_CS96: /* ESC [,-./] F */
344
20.6k
  case WC_C_G0_CS94 | 0x80:  /* ESC '$' [()*+] F */
345
23.2k
  case WC_C_G0_CS96 | 0x80:  /* ESC '$' [,-./] F */
346
23.7k
  case WC_C_CS942 | 0x80:  /* ESC [()*+] '!' F */
347
26.1k
  case WC_C_C0:   /* ESC [!"&] F */
348
26.4k
  case WC_C_CSWSR | 0x80:  /* ESC '%' '/' F */
349
26.4k
      state = 0;
350
26.4k
      f = *p;
351
26.4k
      break;
352
1.76k
  case WC_C_CSWSR: /* ESC '%' F */
353
1.76k
      if (*p == WC_C_CSWOSR) { /* ESC '%' '/' */
354
265
    state = cs = WC_C_CSWSR | 0x80;
355
265
    continue;
356
265
      }
357
1.50k
      state = 0;
358
1.50k
      f = *p;
359
1.50k
      break;
360
0
  default:
361
0
      return 0;
362
125k
  }
363
125k
    }
364
36.2k
    if (f < WC_F_ISO_BASE || f > 0x7e)
365
19.2k
  return 0;
366
17.0k
    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
10.4k
    case WC_C_G0_CS94 | 0x80:
371
10.4k
  st->design[g] = WC_CCS_SET_CS94W(f);
372
10.4k
  break;
373
1.50k
    case WC_C_G0_CS96:
374
1.50k
  st->design[g] = WC_CCS_SET_CS96(f);
375
1.50k
  break;
376
1.07k
    case WC_C_G0_CS96 | 0x80:
377
1.07k
  st->design[g] = WC_CCS_SET_CS96W(f);
378
1.07k
  break;
379
300
    case WC_C_CS942 | 0x80:
380
300
  st->design[g] = WC_CCS_SET_CS942(f);
381
300
  break;
382
727
    case WC_C_CSWSR:
383
727
  if (f == WC_F_ISO_BASE)
384
342
      st->state = WC_ISO_NOSTATE;
385
385
  else
386
385
      st->state = WC_ISO_CSWSR;
387
727
  break;
388
0
    case WC_C_CSWOSR:
389
0
  st->state = WC_ISO_CSWOSR;
390
0
  break;
391
17.0k
    }
392
17.0k
    *ptr = p - 1;
393
17.0k
    return 1;
394
17.0k
}
395
396
void
397
wc_push_to_iso2022(Str os, wc_wchar_t cc, wc_status *st)
398
15.4M
{
399
15.4M
    wc_uchar g = 0;
400
15.4M
    wc_bool is_wide = WC_FALSE, retry = WC_FALSE;
401
15.4M
    wc_wchar_t cc2;
402
403
29.9M
  while (1) {
404
29.9M
    switch (WC_CCS_TYPE(cc.ccs)) {
405
485k
    case WC_CCS_A_CS94:
406
485k
  if (cc.ccs == WC_CCS_US_ASCII)
407
449k
      cc.ccs = st->g0_ccs;
408
485k
  if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
409
484k
      g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
410
485k
  break;
411
16.8M
    case WC_CCS_A_CS94W:
412
16.8M
  is_wide = 1;
413
16.8M
  switch (cc.ccs) {
414
0
#ifdef USE_UNICODE
415
602
  case WC_CCS_JIS_X_0212:
416
602
      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
602
      break;
426
667
  case WC_CCS_JIS_X_0213_1:
427
1.06k
  case WC_CCS_JIS_X_0213_2:
428
1.06k
      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
1.06k
      break;
437
16.8M
#endif
438
16.8M
  }
439
16.8M
  if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
440
16.8M
      g = cs94w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
441
16.8M
  break;
442
5.10M
    case WC_CCS_A_CS96:
443
5.10M
  if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
444
5.10M
      g = cs96_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
445
5.10M
  break;
446
389
    case WC_CCS_A_CS96W:
447
389
  is_wide = 1;
448
389
  if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
449
194
      g = cs96w_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
450
389
  break;
451
10.7k
    case WC_CCS_A_CS942:
452
10.7k
  if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
453
10.5k
      g = cs942_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
454
10.7k
  break;
455
324k
    case WC_CCS_A_UNKNOWN_W:
456
324k
  if (WcOption.no_replace)
457
0
      return;
458
324k
  is_wide = 1;
459
324k
  cc.ccs = WC_CCS_US_ASCII;
460
324k
  if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
461
324k
      g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
462
324k
  cc.code = ((wc_uint32)WC_REPLACE_W[0] << 8) | WC_REPLACE_W[1];
463
324k
  break;
464
1.08M
    case WC_CCS_A_UNKNOWN:
465
1.08M
  if (WcOption.no_replace)
466
0
      return;
467
1.08M
  cc.ccs = WC_CCS_US_ASCII;
468
1.08M
  if (WC_CCS_INDEX(cc.ccs) >= WC_F_ISO_BASE)
469
1.08M
      g = cs94_gmap[WC_CCS_INDEX(cc.ccs) - WC_F_ISO_BASE];
470
1.08M
  cc.code = (wc_uint32)WC_REPLACE[0];
471
1.08M
  break;
472
6.07M
    default:
473
6.07M
  if ((cc.ccs == WC_CCS_JOHAB || cc.ccs == WC_CCS_JOHAB_1 ||
474
6.07M
    cc.ccs == WC_CCS_JOHAB_2 || cc.ccs == WC_CCS_JOHAB_3) &&
475
1.86k
    cs94w_gmap[WC_F_KS_X_1001 - WC_F_ISO_BASE]) {
476
1.67k
      wc_wchar_t cc2 = wc_johab_to_ksx1001(cc);
477
1.67k
      if (cc2.ccs == WC_CCS_KS_X_1001) {
478
574
    cc = cc2;
479
574
    continue;
480
574
      }
481
1.67k
  }
482
6.07M
#ifdef USE_UNICODE
483
6.07M
  if (WcOption.ucs_conv)
484
6.07M
      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
6.07M
  continue;
489
29.9M
    }
490
23.8M
    if (! g) {
491
8.46M
#ifdef USE_UNICODE
492
8.46M
  if (WcOption.ucs_conv && ! retry)
493
8.46M
      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
8.46M
  retry = WC_TRUE;
498
8.46M
  continue;
499
8.46M
    }
500
501
15.4M
    wc_push_iso2022_esc(os, cc.ccs, g, 1, st);
502
15.4M
    if (is_wide)
503
8.78M
  Strcat_char(os, (char)((cc.code >> 8) & 0x7f));
504
15.4M
    Strcat_char(os, (char)(cc.code & 0x7f));
505
15.4M
    return;
506
23.8M
  }
507
15.4M
}
508
509
void
510
wc_push_to_iso2022_end(Str os, wc_status *st)
511
848
{
512
848
    if (st->design[1] != 0 && st->design[1] != st->g1_ccs)
513
173
  wc_push_iso2022_esc(os, st->g1_ccs, WC_C_G1_CS94, 0, st);
514
848
    wc_push_iso2022_esc(os, st->g0_ccs, WC_C_G0_CS94, 1, st);
515
848
}
516
517
void
518
wc_push_iso2022_esc(Str os, wc_ccs ccs, wc_uchar g, wc_uint8 invoke, wc_status *st)
519
15.4M
{
520
15.4M
    wc_uint8 g_invoke = g & 0x03;
521
522
15.4M
    if (st->design[g_invoke] != ccs) {
523
13.1M
  Strcat_char(os, WC_C_ESC);
524
13.1M
  if (WC_CCS_IS_WIDE(ccs)) {
525
8.17M
      Strcat_char(os, WC_C_MBCS);
526
8.17M
      if (g_invoke != 0 ||
527
602
    (ccs != WC_CCS_JIS_C_6226 &&
528
602
     ccs != WC_CCS_JIS_X_0208 &&
529
392
     ccs != WC_CCS_GB_2312))
530
8.16M
    Strcat_char(os, (char)g);
531
8.17M
  } else {
532
4.96M
      Strcat_char(os, (char)g);
533
4.96M
      if ((ccs & WC_CCS_A_ISO_2022) == WC_CCS_A_CS942)
534
0
    Strcat_char(os, WC_C_CS942);
535
4.96M
  }
536
13.1M
  Strcat_char(os, (char)WC_CCS_GET_F(ccs));
537
13.1M
  st->design[g_invoke] = ccs;
538
13.1M
    }
539
15.4M
    if (! invoke)
540
173
  return;
541
542
15.4M
    switch (g_invoke) {
543
1.85M
    case 0:
544
1.85M
  if (st->gl != 0) {
545
136k
      Strcat_char(os, WC_C_SI);
546
136k
      st->gl = 0;
547
136k
  }
548
1.85M
  break;
549
8.41M
    case 1:
550
8.41M
  if (st->gl != 1) {
551
136k
      Strcat_char(os, WC_C_SO);
552
136k
      st->gl = 1;
553
136k
  }
554
8.41M
  break;
555
5.10M
    case 2:
556
5.10M
  Strcat_char(os, WC_C_ESC);
557
5.10M
  Strcat_char(os, WC_C_SS2);
558
5.10M
  break;
559
36.2k
    case 3:
560
36.2k
  Strcat_char(os, WC_C_ESC);
561
36.2k
  Strcat_char(os, WC_C_SS3);
562
36.2k
  break;
563
15.4M
    }
564
15.4M
}
565
566
void
567
wc_push_to_euc(Str os, wc_wchar_t cc, wc_status *st)
568
7.27M
{
569
7.27M
    wc_ccs g1_ccs = st->ces_info->gset[1].ccs;
570
571
14.1M
  while (1) {
572
14.1M
    if (cc.ccs == g1_ccs) {
573
3.23M
  Strcat_char(os, (char)((cc.code >> 8) | 0x80));
574
3.23M
  Strcat_char(os, (char)((cc.code & 0xff) | 0x80));
575
3.23M
  return;
576
3.23M
    }
577
10.9M
    switch (cc.ccs) {
578
2.91M
    case WC_CCS_US_ASCII:
579
2.91M
  Strcat_char(os, (char)cc.code);
580
2.91M
  return;
581
16.4k
    case WC_CCS_C1:
582
16.4k
  Strcat_char(os, (char)(cc.code | 0x80));
583
16.4k
  return;
584
821k
    case WC_CCS_UNKNOWN_W:
585
821k
  if (!WcOption.no_replace)
586
821k
      Strcat_charp(os, WC_REPLACE_W);
587
821k
  return;
588
281k
    case WC_CCS_UNKNOWN:
589
281k
  if (!WcOption.no_replace)
590
281k
      Strcat_charp(os, WC_REPLACE);
591
281k
  return;
592
236k
    case WC_CCS_JOHAB:
593
236k
    case WC_CCS_JOHAB_1:
594
236k
    case WC_CCS_JOHAB_2:
595
236k
    case WC_CCS_JOHAB_3:
596
236k
  if (st->ces_info->id == WC_CES_EUC_KR) {
597
236k
      cc = wc_johab_to_ksx1001(cc);
598
236k
      continue;
599
236k
  }
600
6.65M
    default:
601
6.65M
#ifdef USE_UNICODE
602
6.65M
  if (WcOption.ucs_conv)
603
6.65M
      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
6.65M
  continue;
608
10.9M
    }
609
10.9M
  }
610
7.27M
}
611
612
void
613
wc_push_to_eucjp(Str os, wc_wchar_t cc, wc_status *st)
614
4.56M
{
615
4.65M
  while (1) {
616
4.65M
    switch (cc.ccs) {
617
12.0k
    case WC_CCS_US_ASCII:
618
12.0k
  Strcat_char(os, (char)cc.code);
619
12.0k
  return;
620
2.59k
    case WC_CCS_JIS_X_0201K:
621
2.59k
  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
2.59k
  } else if (WcOption.fix_width_conv)
626
2.59k
      cc.ccs = WC_CCS_UNKNOWN;
627
0
  else
628
0
      cc = wc_jisx0201k_to_jisx0208(cc);
629
2.59k
  continue;
630
4.46M
    case WC_CCS_JIS_X_0208:
631
4.46M
  break;
632
309
    case WC_CCS_JIS_X_0213_1:
633
309
  if (WcOption.use_jisx0213)
634
0
      break;
635
309
#ifdef USE_UNICODE
636
309
  else if (WcOption.ucs_conv && WcOption.use_jisx0212)
637
0
      cc = wc_jisx0213_to_jisx0212(cc);
638
309
#endif
639
309
  else
640
309
      cc.ccs = WC_CCS_UNKNOWN_W;
641
309
  continue;
642
322
    case WC_CCS_JIS_X_0212:
643
322
  if (WcOption.use_jisx0212) {
644
0
      Strcat_char(os, WC_C_SS3R);
645
0
      break;
646
0
  }
647
322
#ifdef USE_UNICODE
648
322
  else if (WcOption.ucs_conv && WcOption.use_jisx0213)
649
0
      cc = wc_jisx0212_to_jisx0213(cc);
650
322
#endif
651
322
  else
652
322
      cc.ccs = WC_CCS_UNKNOWN_W;
653
322
  continue;
654
489
    case WC_CCS_JIS_X_0213_2:
655
489
  if (WcOption.use_jisx0213) {
656
0
      Strcat_char(os, WC_C_SS3R);
657
0
      break;
658
0
  }
659
489
#ifdef USE_UNICODE
660
489
  else if (WcOption.ucs_conv && WcOption.use_jisx0212)
661
0
      cc = wc_jisx0213_to_jisx0212(cc);
662
489
#endif
663
489
  else
664
489
      cc.ccs = WC_CCS_UNKNOWN_W;
665
489
  continue;
666
11.7k
    case WC_CCS_C1:
667
11.7k
  Strcat_char(os, (char)(cc.code | 0x80));
668
11.7k
  return;
669
2.63k
    case WC_CCS_UNKNOWN_W:
670
2.63k
  if (!WcOption.no_replace)
671
2.63k
      Strcat_charp(os, WC_REPLACE_W);
672
2.63k
  return;
673
76.3k
    case WC_CCS_UNKNOWN:
674
76.3k
  if (!WcOption.no_replace)
675
76.3k
      Strcat_charp(os, WC_REPLACE);
676
76.3k
  return;
677
81.3k
    default:
678
81.3k
#ifdef USE_UNICODE
679
81.3k
  if (WcOption.ucs_conv)
680
81.3k
      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
81.3k
  continue;
685
4.65M
    }
686
4.46M
    Strcat_char(os, (char)((cc.code >> 8) | 0x80));
687
4.46M
    Strcat_char(os, (char)((cc.code & 0xff) | 0x80));
688
4.46M
    return;
689
4.65M
  }
690
4.56M
}
691
692
void
693
wc_push_to_euctw(Str os, wc_wchar_t cc, wc_status *st)
694
10.8M
{
695
18.8M
  while (1) {
696
18.8M
    switch (cc.ccs) {
697
1.80M
    case WC_CCS_US_ASCII:
698
1.80M
  Strcat_char(os, (char)cc.code);
699
1.80M
  return;
700
3.13M
    case WC_CCS_CNS_11643_1:
701
3.13M
  break;
702
373k
    case WC_CCS_CNS_11643_2:
703
896k
    case WC_CCS_CNS_11643_3:
704
913k
    case WC_CCS_CNS_11643_4:
705
959k
    case WC_CCS_CNS_11643_5:
706
961k
    case WC_CCS_CNS_11643_6:
707
962k
    case WC_CCS_CNS_11643_7:
708
962k
  Strcat_char(os, WC_C_SS2R);
709
962k
  Strcat_char(os, (char)(0xA1 + (cc.ccs - WC_CCS_CNS_11643_1)));
710
962k
  break;
711
292
    case WC_CCS_CNS_11643_8:
712
743
    case WC_CCS_CNS_11643_9:
713
961
    case WC_CCS_CNS_11643_10:
714
7.86k
    case WC_CCS_CNS_11643_11:
715
8.60k
    case WC_CCS_CNS_11643_12:
716
20.8k
    case WC_CCS_CNS_11643_13:
717
21.6k
    case WC_CCS_CNS_11643_14:
718
22.0k
    case WC_CCS_CNS_11643_15:
719
30.1k
    case WC_CCS_CNS_11643_16:
720
30.1k
  Strcat_char(os, WC_C_SS2R);
721
30.1k
  Strcat_char(os, (char)(0xA8 + (cc.ccs - WC_CCS_CNS_11643_8)));
722
30.1k
  break;
723
1.62M
    case WC_CCS_C1:
724
1.62M
  Strcat_char(os, (char)(cc.code | 0x80));
725
1.62M
  return;
726
2.44M
    case WC_CCS_UNKNOWN_W:
727
2.44M
  if (!WcOption.no_replace)
728
2.44M
      Strcat_charp(os, WC_REPLACE_W);
729
2.44M
  return;
730
871k
    case WC_CCS_UNKNOWN:
731
871k
  if (!WcOption.no_replace)
732
871k
      Strcat_charp(os, WC_REPLACE);
733
871k
  return;
734
7.98M
    default:
735
7.98M
#ifdef USE_UNICODE
736
7.98M
  if (WcOption.ucs_conv)
737
7.98M
      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.98M
  continue;
742
18.8M
    }
743
4.12M
    Strcat_char(os, (char)((cc.code >> 8) | 0x80));
744
4.12M
    Strcat_char(os, (char)((cc.code & 0xff) | 0x80));
745
4.12M
    return;
746
18.8M
  }
747
10.8M
}
748
749
void
750
wc_push_to_iso8859(Str os, wc_wchar_t cc, wc_status *st)
751
12.9M
{
752
12.9M
    wc_ccs g1_ccs = st->ces_info->gset[1].ccs;
753
754
19.4M
  while (1) {
755
19.4M
    if (cc.ccs == g1_ccs) {
756
72.4k
  Strcat_char(os, (char)(cc.code | 0x80));
757
72.4k
  return;
758
72.4k
    }
759
19.4M
    switch (cc.ccs) {
760
2.76M
    case WC_CCS_US_ASCII:
761
2.76M
  Strcat_char(os, (char)cc.code);
762
2.76M
  return;
763
967k
    case WC_CCS_C1:
764
967k
  Strcat_char(os, (char)(cc.code | 0x80));
765
967k
  return;
766
1.86M
    case WC_CCS_UNKNOWN_W:
767
1.86M
  if (!WcOption.no_replace)
768
1.86M
      Strcat_charp(os, WC_REPLACE_W);
769
1.86M
  return;
770
7.32M
    case WC_CCS_UNKNOWN:
771
7.32M
  if (!WcOption.no_replace)
772
7.32M
      Strcat_charp(os, WC_REPLACE);
773
7.32M
  return;
774
6.48M
    default:
775
6.48M
#ifdef USE_UNICODE
776
6.48M
  if (WcOption.ucs_conv)
777
6.48M
      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
6.48M
  continue;
782
19.4M
    }
783
19.4M
  }
784
12.9M
}
785
786
void
787
wc_create_gmap(wc_status *st)
788
770
{
789
770
    wc_gset *gset = st->ces_info->gset;
790
770
    wc_uchar *gset_ext = st->ces_info->gset_ext;
791
770
    int i, f;
792
793
770
    if (WcOption.strict_iso2022) {
794
50.0k
  for (i = 0; i < WC_F_ISO_BASE; i++) {
795
49.2k
      cs94_gmap[i] = 0;
796
49.2k
      cs96_gmap[i] = 0;
797
49.2k
      cs94w_gmap[i] = 0;
798
49.2k
      cs96w_gmap[i] = 0;
799
49.2k
      cs942_gmap[i] = 0;
800
49.2k
  }
801
770
    } 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.65k
    for (i = 0; gset[i].ccs; i++) {
811
4.88k
  f = WC_CCS_GET_F(gset[i].ccs) - WC_F_ISO_BASE;
812
4.88k
  switch (WC_CCS_TYPE(gset[i].ccs)) {
813
770
  case WC_CCS_A_CS94:
814
770
      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
770
      }
820
770
      cs94_gmap[f] = gset[i].g;
821
770
      break;
822
3.91k
  case WC_CCS_A_CS94W:
823
3.91k
      switch (gset[i].ccs) {
824
96
      case WC_CCS_JIS_X_0212:
825
96
    if (!WcOption.use_jisx0212)
826
96
        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.91k
      }
834
3.81k
      cs94w_gmap[f] = gset[i].g;
835
3.81k
      break;
836
192
  case WC_CCS_A_CS96:
837
192
      cs96_gmap[f] = gset[i].g;
838
192
      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.88k
  }
846
4.88k
    }
847
770
}
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
}