8 #include "map/jisx02132_sjis.map"
9 wc_uchar *wc_jisx0212_jisx02132_map = jisx02132_sjis_map;
11 #define C0 WC_SJIS_MAP_C0
12 #define GL WC_SJIS_MAP_GL
13 #define LB WC_SJIS_MAP_LB
14 #define S80 WC_SJIS_MAP_80
15 #define SK WC_SJIS_MAP_SK
16 #define SL WC_SJIS_MAP_SL
17 #define SH WC_SJIS_MAP_SH
18 #define SX WC_SJIS_MAP_SX
19 #define C1 WC_SJIS_MAP_C1
20 #define SA0 WC_SJIS_MAP_A0
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,
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,
42 #define sjis_to_jisx0208(ub, lb) \
44 ub -= (ub < 0xa0) ? 0x81 : 0xc1; \
45 ub = (ub << 1) + 0x21; \
47 lb -= (lb > 0x7e) ? 0x20 : 0x1f; \
53 #define sjis_to_jisx02132(ub, lb) \
56 ub = sjis1_jisx02132_map[ub - 0xf0]; \
57 lb -= (lb > 0x7e) ? 0x20 : 0x1f; \
59 ub = sjis2_jisx02132_map[ub - 0xf0]; \
63 #define jisx0208_to_sjis(ub, lb) \
65 lb += (ub & 1) ? 0x1f : 0x7d; \
68 ub = (ub - 0x21) >> 1; \
69 ub += (ub < 0x1f) ? 0x81 : 0xc1; \
71 #define jisx02132_to_sjis(ub, lb) \
73 lb += (ub & 1) ? 0x1f : 0x7d; \
76 ub = jisx02132_sjis_map[ ub ]; \
80 wc_sjis_to_jis(wc_wchar_t cc)
87 sjis_to_jisx0208(ub, lb);
88 cc.ccs = WC_CCS_JIS_X_0208;
90 sjis_to_jisx02132(ub, lb);
91 cc.ccs = WC_CCS_JIS_X_0213_2;
93 cc.code = ((wc_uint32)ub << 8) | lb;
98 wc_jis_to_sjis(wc_wchar_t cc)
102 ub = (cc.code >> 8) & 0x7f;
104 if (cc.ccs == WC_CCS_JIS_X_0213_2) {
105 jisx02132_to_sjis(ub, lb);
107 cc.ccs = WC_CCS_UNKNOWN_W;
111 jisx0208_to_sjis(ub, lb);
113 cc.code = ((wc_uint32)ub << 8) | lb;
118 wc_sjis_ext_to_cs94w(wc_wchar_t cc)
124 sjis_to_jisx0208(ub, lb);
126 cc.ccs = WC_CCS_SJIS_EXT_1;
129 cc.ccs = WC_CCS_SJIS_EXT_2;
131 cc.code = ((wc_uint32)ub << 8) | lb;
136 wc_cs94w_to_sjis_ext(wc_wchar_t cc)
140 ub = (cc.code >> 8) & 0x7f;
142 if (cc.ccs == WC_CCS_SJIS_EXT_2)
144 jisx0208_to_sjis(ub, lb);
145 cc.ccs = WC_CCS_SJIS_EXT;
146 cc.code = ((wc_uint32)ub << 8) | lb;
151 wc_sjis_ext1_to_N(wc_uint32 c)
155 ub = (c >> 8) & 0x7f;
157 case 0x2D: /* 0x8740 - */
160 case 0x79: /* 0xED40 - */
161 case 0x7A: /* 0xED9F - */
162 case 0x7B: /* 0xEE40 - */
163 case 0x7C: /* 0xEE9F - */
167 return WC_C_SJIS_ERROR;
169 return ub * 0x5e + (c & 0x7f) - 0x21;
173 wc_sjis_ext2_to_N(wc_uint32 c)
177 ub = (c >> 8) & 0x7f;
179 case 0x35: /* 0xFA40 - */
180 case 0x36: /* 0xFA9F - */
181 case 0x37: /* 0xFB40 - */
182 case 0x38: /* 0xFB9F - */
183 case 0x39: /* 0xFC40 - */
187 return WC_C_SJIS_ERROR;
189 return ub * 0x5e + (c & 0x7f) - 0x21;
193 wc_conv_from_sjis(Str is, wc_ces ces)
196 wc_uchar *sp = (wc_uchar *)is->ptr;
197 wc_uchar *ep = sp + is->length;
200 int state = WC_SJIS_NOSTATE;
203 for (p = sp; p < ep && *p < 0x80; p++)
207 os = Strnew_size(is->length);
209 Strcat_charp_n(os, is->ptr, (int)(p - sp));
211 for (; p < ep; p++) {
213 case WC_SJIS_NOSTATE:
214 switch (WC_SJIS_MAP[*p]) {
216 state = WC_SJIS_SHIFT_L;
219 state = WC_SJIS_SHIFT_H;
222 state = WC_SJIS_SHIFT_X;
225 wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)*p);
230 wtf_push_unknown(os, p, 1);
233 Strcat_char(os, (char)*p);
237 case WC_SJIS_SHIFT_L:
238 case WC_SJIS_SHIFT_H:
239 if (WC_SJIS_MAP[*p] & LB) {
242 sjis_to_jisx0208(jis[0], jis[1]);
243 cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
244 cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
245 if (cc.ccs == WC_CCS_JIS_X_0208)
246 wtf_push(os, cc.ccs, cc.code);
248 wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)*(p-1) << 8) | *p);
250 wtf_push_unknown(os, p-1, 2);
251 state = WC_SJIS_NOSTATE;
253 case WC_SJIS_SHIFT_X:
254 if (WC_SJIS_MAP[*p] & LB)
255 wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)*(p-1) << 8) | *p);
257 wtf_push_unknown(os, p-1, 2);
258 state = WC_SJIS_NOSTATE;
263 case WC_SJIS_SHIFT_L:
264 case WC_SJIS_SHIFT_H:
265 case WC_SJIS_SHIFT_X:
266 wtf_push_unknown(os, p-1, 1);
273 wc_conv_from_sjisx0213(Str is, wc_ces ces)
276 wc_uchar *sp = (wc_uchar *)is->ptr;
277 wc_uchar *ep = sp + is->length;
280 int state = WC_SJIS_NOSTATE;
283 for (p = sp; p < ep && *p < 0x80; p++)
287 os = Strnew_size(is->length);
289 Strcat_charp_n(os, is->ptr, (int)(p - sp));
291 for (; p < ep; p++) {
293 case WC_SJIS_NOSTATE:
294 switch (WC_SJIS_MAP[*p]) {
296 state = WC_SJIS_SHIFT_L;
299 state = WC_SJIS_SHIFT_H;
302 state = WC_SJIS_SHIFT_X;
305 wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)*p);
310 wtf_push_unknown(os, p, 1);
313 Strcat_char(os, (char)*p);
317 case WC_SJIS_SHIFT_L:
318 case WC_SJIS_SHIFT_H:
319 if (WC_SJIS_MAP[*p] & LB) {
322 sjis_to_jisx0208(jis[0], jis[1]);
323 cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
324 cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
325 wtf_push(os, cc.ccs, cc.code);
327 wtf_push_unknown(os, p-1, 2);
328 state = WC_SJIS_NOSTATE;
330 case WC_SJIS_SHIFT_X:
331 if (WC_SJIS_MAP[*p] & LB) {
334 sjis_to_jisx02132(jis[0], jis[1]);
335 wtf_push(os, WC_CCS_JIS_X_0213_2, ((wc_uint32)jis[0] << 8) | jis[1]);
337 wtf_push_unknown(os, p-1, 2);
338 state = WC_SJIS_NOSTATE;
343 case WC_SJIS_SHIFT_L:
344 case WC_SJIS_SHIFT_H:
345 case WC_SJIS_SHIFT_X:
346 wtf_push_unknown(os, p-1, 1);
353 wc_push_to_sjis(Str os, wc_wchar_t cc, wc_status *st)
359 case WC_CCS_US_ASCII:
360 Strcat_char(os, cc.code);
362 case WC_CCS_JIS_X_0201K:
363 if (WcOption.use_jisx0201k) {
364 Strcat_char(os, cc.code | 0x80);
366 } else if (WcOption.fix_width_conv)
367 cc.ccs = WC_CCS_UNKNOWN;
369 cc = wc_jisx0201k_to_jisx0208(cc);
371 case WC_CCS_JIS_X_0208:
372 ub = (cc.code >> 8) & 0x7f;
374 jisx0208_to_sjis(ub, lb);
378 case WC_CCS_SJIS_EXT_1:
379 case WC_CCS_SJIS_EXT_2:
380 cc = wc_cs94w_to_sjis_ext(cc);
381 case WC_CCS_SJIS_EXT:
382 Strcat_char(os, (char)(cc.code >> 8));
383 Strcat_char(os, (char)(cc.code & 0xff));
385 case WC_CCS_UNKNOWN_W:
386 if (!WcOption.no_replace)
387 Strcat_charp(os, WC_REPLACE_W);
390 if (!WcOption.no_replace)
391 Strcat_charp(os, WC_REPLACE);
395 if (WcOption.ucs_conv)
396 cc = wc_any_to_any_ces(cc, st);
399 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
406 wc_push_to_sjisx0213(Str os, wc_wchar_t cc, wc_status *st)
412 case WC_CCS_US_ASCII:
413 Strcat_char(os, cc.code);
415 case WC_CCS_JIS_X_0201K:
416 if (WcOption.use_jisx0201k) {
417 Strcat_char(os, cc.code | 0x80);
419 } else if (WcOption.fix_width_conv)
420 cc.ccs = WC_CCS_UNKNOWN;
422 cc = wc_jisx0201k_to_jisx0208(cc);
424 case WC_CCS_JIS_X_0213_1:
425 if (! WcOption.use_jisx0213) {
426 cc.ccs = WC_CCS_UNKNOWN_W;
429 case WC_CCS_JIS_X_0208:
430 ub = (cc.code >> 8) & 0x7f;
432 jisx0208_to_sjis(ub, lb);
436 case WC_CCS_JIS_X_0213_2:
437 if (! WcOption.use_jisx0213) {
438 cc.ccs = WC_CCS_UNKNOWN_W;
441 ub = (cc.code >> 8) & 0x7f;
443 jisx02132_to_sjis(ub, lb);
449 case WC_CCS_UNKNOWN_W:
450 if (!WcOption.no_replace)
451 Strcat_charp(os, WC_REPLACE_W);
454 if (!WcOption.no_replace)
455 Strcat_charp(os, WC_REPLACE);
459 if (WcOption.ucs_conv)
460 cc = wc_any_to_any_ces(cc, st);
463 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
470 wc_char_conv_from_sjis(wc_uchar c, wc_status *st)
473 static wc_uchar jis[2];
476 if (st->state == -1) {
477 st->state = WC_SJIS_NOSTATE;
482 case WC_SJIS_NOSTATE:
483 switch (WC_SJIS_MAP[c]) {
486 st->state = WC_SJIS_SHIFT_L;
490 st->state = WC_SJIS_SHIFT_H;
494 st->state = WC_SJIS_SHIFT_X;
497 wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)c);
504 Strcat_char(os, (char)c);
508 case WC_SJIS_SHIFT_L:
509 case WC_SJIS_SHIFT_H:
510 if (WC_SJIS_MAP[c] & LB) {
512 sjis_to_jisx0208(jis[0], jis[1]);
513 cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
514 cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
515 if (cc.ccs == WC_CCS_JIS_X_0208)
516 wtf_push(os, cc.ccs, cc.code);
518 wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)jis[0] << 8) | jis[1]);
520 st->state = WC_SJIS_NOSTATE;
522 case WC_SJIS_SHIFT_X:
523 if (WC_SJIS_MAP[c] & LB) {
525 wtf_push(os, WC_CCS_SJIS_EXT, ((wc_uint32)jis[0] << 8) | jis[1]);
527 st->state = WC_SJIS_NOSTATE;
535 wc_char_conv_from_sjisx0213(wc_uchar c, wc_status *st)
538 static wc_uchar jis[2];
541 if (st->state == -1) {
542 st->state = WC_SJIS_NOSTATE;
547 case WC_SJIS_NOSTATE:
548 switch (WC_SJIS_MAP[c]) {
551 st->state = WC_SJIS_SHIFT_L;
555 st->state = WC_SJIS_SHIFT_H;
559 st->state = WC_SJIS_SHIFT_X;
562 wtf_push(os, WC_CCS_JIS_X_0201K, (wc_uint32)c);
569 Strcat_char(os, (char)c);
573 case WC_SJIS_SHIFT_L:
574 case WC_SJIS_SHIFT_H:
575 if (WC_SJIS_MAP[c] & LB) {
577 sjis_to_jisx0208(jis[0], jis[1]);
578 cc.code = ((wc_uint32)jis[0] << 8) | jis[1];
579 cc.ccs = wc_jisx0208_or_jisx02131(cc.code);
580 wtf_push(os, cc.ccs, cc.code);
582 st->state = WC_SJIS_NOSTATE;
584 case WC_SJIS_SHIFT_X:
585 if (WC_SJIS_MAP[c] & LB) {
587 sjis_to_jisx02132(jis[0], jis[1]);
588 wtf_push(os, WC_CCS_JIS_X_0213_2, ((wc_uint32)jis[0] << 8) | jis[1]);
590 st->state = WC_SJIS_NOSTATE;