11 #define C0 WC_HKSCS_MAP_C0
12 #define GL WC_HKSCS_MAP_GL
13 #define C1 WC_HKSCS_MAP_C1
14 #define LB WC_HKSCS_MAP_LB
15 #define UB WC_HKSCS_MAP_UB
16 #define UH WC_HKSCS_MAP_UH
18 wc_uint8 WC_HKSCS_MAP[ 0x100 ] = {
19 C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0,
20 C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0, C0,
21 GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
22 GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL, GL,
23 LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB,
24 LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB,
25 LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB,
26 LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, LB, C0,
28 C1, C1, C1, C1, C1, C1, C1, C1, UH, UH, UH, UH, UH, UH, UH, UH,
29 UH, UH, UH, UH, UH, UH, UH, UH, UH, UH, UH, UH, UH, UH, UH, UH,
30 UH, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
31 UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
32 UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
33 UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
34 UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB,
35 UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, UB, C1,
39 wc_hkscs_to_cs128w(wc_wchar_t cc)
41 cc.code = WC_HKSCS_N(cc.code);
43 cc.ccs = WC_CCS_HKSCS_1;
45 cc.ccs = WC_CCS_HKSCS_2;
48 cc.code = WC_N_CS128W(cc.code);
53 wc_cs128w_to_hkscs(wc_wchar_t cc)
55 cc.code = WC_CS128W_N(cc.code);
56 if (cc.ccs == WC_CCS_HKSCS_2)
58 cc.ccs = WC_CCS_HKSCS;
59 cc.code = WC_N_HKSCS(cc.code);
64 wc_hkscs_to_N(wc_uint32 c)
66 if (c < 0xA140) /* 0x8840 - 0xA0FE */
69 return WC_HKSCS_N(c) - 0x59 * 0x9D;
73 wc_conv_from_hkscs(Str is, wc_ces ces)
76 wc_uchar *sp = (wc_uchar *)is->ptr;
77 wc_uchar *ep = sp + is->length;
79 int state = WC_HKSCS_NOSTATE;
82 for (p = sp; p < ep && *p < 0x80; p++)
86 os = Strnew_size(is->length);
88 Strcat_charp_n(os, (char *)is->ptr, (int)(p - sp));
92 case WC_HKSCS_NOSTATE:
93 switch (WC_HKSCS_MAP[*p]) {
96 state = WC_HKSCS_MBYTE1;
99 wtf_push_unknown(os, p, 1);
102 Strcat_char(os, (char)*p);
106 case WC_HKSCS_MBYTE1:
107 if (WC_HKSCS_MAP[*p] & LB) {
108 hkscs = ((wc_uint32)*(p-1) << 8) | *p;
109 if (*(p-1) >= 0xA1 && *(p-1) <= 0xF9)
110 wtf_push(os, WC_CCS_BIG5, hkscs);
112 wtf_push(os, WC_CCS_HKSCS, hkscs);
114 wtf_push_unknown(os, p-1, 2);
115 state = WC_HKSCS_NOSTATE;
120 case WC_HKSCS_MBYTE1:
121 wtf_push_unknown(os, p-1, 1);
128 wc_push_to_hkscs(Str os, wc_wchar_t cc, wc_status *st)
132 case WC_CCS_US_ASCII:
133 Strcat_char(os, (char)cc.code);
137 cc = wc_cs94w_to_big5(cc);
139 Strcat_char(os, (char)(cc.code >> 8));
140 Strcat_char(os, (char)(cc.code & 0xff));
144 cc = wc_cs128w_to_hkscs(cc);
146 Strcat_char(os, (char)(cc.code >> 8));
147 Strcat_char(os, (char)(cc.code & 0xff));
149 case WC_CCS_UNKNOWN_W:
150 if (!WcOption.no_replace)
151 Strcat_charp(os, WC_REPLACE_W);
154 if (!WcOption.no_replace)
155 Strcat_charp(os, WC_REPLACE);
159 if (WcOption.ucs_conv)
160 cc = wc_any_to_any_ces(cc, st);
163 cc.ccs = WC_CCS_IS_WIDE(cc.ccs) ? WC_CCS_UNKNOWN_W : WC_CCS_UNKNOWN;
170 wc_char_conv_from_hkscs(wc_uchar c, wc_status *st)
173 static wc_uchar hkscsu;
176 if (st->state == -1) {
177 st->state = WC_HKSCS_NOSTATE;
182 case WC_HKSCS_NOSTATE:
183 switch (WC_HKSCS_MAP[c]) {
187 st->state = WC_HKSCS_MBYTE1;
192 Strcat_char(os, (char)c);
196 case WC_HKSCS_MBYTE1:
197 if (WC_HKSCS_MAP[c] & LB) {
198 hkscs = ((wc_uint32)hkscsu << 8) | c;
199 if (hkscsu >= 0xA1 && hkscsu <= 0xF9 && c >= 0xA1)
200 wtf_push(os, WC_CCS_BIG5, hkscs);
202 wtf_push(os, WC_CCS_HKSCS, hkscs);