Coverage Report

Created: 2025-06-13 06:37

/src/w3m/libwc/sjis.c
Line
Count
Source (jump to first uncovered line)
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
328k
#define LB  WC_SJIS_MAP_LB
14
42.0k
#define S80 WC_SJIS_MAP_80
15
50.5M
#define SK  WC_SJIS_MAP_SK
16
185k
#define SL  WC_SJIS_MAP_SL
17
51.4k
#define SH  WC_SJIS_MAP_SH
18
90.9k
#define SX  WC_SJIS_MAP_SX
19
182k
#define C1  WC_SJIS_MAP_C1
20
53.1k
#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
317k
#define sjis_to_jisx0208(ub, lb) \
43
317k
{ \
44
317k
    ub -= (ub < 0xa0) ? 0x81 : 0xc1; \
45
317k
    ub = (ub << 1) + 0x21; \
46
317k
    if (lb < 0x9f) { \
47
147k
  lb -= (lb > 0x7e) ? 0x20 : 0x1f; \
48
170k
    } else { \
49
170k
  ub++; \
50
170k
  lb -= 0x7e; \
51
170k
    } \
52
317k
}
53
8.83k
#define sjis_to_jisx02132(ub, lb) \
54
8.83k
{ \
55
8.83k
    if (lb < 0x9f) { \
56
2.61k
  ub = sjis1_jisx02132_map[ub - 0xf0]; \
57
2.61k
  lb -= (lb > 0x7e) ? 0x20 : 0x1f; \
58
6.22k
    } else { \
59
6.22k
  ub = sjis2_jisx02132_map[ub - 0xf0]; \
60
6.22k
  lb -= 0x7e; \
61
6.22k
    } \
62
8.83k
}
63
7.72M
#define jisx0208_to_sjis(ub, lb) \
64
7.72M
{ \
65
7.72M
    lb += (ub & 1) ? 0x1f : 0x7d; \
66
7.72M
    if (lb > 0x7e) \
67
7.72M
  lb++; \
68
7.72M
    ub = (ub - 0x21) >> 1; \
69
7.72M
    ub += (ub < 0x1f) ? 0x81 : 0xc1; \
70
7.72M
}
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
147k
{
120
147k
    wc_uchar ub, lb;
121
122
147k
    ub = cc.code >> 8;
123
147k
    lb = cc.code & 0xff;
124
147k
    sjis_to_jisx0208(ub, lb);
125
147k
    if (ub <= 0x7e) {
126
43.2k
  cc.ccs = WC_CCS_SJIS_EXT_1;
127
104k
    } else {
128
104k
  ub -= 0x5e;
129
104k
  cc.ccs = WC_CCS_SJIS_EXT_2;
130
104k
    }
131
147k
    cc.code = ((wc_uint32)ub << 8) | lb;
132
147k
    return cc;
133
147k
}
134
135
wc_wchar_t
136
wc_cs94w_to_sjis_ext(wc_wchar_t cc)
137
96.2k
{
138
96.2k
    wc_uchar ub, lb;
139
140
96.2k
    ub = (cc.code >> 8) & 0x7f;
141
96.2k
    lb = cc.code & 0x7f;
142
96.2k
    if (cc.ccs == WC_CCS_SJIS_EXT_2)
143
75.0k
  ub += 0x5e;
144
96.2k
    jisx0208_to_sjis(ub, lb);
145
96.2k
    cc.ccs = WC_CCS_SJIS_EXT;
146
96.2k
    cc.code = ((wc_uint32)ub << 8) | lb;
147
96.2k
    return cc;
148
96.2k
}
149
150
wc_uint32
151
wc_sjis_ext1_to_N(wc_uint32 c)
152
22.0k
{
153
22.0k
    wc_uchar ub;
154
155
22.0k
    ub = (c >> 8) & 0x7f;
156
22.0k
    switch(ub) {
157
2.40k
    case 0x2D:  /* 0x8740 - */
158
2.40k
  ub = 0;
159
2.40k
  break;
160
590
    case 0x79:  /* 0xED40 - */
161
1.97k
    case 0x7A:  /* 0xED9F - */
162
2.74k
    case 0x7B:  /* 0xEE40 - */
163
3.50k
    case 0x7C:  /* 0xEE9F - */
164
3.50k
  ub -= 0x78;
165
3.50k
  break;
166
16.1k
    default:
167
16.1k
  return WC_C_SJIS_ERROR;
168
22.0k
    }
169
5.91k
    return ub * 0x5e + (c & 0x7f) - 0x21;
170
22.0k
}
171
172
wc_uint32
173
wc_sjis_ext2_to_N(wc_uint32 c)
174
29.4k
{
175
29.4k
    wc_uchar ub;
176
177
29.4k
    ub = (c >> 8) & 0x7f;
178
29.4k
    switch(ub) {
179
439
    case 0x35:  /* 0xFA40 - */
180
4.81k
    case 0x36:  /* 0xFA9F - */
181
5.34k
    case 0x37:  /* 0xFB40 - */
182
7.02k
    case 0x38:  /* 0xFB9F - */
183
7.51k
    case 0x39:  /* 0xFC40 - */
184
7.51k
  ub -= 0x30;
185
7.51k
  break;
186
21.9k
    default:
187
21.9k
  return WC_C_SJIS_ERROR;
188
29.4k
    }
189
7.51k
    return ub * 0x5e + (c & 0x7f) - 0x21;
190
29.4k
}
191
192
Str
193
wc_conv_from_sjis(Str is, wc_ces ces)
194
1.58k
{
195
1.58k
    Str os;
196
1.58k
    wc_uchar *sp = (wc_uchar *)is->ptr;
197
1.58k
    wc_uchar *ep = sp + is->length;
198
1.58k
    wc_uchar *p;
199
1.58k
    wc_uchar jis[2];
200
1.58k
    int state = WC_SJIS_NOSTATE;
201
1.58k
    wc_wchar_t cc;
202
203
2.56k
    for (p = sp; p < ep && *p < 0x80; p++)
204
980
  ;
205
1.58k
    if (p == ep)
206
123
  return is;
207
1.46k
    os = Strnew_size(is->length);
208
1.46k
    if (p > sp)
209
261
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
210
211
49.7M
    for (; p < ep; p++) {
212
49.7M
  switch (state) {
213
49.4M
  case WC_SJIS_NOSTATE:
214
49.4M
      switch (WC_SJIS_MAP[*p]) {
215
140k
      case SL:
216
140k
    state = WC_SJIS_SHIFT_L;
217
140k
    break;
218
41.5k
      case SH:
219
41.5k
    state = WC_SJIS_SHIFT_H;
220
41.5k
    break;
221
79.9k
      case SX:
222
79.9k
    state = WC_SJIS_SHIFT_X;
223
79.9k
    break;
224
46.5M
      case SK:
225
46.5M
    wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)*p);
226
46.5M
    break;
227
25.3k
      case S80:
228
29.7k
      case SA0:
229
109k
      case C1:
230
109k
    wtf_push_unknown(os, p, 1);
231
109k
    break;
232
2.52M
      default:
233
2.52M
    Strcat_char(os, (char)*p);
234
2.52M
    break;
235
49.4M
      }
236
49.4M
      break;
237
49.4M
  case WC_SJIS_SHIFT_L:
238
182k
  case WC_SJIS_SHIFT_H:
239
182k
      if (WC_SJIS_MAP[*p] & LB) {
240
138k
    jis[0] = *(p-1);
241
138k
    jis[1] = *p;
242
138k
    sjis_to_jisx0208(jis[0], jis[1]);
243
138k
    cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
244
138k
    cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
245
138k
    if (cc.ccs == WC_CCS_JIS_X_0208)
246
119k
        wtf_push(os, cc.ccs, cc.code);
247
19.2k
    else
248
19.2k
        wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)*(p-1) << 8) | *p);
249
138k
      } else
250
43.3k
    wtf_push_unknown(os, p-1, 2);
251
182k
      state = WC_SJIS_NOSTATE;
252
182k
      break;
253
79.9k
  case WC_SJIS_SHIFT_X:
254
79.9k
      if (WC_SJIS_MAP[*p] & LB)
255
73.9k
    wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)*(p-1) << 8) | *p);
256
6.01k
      else
257
6.01k
    wtf_push_unknown(os, p-1, 2);
258
79.9k
      state = WC_SJIS_NOSTATE;
259
79.9k
      break;
260
49.7M
  }
261
49.7M
    }
262
1.46k
    switch (state) {
263
34
    case WC_SJIS_SHIFT_L:
264
54
    case WC_SJIS_SHIFT_H:
265
61
    case WC_SJIS_SHIFT_X:
266
61
  wtf_push_unknown(os, p-1, 1);
267
61
  break;
268
1.46k
    }
269
1.46k
    return os;
270
1.46k
}
271
272
Str
273
wc_conv_from_sjisx0213(Str is, wc_ces ces)
274
198
{
275
198
    Str os;
276
198
    wc_uchar *sp = (wc_uchar *)is->ptr;
277
198
    wc_uchar *ep = sp + is->length;
278
198
    wc_uchar *p;
279
198
    wc_uchar jis[2];
280
198
    int state = WC_SJIS_NOSTATE;
281
198
    wc_wchar_t cc;
282
283
588
    for (p = sp; p < ep && *p < 0x80; p++)
284
390
  ;
285
198
    if (p == ep)
286
13
  return is;
287
185
    os = Strnew_size(is->length);
288
185
    if (p > sp)
289
53
  Strcat_charp_n(os, is->ptr, (int)(p - sp));
290
291
4.31M
    for (; p < ep; p++) {
292
4.31M
  switch (state) {
293
4.24M
  case WC_SJIS_NOSTATE:
294
4.24M
      switch (WC_SJIS_MAP[*p]) {
295
44.8k
      case SL:
296
44.8k
    state = WC_SJIS_SHIFT_L;
297
44.8k
    break;
298
9.94k
      case SH:
299
9.94k
    state = WC_SJIS_SHIFT_H;
300
9.94k
    break;
301
11.0k
      case SX:
302
11.0k
    state = WC_SJIS_SHIFT_X;
303
11.0k
    break;
304
3.92M
      case SK:
305
3.92M
    wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)*p);
306
3.92M
    break;
307
16.7k
      case S80:
308
23.4k
      case SA0:
309
72.7k
      case C1:
310
72.7k
    wtf_push_unknown(os, p, 1);
311
72.7k
    break;
312
177k
      default:
313
177k
    Strcat_char(os, (char)*p);
314
177k
    break;
315
4.24M
      }
316
4.24M
      break;
317
4.24M
  case WC_SJIS_SHIFT_L:
318
54.8k
  case WC_SJIS_SHIFT_H:
319
54.8k
      if (WC_SJIS_MAP[*p] & LB) {
320
30.8k
    jis[0] = *(p-1);
321
30.8k
    jis[1] = *p;
322
30.8k
    sjis_to_jisx0208(jis[0], jis[1]);
323
30.8k
    cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
324
30.8k
    cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
325
30.8k
    wtf_push(os, cc.ccs, cc.code);
326
30.8k
      } else
327
24.0k
    wtf_push_unknown(os, p-1, 2);
328
54.8k
      state = WC_SJIS_NOSTATE;
329
54.8k
      break;
330
11.0k
  case WC_SJIS_SHIFT_X:
331
11.0k
      if (WC_SJIS_MAP[*p] & LB) {
332
8.83k
    jis[0] = *(p-1);
333
8.83k
    jis[1] = *p;
334
8.83k
    sjis_to_jisx02132(jis[0], jis[1]);
335
8.83k
    wtf_push(os, WC_CCS_JIS_X_0213_2, ((wc_uint32)jis[0] << 8) | jis[1]);
336
8.83k
      } else
337
2.16k
    wtf_push_unknown(os, p-1, 2);
338
11.0k
      state = WC_SJIS_NOSTATE;
339
11.0k
      break;
340
4.31M
  }
341
4.31M
    }
342
185
    switch (state) {
343
8
    case WC_SJIS_SHIFT_L:
344
11
    case WC_SJIS_SHIFT_H:
345
17
    case WC_SJIS_SHIFT_X:
346
17
  wtf_push_unknown(os, p-1, 1);
347
17
  break;
348
185
    }
349
185
    return os;
350
185
}
351
352
void
353
wc_push_to_sjis(Str os, wc_wchar_t cc, wc_status *st)
354
3.59M
{
355
3.59M
    wc_uchar ub, lb;
356
357
3.70M
  while (1) {
358
3.70M
    switch (cc.ccs) {
359
82.1k
    case WC_CCS_US_ASCII:
360
82.1k
  Strcat_char(os, cc.code);
361
82.1k
  return;
362
6.84k
    case WC_CCS_JIS_X_0201K:
363
6.84k
  if (WcOption.use_jisx0201k) {
364
0
      Strcat_char(os, cc.code | 0x80);
365
0
      return;
366
6.84k
  } else if (WcOption.fix_width_conv)
367
6.84k
      cc.ccs = WC_CCS_UNKNOWN;
368
0
  else
369
0
      cc = wc_jisx0201k_to_jisx0208(cc);
370
6.84k
  continue;
371
3.34M
    case WC_CCS_JIS_X_0208:
372
3.34M
  ub = (cc.code >> 8) & 0x7f;
373
3.34M
  lb = cc.code & 0x7f;
374
3.34M
  jisx0208_to_sjis(ub, lb);
375
3.34M
  Strcat_char(os, ub);
376
3.34M
  Strcat_char(os, lb);
377
3.34M
  return;
378
1.97k
    case WC_CCS_SJIS_EXT_1:
379
3.03k
    case WC_CCS_SJIS_EXT_2:
380
3.03k
  cc = wc_cs94w_to_sjis_ext(cc);
381
54.2k
    case WC_CCS_SJIS_EXT:
382
54.2k
  Strcat_char(os, (char)(cc.code >> 8));
383
54.2k
  Strcat_char(os, (char)(cc.code & 0xff));
384
54.2k
  return;
385
8.44k
    case WC_CCS_UNKNOWN_W:
386
8.44k
  if (!WcOption.no_replace)
387
8.44k
      Strcat_charp(os, WC_REPLACE_W);
388
8.44k
  return;
389
102k
    case WC_CCS_UNKNOWN:
390
102k
  if (!WcOption.no_replace)
391
102k
      Strcat_charp(os, WC_REPLACE);
392
102k
  return;
393
101k
    default:
394
101k
#ifdef USE_UNICODE
395
101k
  if (WcOption.ucs_conv)
396
101k
      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
101k
  continue;
401
3.70M
    }
402
3.70M
  }
403
3.59M
}
404
405
void
406
wc_push_to_sjisx0213(Str os, wc_wchar_t cc, wc_status *st)
407
4.43M
{
408
4.43M
    wc_uchar ub, lb;
409
410
4.55M
  while (1) {
411
4.55M
    switch (cc.ccs) {
412
9.87k
    case WC_CCS_US_ASCII:
413
9.87k
  Strcat_char(os, cc.code);
414
9.87k
  return;
415
30.7k
    case WC_CCS_JIS_X_0201K:
416
30.7k
  if (WcOption.use_jisx0201k) {
417
0
      Strcat_char(os, cc.code | 0x80);
418
0
      return;
419
30.7k
  } else if (WcOption.fix_width_conv)
420
30.7k
      cc.ccs = WC_CCS_UNKNOWN;
421
0
  else
422
0
      cc = wc_jisx0201k_to_jisx0208(cc);
423
30.7k
  continue;
424
30.7k
    case WC_CCS_JIS_X_0213_1:
425
818
  if (! WcOption.use_jisx0213) {
426
818
      cc.ccs = WC_CCS_UNKNOWN_W;
427
818
      continue;
428
818
  }
429
4.28M
    case WC_CCS_JIS_X_0208:
430
4.28M
  ub = (cc.code >> 8) & 0x7f;
431
4.28M
  lb = cc.code & 0x7f;
432
4.28M
  jisx0208_to_sjis(ub, lb);
433
4.28M
  Strcat_char(os, ub);
434
4.28M
  Strcat_char(os, lb);
435
4.28M
  return;
436
2.88k
    case WC_CCS_JIS_X_0213_2:
437
2.88k
  if (! WcOption.use_jisx0213) {
438
2.88k
      cc.ccs = WC_CCS_UNKNOWN_W;
439
2.88k
      continue;
440
2.88k
  }
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
9.95k
    case WC_CCS_UNKNOWN_W:
450
9.95k
  if (!WcOption.no_replace)
451
9.95k
      Strcat_charp(os, WC_REPLACE_W);
452
9.95k
  return;
453
131k
    case WC_CCS_UNKNOWN:
454
131k
  if (!WcOption.no_replace)
455
131k
      Strcat_charp(os, WC_REPLACE);
456
131k
  return;
457
84.9k
    default:
458
84.9k
#ifdef USE_UNICODE
459
84.9k
  if (WcOption.ucs_conv)
460
84.9k
      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
84.9k
  continue;
465
4.55M
    }
466
4.55M
  }
467
4.43M
}
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
}