Coverage Report

Created: 2025-12-05 06:38

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/w3m/libwc/sjis.c
Line
Count
Source
1
2
#include "wc.h"
3
#include "sjis.h"
4
#include "jis.h"
5
#include "wtf.h"
6
#include "ucs.h"
7
8
#include "map/jisx02132_sjis.map"
9
wc_uchar *wc_jisx0212_jisx02132_map = jisx02132_sjis_map;
10
11
#define C0  WC_SJIS_MAP_C0
12
#define GL  WC_SJIS_MAP_GL
13
248k
#define LB  WC_SJIS_MAP_LB
14
22.9k
#define S80 WC_SJIS_MAP_80
15
38.2M
#define SK  WC_SJIS_MAP_SK
16
165k
#define SL  WC_SJIS_MAP_SL
17
51.4k
#define SH  WC_SJIS_MAP_SH
18
32.1k
#define SX  WC_SJIS_MAP_SX
19
127k
#define C1  WC_SJIS_MAP_C1
20
28.5k
#define SA0 WC_SJIS_MAP_A0
21
22
wc_uint8 WC_SJIS_MAP[ 0x100 ] = {
23
    C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0,
24
    C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0,
25
    GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
26
    GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
27
    LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, 
28
    LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, 
29
    LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, 
30
    LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, C0,
31
32
    S80,SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL,
33
    SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL, SL,
34
    SA0,SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK,
35
    SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK,
36
    SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK,
37
    SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK, SK,
38
    SH, SH, SH, SH, SH, SH, SH, SH, SH, SH, SH, SH, SH, SH, SH, SH,
39
    SX, SX, SX, SX, SX, SX, SX, SX, SX, SX, SX, SX, SX, C1, C1, C1,
40
};
41
42
217k
#define sjis_to_jisx0208(ub, lb) \
43
217k
{ \
44
217k
    ub -= (ub < 0xa0) ? 0x81 : 0xc1; \
45
217k
    ub = (ub << 1) + 0x21; \
46
217k
    if (lb < 0x9f) { \
47
99.6k
  lb -= (lb > 0x7e) ? 0x20 : 0x1f; \
48
117k
    } else { \
49
117k
  ub++; \
50
117k
  lb -= 0x7e; \
51
117k
    } \
52
217k
}
53
10.8k
#define sjis_to_jisx02132(ub, lb) \
54
10.8k
{ \
55
10.8k
    if (lb < 0x9f) { \
56
2.90k
  ub = sjis1_jisx02132_map[ub - 0xf0]; \
57
2.90k
  lb -= (lb > 0x7e) ? 0x20 : 0x1f; \
58
7.98k
    } else { \
59
7.98k
  ub = sjis2_jisx02132_map[ub - 0xf0]; \
60
7.98k
  lb -= 0x7e; \
61
7.98k
    } \
62
10.8k
}
63
2.86M
#define jisx0208_to_sjis(ub, lb) \
64
2.86M
{ \
65
2.86M
    lb += (ub & 1) ? 0x1f : 0x7d; \
66
2.86M
    if (lb > 0x7e) \
67
2.86M
  lb++; \
68
2.86M
    ub = (ub - 0x21) >> 1; \
69
2.86M
    ub += (ub < 0x1f) ? 0x81 : 0xc1; \
70
2.86M
}
71
0
#define jisx02132_to_sjis(ub, lb) \
72
0
{ \
73
0
    lb += (ub & 1) ? 0x1f : 0x7d; \
74
0
    if (lb > 0x7e) \
75
0
  lb++; \
76
0
    ub = jisx02132_sjis_map[ ub ]; \
77
0
}
78
79
wc_wchar_t
80
wc_sjis_to_jis(wc_wchar_t cc)
81
0
{
82
0
    wc_uchar ub, lb;
83
84
0
    ub = cc.code >> 8;
85
0
    lb = cc.code & 0xff;
86
0
    if (ub < 0xf0) {
87
0
  sjis_to_jisx0208(ub, lb);
88
0
  cc.ccs = WC_CCS_JIS_X_0208;
89
0
    } else {
90
0
  sjis_to_jisx02132(ub, lb);
91
0
  cc.ccs = WC_CCS_JIS_X_0213_2;
92
0
    }
93
0
    cc.code = ((wc_uint32)ub << 8) | lb;
94
0
    return cc;
95
0
}
96
97
wc_wchar_t
98
wc_jis_to_sjis(wc_wchar_t cc)
99
0
{
100
0
    wc_uchar ub, lb;
101
102
0
    ub = (cc.code >> 8) & 0x7f;
103
0
    lb = cc.code & 0x7f;
104
0
    if (cc.ccs == WC_CCS_JIS_X_0213_2) {
105
0
  jisx02132_to_sjis(ub, lb);
106
0
  if (! ub) {
107
0
      cc.ccs = WC_CCS_UNKNOWN_W;
108
0
      return cc;
109
0
  }
110
0
    } else {
111
0
  jisx0208_to_sjis(ub, lb);
112
0
    }
113
0
    cc.code = ((wc_uint32)ub << 8) | lb;
114
0
    return cc;
115
0
}
116
117
wc_wchar_t
118
wc_sjis_ext_to_cs94w(wc_wchar_t cc)
119
84.8k
{
120
84.8k
    wc_uchar ub, lb;
121
122
84.8k
    ub = cc.code >> 8;
123
84.8k
    lb = cc.code & 0xff;
124
84.8k
    sjis_to_jisx0208(ub, lb);
125
84.8k
    if (ub <= 0x7e) {
126
43.6k
  cc.ccs = WC_CCS_SJIS_EXT_1;
127
43.6k
    } else {
128
41.1k
  ub -= 0x5e;
129
41.1k
  cc.ccs = WC_CCS_SJIS_EXT_2;
130
41.1k
    }
131
84.8k
    cc.code = ((wc_uint32)ub << 8) | lb;
132
84.8k
    return cc;
133
84.8k
}
134
135
wc_wchar_t
136
wc_cs94w_to_sjis_ext(wc_wchar_t cc)
137
37.3k
{
138
37.3k
    wc_uchar ub, lb;
139
140
37.3k
    ub = (cc.code >> 8) & 0x7f;
141
37.3k
    lb = cc.code & 0x7f;
142
37.3k
    if (cc.ccs == WC_CCS_SJIS_EXT_2)
143
15.9k
  ub += 0x5e;
144
37.3k
    jisx0208_to_sjis(ub, lb);
145
37.3k
    cc.ccs = WC_CCS_SJIS_EXT;
146
37.3k
    cc.code = ((wc_uint32)ub << 8) | lb;
147
37.3k
    return cc;
148
37.3k
}
149
150
wc_uint32
151
wc_sjis_ext1_to_N(wc_uint32 c)
152
22.2k
{
153
22.2k
    wc_uchar ub;
154
155
22.2k
    ub = (c >> 8) & 0x7f;
156
22.2k
    switch(ub) {
157
1.48k
    case 0x2D:  /* 0x8740 - */
158
1.48k
  ub = 0;
159
1.48k
  break;
160
1.59k
    case 0x79:  /* 0xED40 - */
161
4.65k
    case 0x7A:  /* 0xED9F - */
162
5.19k
    case 0x7B:  /* 0xEE40 - */
163
6.01k
    case 0x7C:  /* 0xEE9F - */
164
6.01k
  ub -= 0x78;
165
6.01k
  break;
166
14.7k
    default:
167
14.7k
  return WC_C_SJIS_ERROR;
168
22.2k
    }
169
7.50k
    return ub * 0x5e + (c & 0x7f) - 0x21;
170
22.2k
}
171
172
wc_uint32
173
wc_sjis_ext2_to_N(wc_uint32 c)
174
25.2k
{
175
25.2k
    wc_uchar ub;
176
177
25.2k
    ub = (c >> 8) & 0x7f;
178
25.2k
    switch(ub) {
179
207
    case 0x35:  /* 0xFA40 - */
180
1.12k
    case 0x36:  /* 0xFA9F - */
181
1.30k
    case 0x37:  /* 0xFB40 - */
182
1.98k
    case 0x38:  /* 0xFB9F - */
183
2.22k
    case 0x39:  /* 0xFC40 - */
184
2.22k
  ub -= 0x30;
185
2.22k
  break;
186
23.0k
    default:
187
23.0k
  return WC_C_SJIS_ERROR;
188
25.2k
    }
189
2.22k
    return ub * 0x5e + (c & 0x7f) - 0x21;
190
25.2k
}
191
192
Str
193
wc_conv_from_sjis(Str is, wc_ces ces)
194
1.35k
{
195
1.35k
    Str os;
196
1.35k
    wc_uchar *sp = (wc_uchar *)is->ptr;
197
1.35k
    wc_uchar *ep = sp + is->length;
198
1.35k
    wc_uchar *p;
199
1.35k
    wc_uchar jis[2];
200
1.35k
    int state = WC_SJIS_NOSTATE;
201
1.35k
    wc_wchar_t cc;
202
203
2.71k
    for (p = sp; p < ep && *p < 0x80; p++)
204
1.36k
  ;
205
1.35k
    if (p == ep)
206
103
  return is;
207
1.25k
    os = Strnew_size(is->length);
208
1.25k
    if (p > sp)
209
232
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
210
211
38.7M
    for (; p < ep; p++) {
212
38.7M
  switch (state) {
213
38.6M
  case WC_SJIS_NOSTATE:
214
38.6M
      switch (WC_SJIS_MAP[*p]) {
215
73.8k
      case SL:
216
73.8k
    state = WC_SJIS_SHIFT_L;
217
73.8k
    break;
218
23.9k
      case SH:
219
23.9k
    state = WC_SJIS_SHIFT_H;
220
23.9k
    break;
221
18.7k
      case SX:
222
18.7k
    state = WC_SJIS_SHIFT_X;
223
18.7k
    break;
224
36.5M
      case SK:
225
36.5M
    wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)*p);
226
36.5M
    break;
227
10.8k
      case S80:
228
14.9k
      case SA0:
229
67.4k
      case C1:
230
67.4k
    wtf_push_unknown(os, p, 1);
231
67.4k
    break;
232
1.91M
      default:
233
1.91M
    Strcat_char(os, (char)*p);
234
1.91M
    break;
235
38.6M
      }
236
38.6M
      break;
237
38.6M
  case WC_SJIS_SHIFT_L:
238
97.7k
  case WC_SJIS_SHIFT_H:
239
97.7k
      if (WC_SJIS_MAP[*p] & LB) {
240
74.5k
    jis[0] = *(p-1);
241
74.5k
    jis[1] = *p;
242
74.5k
    sjis_to_jisx0208(jis[0], jis[1]);
243
74.5k
    cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
244
74.5k
    cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
245
74.5k
    if (cc.ccs == WC_CCS_JIS_X_0208)
246
58.1k
        wtf_push(os, cc.ccs, cc.code);
247
16.3k
    else
248
16.3k
        wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)*(p-1) << 8) | *p);
249
74.5k
      } else
250
23.2k
    wtf_push_unknown(os, p-1, 2);
251
97.7k
      state = WC_SJIS_NOSTATE;
252
97.7k
      break;
253
18.7k
  case WC_SJIS_SHIFT_X:
254
18.7k
      if (WC_SJIS_MAP[*p] & LB)
255
15.2k
    wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)*(p-1) << 8) | *p);
256
3.47k
      else
257
3.47k
    wtf_push_unknown(os, p-1, 2);
258
18.7k
      state = WC_SJIS_NOSTATE;
259
18.7k
      break;
260
38.7M
  }
261
38.7M
    }
262
1.25k
    switch (state) {
263
28
    case WC_SJIS_SHIFT_L:
264
38
    case WC_SJIS_SHIFT_H:
265
43
    case WC_SJIS_SHIFT_X:
266
43
  wtf_push_unknown(os, p-1, 1);
267
43
  break;
268
1.25k
    }
269
1.25k
    return os;
270
1.25k
}
271
272
Str
273
wc_conv_from_sjisx0213(Str is, wc_ces ces)
274
170
{
275
170
    Str os;
276
170
    wc_uchar *sp = (wc_uchar *)is->ptr;
277
170
    wc_uchar *ep = sp + is->length;
278
170
    wc_uchar *p;
279
170
    wc_uchar jis[2];
280
170
    int state = WC_SJIS_NOSTATE;
281
170
    wc_wchar_t cc;
282
283
632
    for (p = sp; p < ep && *p < 0x80; p++)
284
462
  ;
285
170
    if (p == ep)
286
11
  return is;
287
159
    os = Strnew_size(is->length);
288
159
    if (p > sp)
289
23
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
290
291
2.30M
    for (; p < ep; p++) {
292
2.30M
  switch (state) {
293
2.17M
  case WC_SJIS_NOSTATE:
294
2.17M
      switch (WC_SJIS_MAP[*p]) {
295
91.5k
      case SL:
296
91.5k
    state = WC_SJIS_SHIFT_L;
297
91.5k
    break;
298
27.4k
      case SH:
299
27.4k
    state = WC_SJIS_SHIFT_H;
300
27.4k
    break;
301
13.4k
      case SX:
302
13.4k
    state = WC_SJIS_SHIFT_X;
303
13.4k
    break;
304
1.66M
      case SK:
305
1.66M
    wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)*p);
306
1.66M
    break;
307
12.0k
      case S80:
308
13.6k
      case SA0:
309
59.6k
      case C1:
310
59.6k
    wtf_push_unknown(os, p, 1);
311
59.6k
    break;
312
320k
      default:
313
320k
    Strcat_char(os, (char)*p);
314
320k
    break;
315
2.17M
      }
316
2.17M
      break;
317
2.17M
  case WC_SJIS_SHIFT_L:
318
119k
  case WC_SJIS_SHIFT_H:
319
119k
      if (WC_SJIS_MAP[*p] & LB) {
320
58.0k
    jis[0] = *(p-1);
321
58.0k
    jis[1] = *p;
322
58.0k
    sjis_to_jisx0208(jis[0], jis[1]);
323
58.0k
    cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
324
58.0k
    cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
325
58.0k
    wtf_push(os, cc.ccs, cc.code);
326
58.0k
      } else
327
61.0k
    wtf_push_unknown(os, p-1, 2);
328
119k
      state = WC_SJIS_NOSTATE;
329
119k
      break;
330
13.4k
  case WC_SJIS_SHIFT_X:
331
13.4k
      if (WC_SJIS_MAP[*p] & LB) {
332
10.8k
    jis[0] = *(p-1);
333
10.8k
    jis[1] = *p;
334
10.8k
    sjis_to_jisx02132(jis[0], jis[1]);
335
10.8k
    wtf_push(os, WC_CCS_JIS_X_0213_2, ((wc_uint32)jis[0] << 8) | jis[1]);
336
10.8k
      } else
337
2.54k
    wtf_push_unknown(os, p-1, 2);
338
13.4k
      state = WC_SJIS_NOSTATE;
339
13.4k
      break;
340
2.30M
  }
341
2.30M
    }
342
159
    switch (state) {
343
7
    case WC_SJIS_SHIFT_L:
344
9
    case WC_SJIS_SHIFT_H:
345
12
    case WC_SJIS_SHIFT_X:
346
12
  wtf_push_unknown(os, p-1, 1);
347
12
  break;
348
159
    }
349
159
    return os;
350
159
}
351
352
void
353
wc_push_to_sjis(Str os, wc_wchar_t cc, wc_status *st)
354
4.62M
{
355
4.62M
    wc_uchar ub, lb;
356
357
6.89M
  while (1) {
358
6.89M
    switch (cc.ccs) {
359
1.97M
    case WC_CCS_US_ASCII:
360
1.97M
  Strcat_char(os, cc.code);
361
1.97M
  return;
362
13.6k
    case WC_CCS_JIS_X_0201K:
363
13.6k
  if (WcOption.use_jisx0201k) {
364
0
      Strcat_char(os, cc.code | 0x80);
365
0
      return;
366
13.6k
  } else if (WcOption.fix_width_conv)
367
13.6k
      cc.ccs = WC_CCS_UNKNOWN;
368
0
  else
369
0
      cc = wc_jisx0201k_to_jisx0208(cc);
370
13.6k
  continue;
371
2.44M
    case WC_CCS_JIS_X_0208:
372
2.44M
  ub = (cc.code >> 8) & 0x7f;
373
2.44M
  lb = cc.code & 0x7f;
374
2.44M
  jisx0208_to_sjis(ub, lb);
375
2.44M
  Strcat_char(os, ub);
376
2.44M
  Strcat_char(os, lb);
377
2.44M
  return;
378
5.03k
    case WC_CCS_SJIS_EXT_1:
379
5.71k
    case WC_CCS_SJIS_EXT_2:
380
5.71k
  cc = wc_cs94w_to_sjis_ext(cc);
381
7.79k
    case WC_CCS_SJIS_EXT:
382
7.79k
  Strcat_char(os, (char)(cc.code >> 8));
383
7.79k
  Strcat_char(os, (char)(cc.code & 0xff));
384
7.79k
  return;
385
106k
    case WC_CCS_UNKNOWN_W:
386
106k
  if (!WcOption.no_replace)
387
106k
      Strcat_charp(os, WC_REPLACE_W);
388
106k
  return;
389
82.8k
    case WC_CCS_UNKNOWN:
390
82.8k
  if (!WcOption.no_replace)
391
82.8k
      Strcat_charp(os, WC_REPLACE);
392
82.8k
  return;
393
2.25M
    default:
394
2.25M
#ifdef USE_UNICODE
395
2.25M
  if (WcOption.ucs_conv)
396
2.25M
      cc = wc_any_to_any_ces(cc, st);
397
0
  else
398
0
#endif
399
0
      cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
400
2.25M
  continue;
401
6.89M
    }
402
6.89M
  }
403
4.62M
}
404
405
void
406
wc_push_to_sjisx0213(Str os, wc_wchar_t cc, wc_status *st)
407
698k
{
408
698k
    wc_uchar ub, lb;
409
410
1.00M
  while (1) {
411
1.00M
    switch (cc.ccs) {
412
2.50k
    case WC_CCS_US_ASCII:
413
2.50k
  Strcat_char(os, cc.code);
414
2.50k
  return;
415
8.43k
    case WC_CCS_JIS_X_0201K:
416
8.43k
  if (WcOption.use_jisx0201k) {
417
0
      Strcat_char(os, cc.code | 0x80);
418
0
      return;
419
8.43k
  } else if (WcOption.fix_width_conv)
420
8.43k
      cc.ccs = WC_CCS_UNKNOWN;
421
0
  else
422
0
      cc = wc_jisx0201k_to_jisx0208(cc);
423
8.43k
  continue;
424
8.43k
    case WC_CCS_JIS_X_0213_1:
425
292
  if (! WcOption.use_jisx0213) {
426
292
      cc.ccs = WC_CCS_UNKNOWN_W;
427
292
      continue;
428
292
  }
429
381k
    case WC_CCS_JIS_X_0208:
430
381k
  ub = (cc.code >> 8) & 0x7f;
431
381k
  lb = cc.code & 0x7f;
432
381k
  jisx0208_to_sjis(ub, lb);
433
381k
  Strcat_char(os, ub);
434
381k
  Strcat_char(os, lb);
435
381k
  return;
436
260
    case WC_CCS_JIS_X_0213_2:
437
260
  if (! WcOption.use_jisx0213) {
438
260
      cc.ccs = WC_CCS_UNKNOWN_W;
439
260
      continue;
440
260
  }
441
0
  ub = (cc.code >> 8) & 0x7f;
442
0
  lb = cc.code & 0x7f;
443
0
  jisx02132_to_sjis(ub, lb);
444
0
  if (ub) {
445
0
      Strcat_char(os, ub);
446
0
      Strcat_char(os, lb);
447
0
      return;
448
0
  }
449
160k
    case WC_CCS_UNKNOWN_W:
450
160k
  if (!WcOption.no_replace)
451
160k
      Strcat_charp(os, WC_REPLACE_W);
452
160k
  return;
453
152k
    case WC_CCS_UNKNOWN:
454
152k
  if (!WcOption.no_replace)
455
152k
      Strcat_charp(os, WC_REPLACE);
456
152k
  return;
457
293k
    default:
458
293k
#ifdef USE_UNICODE
459
293k
  if (WcOption.ucs_conv)
460
293k
      cc = wc_any_to_any_ces(cc, st);
461
0
  else
462
0
#endif
463
0
      cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
464
293k
  continue;
465
1.00M
    }
466
1.00M
  }
467
698k
}
468
469
Str
470
wc_char_conv_from_sjis(wc_uchar c, wc_status *st)
471
0
{
472
0
    static Str os;
473
0
    static wc_uchar jis[2];
474
0
    wc_wchar_t cc;
475
476
0
    if (st->state == -1) {
477
0
  st->state = WC_SJIS_NOSTATE;
478
0
  os = Strnew_size(8);
479
0
    }
480
481
0
    switch (st->state) {
482
0
    case WC_SJIS_NOSTATE:
483
0
  switch (WC_SJIS_MAP[c]) {
484
0
  case SL:
485
0
      jis[0] = c;
486
0
      st->state = WC_SJIS_SHIFT_L;
487
0
      return NULL;
488
0
  case SH:
489
0
      jis[0] = c;
490
0
      st->state = WC_SJIS_SHIFT_H;
491
0
      return NULL;
492
0
  case SX:
493
0
      jis[0] = c;
494
0
      st->state = WC_SJIS_SHIFT_X;
495
0
      return NULL;
496
0
  case SK:
497
0
      wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)c);
498
0
      break;
499
0
  case S80:
500
0
  case SA0:
501
0
  case C1:
502
0
      break;
503
0
  default:
504
0
      Strcat_char(os, (char)c);
505
0
      break;
506
0
  }
507
0
  break;
508
0
    case WC_SJIS_SHIFT_L:
509
0
    case WC_SJIS_SHIFT_H:
510
0
  if (WC_SJIS_MAP[c] & LB) {
511
0
      jis[1] = c;
512
0
      sjis_to_jisx0208(jis[0], jis[1]);
513
0
      cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
514
0
      cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
515
0
      if (cc.ccs == WC_CCS_JIS_X_0208)
516
0
    wtf_push(os, cc.ccs, cc.code);
517
0
      else
518
0
          wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)jis[0] << 8) | jis[1]);
519
0
  }
520
0
  st->state = WC_SJIS_NOSTATE;
521
0
  break;
522
0
    case WC_SJIS_SHIFT_X:
523
0
  if (WC_SJIS_MAP[c] & LB) {
524
0
      jis[1] = c;
525
0
      wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)jis[0] << 8) | jis[1]);
526
0
  }
527
0
  st->state = WC_SJIS_NOSTATE;
528
0
  break;
529
0
    }
530
0
    st->state = -1;
531
0
    return os;
532
0
}
533
534
Str
535
wc_char_conv_from_sjisx0213(wc_uchar c, wc_status *st)
536
0
{
537
0
    static Str os;
538
0
    static wc_uchar jis[2];
539
0
    wc_wchar_t cc;
540
541
0
    if (st->state == -1) {
542
0
  st->state = WC_SJIS_NOSTATE;
543
0
  os = Strnew_size(8);
544
0
    }
545
546
0
    switch (st->state) {
547
0
    case WC_SJIS_NOSTATE:
548
0
  switch (WC_SJIS_MAP[c]) {
549
0
  case SL:
550
0
      jis[0] = c;
551
0
      st->state = WC_SJIS_SHIFT_L;
552
0
      return NULL;
553
0
  case SH:
554
0
      jis[0] = c;
555
0
      st->state = WC_SJIS_SHIFT_H;
556
0
      return NULL;
557
0
  case SX:
558
0
      jis[0] = c;
559
0
      st->state = WC_SJIS_SHIFT_X;
560
0
      return NULL;
561
0
  case SK:
562
0
      wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)c);
563
0
      break;
564
0
  case S80:
565
0
  case SA0:
566
0
  case C1:
567
0
      break;
568
0
  default:
569
0
      Strcat_char(os, (char)c);
570
0
      break;
571
0
  }
572
0
  break;
573
0
    case WC_SJIS_SHIFT_L:
574
0
    case WC_SJIS_SHIFT_H:
575
0
  if (WC_SJIS_MAP[c] & LB) {
576
0
      jis[1] = c;
577
0
      sjis_to_jisx0208(jis[0], jis[1]);
578
0
      cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
579
0
      cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
580
0
      wtf_push(os, cc.ccs, cc.code);
581
0
  }
582
0
  st->state = WC_SJIS_NOSTATE;
583
0
  break;
584
0
    case WC_SJIS_SHIFT_X:
585
0
  if (WC_SJIS_MAP[c] & LB) {
586
0
      jis[1] = c;
587
0
      sjis_to_jisx02132(jis[0], jis[1]);
588
0
      wtf_push(os, WC_CCS_JIS_X_0213_2, ((wc_uint32)jis[0] << 8) | jis[1]);
589
0
  }
590
0
  st->state = WC_SJIS_NOSTATE;
591
0
  break;
592
0
    }
593
0
    st->state = -1;
594
0
    return os;
595
0
}