2 * Copyright (C) 1999-2001, 2005, 2016 Free Software Foundation, Inc.
3 * This file is part of the GNU LIBICONV Library.
5 * The GNU LIBICONV Library is free software; you can redistribute it
6 * and/or modify it under the terms of the GNU Lesser General Public
7 * License as published by the Free Software Foundation; either version 2.1
8 * of the License, or (at your option) any later version.
10 * The GNU LIBICONV Library is distributed in the hope that it will be
11 * useful, but WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * Lesser General Public License for more details.
15 * You should have received a copy of the GNU Lesser General Public
16 * License along with the GNU LIBICONV Library; see the file COPYING.LIB.
17 * If not, see <https://www.gnu.org/licenses/>.
25 * BIG5-2003 is a slightly extended and slightly modified version of BIG5.
26 * It is actually nearer to Microsoft CP950 than to BIG5. The differences
27 * between EASTASIA/OTHER/BIG5.TXT found on ftp.unicode.org and BIG5-2003.TXT
30 * 1. Some characters in the symbols area (0xA140..0xA2CE) are defined
33 * code BIG5.TXT BIG5-2003.TXT
34 * 0xA145 0x2022 # BULLET 0x2027 # HYPHENATION POINT
35 * 0xA14E 0xFF64 # HALFWIDTH IDEOGRAPHIC COMMA
36 * 0xFE51 # SMALL IDEOGRAPHIC COMMA
37 * 0xA156 0x2013 # EN DASH 0x2015 # HORIZONTAL BAR
38 * 0xA15A --- 0x2574 # BOX DRAWINGS LIGHT LEFT
39 * 0xA1C3 --- 0xFFE3 # FULLWIDTH MACRON
40 * 0xA1C5 --- 0x02CD # MODIFIER LETTER LOW MACRON
41 * 0xA1E3 0x223C # TILDE OPERATOR 0xFF5E # FULLWIDTH TILDE
42 * 0xA1F2 0x2641 # EARTH 0x2295 # CIRCLED PLUS
43 * 0xA1F3 0x2609 # SUN 0x2299 # CIRCLED DOT OPERATOR
44 * 0xA1FE --- 0xFF0F # FULLWIDTH SOLIDUS
45 * 0xA240 --- 0xFF3C # FULLWIDTH REVERSE SOLIDUS
46 * 0xA241 0xFF0F # FULLWIDTH SOLIDUS 0x2215 # DIVISION SLASH
47 * 0xA242 0xFF3C # FULLWIDTH REVERSE SOLIDUS
48 * 0xFE68 # SMALL REVERSE SOLIDUS
49 * 0xA244 0x00A5 # YEN SIGN 0xFFE5 # FULLWIDTH YEN SIGN
50 * 0xA246 0x00A2 # CENT SIGN 0xFFE0 # FULLWIDTH CENT SIGN
51 * 0xA247 0x00A3 # POUND SIGN 0xFFE1 # FULLWIDTH POUND SIGN
52 * 0xA2A4 0x2550 # BOX DRAWINGS DOUBLE HORIZONTAL
53 * 0x2501 # BOX DRAWINGS HEAVY HORIZONTAL
54 * 0xA2A5 0x255E # BOX DRAWINGS VERTICAL SINGLE AND RIGHT DOUBLE
55 * 0x251D # BOX DRAWINGS VERTICAL LIGHT AND RIGHT HEAVY
56 * 0xA2A6 0x256A # BOX DRAWINGS VERTICAL SINGLE AND HORIZONTAL DOUBLE
57 * 0x253F # BOX DRAWINGS VERTICAL LIGHT AND HORIZONTAL HEAVY
58 * 0xA2A7 0x2561 # BOX DRAWINGS VERTICAL SINGLE AND LEFT DOUBLE
59 * 0x2525 # BOX DRAWINGS VERTICAL LIGHT AND LEFT HEAVY
60 * 0xA2CC --- 0x3038 # HANGZHOU NUMERAL TEN
61 * 0xA2CD 0x5344 0x3039 # HANGZHOU NUMERAL TWENTY
62 * 0xA2CE --- 0x303A # HANGZHOU NUMERAL THIRTY
64 * 2. A control symbols area is added:
67 * 0xA3C0..0xA3E0 U+2400..U+2421
69 * 3. The Euro sign is added:
72 * 0xA3E1 0x20AC # EURO SIGN
74 * 4. Some characters in the main area are defined differently:
76 * code BIG5.TXT BIG5-2003.TXT
77 * 0xC255 0x5F5D 0x5F5E
79 * 5. The area 0xC6A1..0xC7FE is organized differently:
82 * 0xC6A1..0xC6BE numerals (was in BIG5.TXT at 0xC7E9..0xC7FC)
83 * 0xC6BF..0xC6D7 radicals
84 * 0xC6D8..0xC6E6 rarely used symbols
85 * 0xC6E7..0xC77A hiragana (U+3041..U+3093, was in BIG5.TXT at 0xC6A5..0xC6F7)
86 * 0xC77B..0xC7F2 katakana (U+30A1..U+30F6, was in BIG5.TXT at 0xC6F8..0xC7B0)
88 * 6. Some characters are added at 0xF9D6..0xF9DC.
90 * 7. Box drawing characters are added at 0xF9DD..0xF9FE.
92 * Note: 4 of these characters are mapped in a non-inversible way, because
93 * Unicode does not yet include the corresponding characters:
95 * code Unicode approximation
96 * 0xF9FA BOX DRAWINGS DOUBLE ARC DOWN AND RIGHT 0x2554
97 * 0xF9FB BOX DRAWINGS DOUBLE ARC DOWN AND LEFT 0x2557
98 * 0xF9FC BOX DRAWINGS DOUBLE ARC UP AND RIGHT 0x255A
99 * 0xF9FD BOX DRAWINGS DOUBLE ARC UP AND LEFT 0x255D
101 * 8. Private area mappings are added:
104 * 0x{81..8D}{40..7E,A1..FE} U+EEB8..U+F6B0
105 * 0x{8E..A0}{40..7E,A1..FE} U+E311..U+EEB7
106 * 0x{FA..FE}{40..7E,A1..FE} U+E000..U+E310
108 * These mappings are not contained in the BSMI Big5-2003 standard. However,
109 * they were contained in a draft of it.
112 static const unsigned short big5_2003_2uni_pagea1
[314] = {
114 0x3000, 0xff0c, 0x3001, 0x3002, 0xff0e, 0x2027, 0xff1b, 0xff1a,
115 0xff1f, 0xff01, 0xfe30, 0x2026, 0x2025, 0xfe50, 0xfe51, 0xfe52,
116 0x00b7, 0xfe54, 0xfe55, 0xfe56, 0xfe57, 0xff5c, 0x2015, 0xfe31,
117 0x2014, 0xfe33, 0x2574, 0xfe34, 0xfe4f, 0xff08, 0xff09, 0xfe35,
118 0xfe36, 0xff5b, 0xff5d, 0xfe37, 0xfe38, 0x3014, 0x3015, 0xfe39,
119 0xfe3a, 0x3010, 0x3011, 0xfe3b, 0xfe3c, 0x300a, 0x300b, 0xfe3d,
120 0xfe3e, 0x3008, 0x3009, 0xfe3f, 0xfe40, 0x300c, 0x300d, 0xfe41,
121 0xfe42, 0x300e, 0x300f, 0xfe43, 0xfe44, 0xfe59, 0xfe5a, 0xfe5b,
122 0xfe5c, 0xfe5d, 0xfe5e, 0x2018, 0x2019, 0x201c, 0x201d, 0x301d,
123 0x301e, 0x2035, 0x2032, 0xff03, 0xff06, 0xff0a, 0x203b, 0x00a7,
124 0x3003, 0x25cb, 0x25cf, 0x25b3, 0x25b2, 0x25ce, 0x2606, 0x2605,
125 0x25c7, 0x25c6, 0x25a1, 0x25a0, 0x25bd, 0x25bc, 0x32a3, 0x2105,
126 0x203e, 0xffe3, 0xff3f, 0x02cd, 0xfe49, 0xfe4a, 0xfe4d, 0xfe4e,
127 0xfe4b, 0xfe4c, 0xfe5f, 0xfe60, 0xfe61, 0xff0b, 0xff0d, 0x00d7,
128 0x00f7, 0x00b1, 0x221a, 0xff1c, 0xff1e, 0xff1d, 0x2266, 0x2267,
129 0x2260, 0x221e, 0x2252, 0x2261, 0xfe62, 0xfe63, 0xfe64, 0xfe65,
130 0xfe66, 0xff5e, 0x2229, 0x222a, 0x22a5, 0x2220, 0x221f, 0x22bf,
131 0x33d2, 0x33d1, 0x222b, 0x222e, 0x2235, 0x2234, 0x2640, 0x2642,
132 0x2295, 0x2299, 0x2191, 0x2193, 0x2190, 0x2192, 0x2196, 0x2197,
133 0x2199, 0x2198, 0x2225, 0x2223, 0xff0f,
135 0xff3c, 0x2215, 0xfe68, 0xff04, 0xffe5, 0x3012, 0xffe0, 0xffe1,
136 0xff05, 0xff20, 0x2103, 0x2109, 0xfe69, 0xfe6a, 0xfe6b, 0x33d5,
137 0x339c, 0x339d, 0x339e, 0x33ce, 0x33a1, 0x338e, 0x338f, 0x33c4,
138 0x00b0, 0x5159, 0x515b, 0x515e, 0x515d, 0x5161, 0x5163, 0x55e7,
139 0x74e9, 0x7cce, 0x2581, 0x2582, 0x2583, 0x2584, 0x2585, 0x2586,
140 0x2587, 0x2588, 0x258f, 0x258e, 0x258d, 0x258c, 0x258b, 0x258a,
141 0x2589, 0x253c, 0x2534, 0x252c, 0x2524, 0x251c, 0x2594, 0x2500,
142 0x2502, 0x2595, 0x250c, 0x2510, 0x2514, 0x2518, 0x256d, 0x256e,
143 0x2570, 0x256f, 0x2501, 0x251d, 0x253f, 0x2525, 0x25e2, 0x25e3,
144 0x25e5, 0x25e4, 0x2571, 0x2572, 0x2573, 0xff10, 0xff11, 0xff12,
145 0xff13, 0xff14, 0xff15, 0xff16, 0xff17, 0xff18, 0xff19, 0x2160,
146 0x2161, 0x2162, 0x2163, 0x2164, 0x2165, 0x2166, 0x2167, 0x2168,
147 0x2169, 0x3021, 0x3022, 0x3023, 0x3024, 0x3025, 0x3026, 0x3027,
148 0x3028, 0x3029, 0x3038, 0x3039, 0x303a, 0xff21, 0xff22, 0xff23,
149 0xff24, 0xff25, 0xff26, 0xff27, 0xff28, 0xff29, 0xff2a, 0xff2b,
150 0xff2c, 0xff2d, 0xff2e, 0xff2f, 0xff30, 0xff31, 0xff32, 0xff33,
151 0xff34, 0xff35, 0xff36, 0xff37, 0xff38, 0xff39, 0xff3a, 0xff41,
152 0xff42, 0xff43, 0xff44, 0xff45, 0xff46, 0xff47, 0xff48, 0xff49,
153 0xff4a, 0xff4b, 0xff4c, 0xff4d, 0xff4e, 0xff4f, 0xff50, 0xff51,
154 0xff52, 0xff53, 0xff54, 0xff55, 0xff56,
157 static const unsigned short big5_2003_2uni_pagec6
[70] = {
159 0x2460, 0x2461, 0x2462, 0x2463, 0x2464, 0x2465, 0x2466, 0x2467,
160 0x2468, 0x2469, 0x2474, 0x2475, 0x2476, 0x2477, 0x2478, 0x2479,
161 0x247a, 0x247b, 0x247c, 0x247d, 0x2170, 0x2171, 0x2172, 0x2173,
162 0x2174, 0x2175, 0x2176, 0x2177, 0x2178, 0x2179, 0x2f02, 0x2f03,
163 0x2f05, 0x2f07, 0x2f0c, 0x2f0d, 0x2f0e, 0x2f13, 0x2f16, 0x2f19,
164 0x2f1b, 0x2f22, 0x2f27, 0x2f2e, 0x2f33, 0x2f34, 0x2f35, 0x2f39,
165 0x2f3a, 0x2f41, 0x2f46, 0x2f67, 0x2f68, 0x2fa1, 0x2faa, 0x00a8,
166 0xff3e, 0x30fd, 0x30fe, 0x309d, 0x309e, 0xfffd, 0xfffd, 0x3005,
167 0x3006, 0x3007, 0x30fc, 0xff3b, 0xff3d, 0x273d,
170 static const unsigned short big5_2003_2uni_pagef9
[41] = {
172 0x7881, 0x92b9, 0x88cf, 0x58bb, 0x6052, 0x7ca7, 0x5afa,
174 0x2554, 0x2566, 0x2557, 0x2560, 0x256c, 0x2563, 0x255a, 0x2569,
175 0x255d, 0x2552, 0x2564, 0x2555, 0x255e, 0x256a, 0x2561, 0x2558,
176 0x2567, 0x255b, 0x2553, 0x2565, 0x2556, 0x255f, 0x256b, 0x2562,
177 0x2559, 0x2568, 0x255c, 0x2551, 0x2550,
178 0x2554, 0x2557, 0x255a, 0x255d, /* not invertible */
183 big5_2003_mbtowc (conv_t conv
, ucs4_t
*pwc
, const unsigned char *s
, size_t n
)
185 unsigned char c
= *s
;
186 /* Code set 0 (ASCII) */
188 return ascii_mbtowc(conv
,pwc
,s
,n
);
189 /* Code set 1 (BIG5 extended) */
190 if (c
>= 0x81 && c
< 0xff) {
192 return RET_TOOFEW(0);
194 unsigned char c2
= s
[1];
195 if ((c2
>= 0x40 && c2
< 0x7f) || (c2
>= 0xa1 && c2
< 0xff)) {
198 unsigned int i
= 157 * (c
- 0xa1) + (c2
- (c2
>= 0xa1 ? 0x62 : 0x40));
199 unsigned short wc
= big5_2003_2uni_pagea1
[i
];
205 if (!((c
== 0xc6 && c2
>= 0xa1) || c
== 0xc7)) {
206 if (!(c
== 0xc2 && c2
== 0x55)) {
207 int ret
= big5_mbtowc(conv
,pwc
,s
,2);
208 if (ret
!= RET_ILSEQ
)
211 if (c2
>= 0xc0 && c2
<= 0xe1) {
212 *pwc
= (c2
== 0xe1 ? 0x20ac : c2
== 0xe0 ? 0x2421 : 0x2340 + c2
);
215 } else if (c
== 0xf9) {
217 *pwc
= big5_2003_2uni_pagef9
[c2
-0xd6];
220 } else if (c
>= 0xfa) {
221 *pwc
= 0xe000 + 157 * (c
- 0xfa) + (c2
- (c2
>= 0xa1 ? 0x62 : 0x40));
225 /* c == 0xc2 && c2 == 0x55. */
230 /* (c == 0xc6 && c2 >= 0xa1) || c == 0xc7. */
231 unsigned int i
= 157 * (c
- 0xc6) + (c2
- (c2
>= 0xa1 ? 0x62 : 0x40));
234 unsigned short wc
= big5_2003_2uni_pagec6
[i
-63];
239 } else if (i
< 216) {
240 /* 133 <= i < 216. Hiragana. */
241 *pwc
= 0x3041 - 133 + i
;
243 } else if (i
< 302) {
244 /* 216 <= i < 302. Katakana. */
245 *pwc
= 0x30a1 - 216 + i
;
250 /* 0x81 <= c < 0xa1. */
251 *pwc
= (c
>= 0x8e ? 0xdb18 : 0xeeb8) + 157 * (c
- 0x81)
252 + (c2
- (c2
>= 0xa1 ? 0x62 : 0x40));
261 static const unsigned char big5_2003_2charset_page25
[29] = {
263 0xf9, 0xf8, 0xe6, 0xef, 0xdd, 0xe8, 0xf1, 0xdf,
264 0xec, 0xf5, 0xe3, 0xee, 0xf7, 0xe5, 0xe9, 0xf2,
265 0xe0, 0xeb, 0xf4, 0xe2, 0xe7, 0xf0, 0xde, 0xed,
266 0xf6, 0xe4, 0xea, 0xf3, 0xe1,
270 big5_2003_wctomb (conv_t conv
, unsigned char *r
, ucs4_t wc
, size_t n
)
272 unsigned char buf
[2];
275 /* Code set 0 (ASCII) */
276 ret
= ascii_wctomb(conv
,r
,wc
,n
);
277 if (ret
!= RET_ILUNI
)
280 /* Code set 1 (BIG5 extended) */
283 if (wc
== 0x00a8) { buf
[0] = 0xc6; buf
[1] = 0xd8; ret
= 2; break; }
284 if (wc
== 0x00a2 || wc
== 0x00a3 || wc
== 0x00a5)
288 if (wc
== 0x02cd) { buf
[0] = 0xa1; buf
[1] = 0xc5; ret
= 2; break; }
293 if (wc
== 0x2015) { buf
[0] = 0xa1; buf
[1] = 0x56; ret
= 2; break; }
294 if (wc
== 0x2027) { buf
[0] = 0xa1; buf
[1] = 0x45; ret
= 2; break; }
295 if (wc
== 0x20ac) { buf
[0] = 0xa3; buf
[1] = 0xe1; ret
= 2; break; }
296 if (wc
== 0x2013 || wc
== 0x2022)
300 if (wc
>= 0x2170 && wc
<= 0x2179) {
301 buf
[0] = 0xc6; buf
[1] = wc
- 0x20bb; ret
= 2;
306 if (wc
== 0x2215) { buf
[0] = 0xa2; buf
[1] = 0x41; ret
= 2; break; }
307 if (wc
== 0x2295) { buf
[0] = 0xa1; buf
[1] = 0xf2; ret
= 2; break; }
308 if (wc
== 0x2299) { buf
[0] = 0xa1; buf
[1] = 0xf3; ret
= 2; break; }
313 if (wc
<= 0x241f) { buf
[0] = 0xa3; buf
[1] = wc
- 0x2340; ret
= 2; break; }
314 if (wc
== 0x2421) { buf
[0] = 0xa3; buf
[1] = 0xe0; ret
= 2; break; }
315 if (wc
>= 0x2460 && wc
<= 0x2469) {
316 buf
[0] = 0xc6; buf
[1] = wc
- 0x23bf; ret
= 2;
319 if (wc
>= 0x2474 && wc
<= 0x247d) {
320 buf
[0] = 0xc6; buf
[1] = wc
- 0x23c9; ret
= 2;
325 if (wc
== 0x2501) { buf
[0] = 0xa2; buf
[1] = 0xa4; ret
= 2; break; }
326 if (wc
== 0x251d) { buf
[0] = 0xa2; buf
[1] = 0xa5; ret
= 2; break; }
327 if (wc
== 0x2525) { buf
[0] = 0xa2; buf
[1] = 0xa7; ret
= 2; break; }
328 if (wc
== 0x253f) { buf
[0] = 0xa2; buf
[1] = 0xa6; ret
= 2; break; }
329 if (wc
>= 0x2550 && wc
<= 0x256c) {
330 buf
[0] = 0xf9; buf
[1] = big5_2003_2charset_page25
[wc
-0x2550]; ret
= 2;
333 if (wc
== 0x2574) { buf
[0] = 0xa1; buf
[1] = 0x5a; ret
= 2; break; }
334 if (wc
== 0x2593) { buf
[0] = 0xf9; buf
[1] = 0xfe; ret
= 2; break; }
337 if (wc
== 0x2609 || wc
== 0x2641)
341 if (wc
== 0x273d) { buf
[0] = 0xc6; buf
[1] = 0xe6; ret
= 2; break; }
344 if (wc
== 0x2f02) { buf
[0] = 0xc6; buf
[1] = 0xbf; ret
= 2; break; }
345 if (wc
== 0x2f03) { buf
[0] = 0xc6; buf
[1] = 0xc0; ret
= 2; break; }
346 if (wc
== 0x2f05) { buf
[0] = 0xc6; buf
[1] = 0xc1; ret
= 2; break; }
347 if (wc
== 0x2f07) { buf
[0] = 0xc6; buf
[1] = 0xc2; ret
= 2; break; }
348 if (wc
== 0x2f0c) { buf
[0] = 0xc6; buf
[1] = 0xc3; ret
= 2; break; }
349 if (wc
== 0x2f0d) { buf
[0] = 0xc6; buf
[1] = 0xc4; ret
= 2; break; }
350 if (wc
== 0x2f0e) { buf
[0] = 0xc6; buf
[1] = 0xc5; ret
= 2; break; }
351 if (wc
== 0x2f13) { buf
[0] = 0xc6; buf
[1] = 0xc6; ret
= 2; break; }
352 if (wc
== 0x2f16) { buf
[0] = 0xc6; buf
[1] = 0xc7; ret
= 2; break; }
353 if (wc
== 0x2f19) { buf
[0] = 0xc6; buf
[1] = 0xc8; ret
= 2; break; }
354 if (wc
== 0x2f1b) { buf
[0] = 0xc6; buf
[1] = 0xc9; ret
= 2; break; }
355 if (wc
== 0x2f22) { buf
[0] = 0xc6; buf
[1] = 0xca; ret
= 2; break; }
356 if (wc
== 0x2f27) { buf
[0] = 0xc6; buf
[1] = 0xcb; ret
= 2; break; }
357 if (wc
== 0x2f2e) { buf
[0] = 0xc6; buf
[1] = 0xcc; ret
= 2; break; }
358 if (wc
== 0x2f33) { buf
[0] = 0xc6; buf
[1] = 0xcd; ret
= 2; break; }
359 if (wc
== 0x2f34) { buf
[0] = 0xc6; buf
[1] = 0xce; ret
= 2; break; }
360 if (wc
== 0x2f35) { buf
[0] = 0xc6; buf
[1] = 0xcf; ret
= 2; break; }
361 if (wc
== 0x2f39) { buf
[0] = 0xc6; buf
[1] = 0xd0; ret
= 2; break; }
362 if (wc
== 0x2f3a) { buf
[0] = 0xc6; buf
[1] = 0xd1; ret
= 2; break; }
363 if (wc
== 0x2f41) { buf
[0] = 0xc6; buf
[1] = 0xd2; ret
= 2; break; }
364 if (wc
== 0x2f46) { buf
[0] = 0xc6; buf
[1] = 0xd3; ret
= 2; break; }
365 if (wc
== 0x2f67) { buf
[0] = 0xc6; buf
[1] = 0xd4; ret
= 2; break; }
366 if (wc
== 0x2f68) { buf
[0] = 0xc6; buf
[1] = 0xd5; ret
= 2; break; }
367 if (wc
== 0x2fa1) { buf
[0] = 0xc6; buf
[1] = 0xd6; ret
= 2; break; }
368 if (wc
== 0x2faa) { buf
[0] = 0xc6; buf
[1] = 0xd7; ret
= 2; break; }
371 if (wc
>= 0x3005 && wc
<= 0x3007) {
372 buf
[0] = 0xc6; buf
[1] = wc
- 0x2f25; ret
= 2;
375 if (wc
>= 0x3038 && wc
<= 0x303a) {
376 buf
[0] = 0xa2; buf
[1] = wc
- 0x2f6c; ret
= 2;
379 if (wc
>= 0x3041 && wc
<= 0x3093) {
381 buf
[0] = 0xc6; buf
[1] = wc
- 0x2f5a;
383 buf
[0] = 0xc7; buf
[1] = wc
- 0x3019;
388 if (wc
== 0x309d) { buf
[0] = 0xc6; buf
[1] = 0xdc; ret
= 2; break; }
389 if (wc
== 0x309e) { buf
[0] = 0xc6; buf
[1] = 0xdd; ret
= 2; break; }
390 if (wc
>= 0x30a1 && wc
<= 0x30f6) {
391 buf
[0] = 0xc7; buf
[1] = wc
- (wc
< 0x30a5 ? 0x3026 : 0x3004); ret
= 2;
394 if (wc
== 0x30fc) { buf
[0] = 0xc6; buf
[1] = 0xe3; ret
= 2; break; }
395 if (wc
== 0x30fd) { buf
[0] = 0xc6; buf
[1] = 0xda; ret
= 2; break; }
396 if (wc
== 0x30fe) { buf
[0] = 0xc6; buf
[1] = 0xdb; ret
= 2; break; }
403 if (wc
== 0x58bb) { buf
[0] = 0xf9; buf
[1] = 0xd9; ret
= 2; break; }
406 if (wc
== 0x5afa) { buf
[0] = 0xf9; buf
[1] = 0xdc; ret
= 2; break; }
409 if (wc
== 0x5f5e) { buf
[0] = 0xc2; buf
[1] = 0x55; ret
= 2; break; }
414 if (wc
== 0x6052) { buf
[0] = 0xf9; buf
[1] = 0xda; ret
= 2; break; }
417 if (wc
== 0x7881) { buf
[0] = 0xf9; buf
[1] = 0xd6; ret
= 2; break; }
420 if (wc
== 0x7ca7) { buf
[0] = 0xf9; buf
[1] = 0xdb; ret
= 2; break; }
423 if (wc
== 0x88cf) { buf
[0] = 0xf9; buf
[1] = 0xd8; ret
= 2; break; }
426 if (wc
== 0x92b9) { buf
[0] = 0xf9; buf
[1] = 0xd7; ret
= 2; break; }
428 case 0xe0: case 0xe1: case 0xe2: case 0xe3: case 0xe4: case 0xe5:
429 case 0xe6: case 0xe7: case 0xe8: case 0xe9: case 0xea: case 0xeb:
430 case 0xec: case 0xed: case 0xee: case 0xef: case 0xf0: case 0xf1:
431 case 0xf2: case 0xf3: case 0xf4: case 0xf5: case 0xf6:
433 unsigned int i
= wc
- 0xe000;
435 unsigned int c1
= i
/ 157;
436 unsigned int c2
= i
% 157;
437 buf
[0] = c1
+ (c1
< 5 ? 0xfa : c1
< 24 ? 0x89 : 0x69);
438 buf
[1] = c2
+ (c2
< 0x3f ? 0x40 : 0x62);
445 if (wc
== 0xfe51) { buf
[0] = 0xa1; buf
[1] = 0x4e; ret
= 2; break; }
446 if (wc
== 0xfe68) { buf
[0] = 0xa2; buf
[1] = 0x42; ret
= 2; break; }
449 if (wc
== 0xff0f) { buf
[0] = 0xa1; buf
[1] = 0xfe; ret
= 2; break; }
450 if (wc
== 0xff3b) { buf
[0] = 0xc6; buf
[1] = 0xe4; ret
= 2; break; }
451 if (wc
== 0xff3c) { buf
[0] = 0xa2; buf
[1] = 0x40; ret
= 2; break; }
452 if (wc
== 0xff3d) { buf
[0] = 0xc6; buf
[1] = 0xe5; ret
= 2; break; }
453 if (wc
== 0xff3e) { buf
[0] = 0xc6; buf
[1] = 0xd9; ret
= 2; break; }
454 if (wc
== 0xff5e) { buf
[0] = 0xa1; buf
[1] = 0xe3; ret
= 2; break; }
455 if (wc
== 0xffe0) { buf
[0] = 0xa2; buf
[1] = 0x46; ret
= 2; break; }
456 if (wc
== 0xffe1) { buf
[0] = 0xa2; buf
[1] = 0x47; ret
= 2; break; }
457 if (wc
== 0xffe3) { buf
[0] = 0xa1; buf
[1] = 0xc3; ret
= 2; break; }
458 if (wc
== 0xffe5) { buf
[0] = 0xa2; buf
[1] = 0x44; ret
= 2; break; }
463 if (ret
== RET_ILUNI
)
464 ret
= big5_wctomb(conv
,buf
,wc
,2);
465 if (ret
!= RET_ILUNI
) {
466 if (ret
!= 2) abort();