1 /*
2 * CDDL HEADER START
3 *
4 * The contents of this file are subject to the terms of the
5 * Common Development and Distribution License (the "License").
6 * You may not use this file except in compliance with the License.
7 *
8 * You can obtain a copy of the license at src/OPENSOLARIS.LICENSE
9 * or http://www.opensolaris.org/os/licensing.
10 * See the License for the specific language governing permissions
11 * and limitations under the License.
12 *
13 * When distributing Covered Code, include this CDDL HEADER in each
14 * file and include the License file at src/OPENSOLARIS.LICENSE.
15 * If applicable, add the following below this CDDL HEADER, with the
16 * fields enclosed by brackets "[]" replaced with your own identifying
17 * information: Portions Copyright [yyyy] [name of copyright owner]
18 *
19 * CDDL HEADER END
20 */
21 /*
22 * COPYRIGHT AND PERMISSION NOTICE
23 *
24 * Copyright (c) 1991-2005 Unicode, Inc. All rights reserved. Distributed
25 * under the Terms of Use in http://www.unicode.org/copyright.html.
26 *
27 * This file has been modified by Sun Microsystems, Inc.
28 *
29 */
30 /*
31 * Copyright(c) 2008 Sun Microsystems, Inc.
32 * All rights reserved.
33 */
34
35 #ifndef _UNICODE_TCVN_H_
36 #define _UNICODE_TCVN_H_
37
38
39 static const unsigned long tcvn2uni_1[32] = {
40 /*
41 * 0x00 - Ox17
42 */
43 0x0000, 0x00DA, 0x1EE4, 0x0003, 0x1EEA, 0x1EEC, 0x1EEE, 0x0007,
44 0x0008, 0x0009, 0x000A, 0x000B, 0x000C, 0x000D, 0x000E, 0x000F,
45 0x0010, 0x1EE8, 0x1EF0, 0x1EF2, 0x1EF6, 0x1EF8, 0x00DD, 0x1EF4,
46 };
47
48
49 static const unsigned long tcvn2uni_2[128] = {
50 /*
51 * 0x80 - Oxff
52 */
53 0x00C0, 0x1EA2, 0x00C3, 0x00C1, 0x1EA0, 0x1EB6, 0x1EAC, 0x00C8,
54 0x1EBA, 0x1EBC, 0x00C9, 0x1EB8, 0x1EC6, 0x00CC, 0x1EC8, 0x0128,
55 0x00CD, 0x1ECA, 0x00D2, 0x1ECE, 0x00D5, 0x00D3, 0x1ECC, 0x1ED8,
56 0x1EDC, 0x1EDE, 0x1EE0, 0x1EDA, 0x1EE2, 0x00D9, 0x1EE6, 0x0168,
57 0x00A0, 0x0102, 0x00C2, 0x00CA, 0x00D4, 0x01A0, 0x01AF, 0x0110,
58 0x0103, 0x00E2, 0x00EA, 0x00F4, 0x01A1, 0x01B0, 0x0111, 0x1EB0,
59 0x0300, 0x0309, 0x0303, 0x0301, 0x0323, 0x00E0, 0x1EA3, 0x00E3,
60 0x00E1, 0x1EA1, 0x1EB2, 0x1EB1, 0x1EB3, 0x1EB5, 0x1EAF, 0x1EB4,
61 0x1EAE, 0x1EA6, 0x1EA8, 0x1EAA, 0x1EA4, 0x1EC0, 0x1EB7, 0x1EA7,
62 0x1EA9, 0x1EAB, 0x1EA5, 0x1EAD, 0x00E8, 0x1EC2, 0x1EBB, 0x1EBD,
63 0x00E9, 0x1EB9, 0x1EC1, 0x1EC3, 0x1EC5, 0x1EBF, 0x1EC7, 0x00EC,
64 0x1EC9, 0x1EC4, 0x1EBE, 0x1ED2, 0x0129, 0x00ED, 0x1ECB, 0x00F2,
65 0x1ED4, 0x1ECF, 0x00F5, 0x00F3, 0x1ECD, 0x1ED3, 0x1ED5, 0x1ED7,
66 0x1ED1, 0x1ED9, 0x1EDD, 0x1EDF, 0x1EE1, 0x1EDB, 0x1EE3, 0x00F9,
67 0x1ED6, 0x1EE7, 0x0169, 0x00FA, 0x1EE5, 0x1EEB, 0x1EED, 0x1EEF,
68 0x1EE9, 0x1EF1, 0x1EF3, 0x1EF7, 0x1EF9, 0x00FD, 0x1EF5, 0x1ED0,
69 };
70
71 #ifdef __NEED_TCVN_2_UNI__
tcvn_2_uni(const unsigned char * in,unsigned long * out)72 static int tcvn_2_uni(const unsigned char *in, unsigned long *out )
73 {
74 unsigned char c = *in;
75
76 if (c < 0x18)
77 *out = tcvn2uni_1[c];
78 else if (c < 0x80)
79 *out = c;
80 else
81 *out = tcvn2uni_2[c-0x80];
82
83 return 1;
84 }
85 #endif /* __NEED_TCVN_2_UNI__ */
86
87 static const unsigned char uni2tcvn_1[280] = {
88 0xa0, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
89 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
90 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
91 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
92 0x80, 0x83, 0xa2, 0x82, 0x00, 0x00, 0x00, 0x00,
93 0x87, 0x8a, 0xa3, 0x00, 0x8d, 0x90, 0x00, 0x00,
94 0x00, 0x00, 0x92, 0x95, 0xa4, 0x94, 0x00, 0x00,
95 0x00, 0x9d, 0x01, 0x00, 0x00, 0x16, 0x00, 0x00,
96 0xb5, 0xb8, 0xa9, 0xb7, 0x00, 0x00, 0x00, 0x00,
97 0xcc, 0xd0, 0xaa, 0x00, 0xd7, 0xdd, 0x00, 0x00,
98 0x00, 0x00, 0xdf, 0xe3, 0xab, 0xe2, 0x00, 0x00,
99 0x00, 0xef, 0xf3, 0x00, 0x00, 0xfd, 0x00, 0x00,
100 0x00, 0x00, 0xa1, 0xa8, 0x00, 0x00, 0x00, 0x00,
101 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
102 0xa7, 0xae, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
103 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
104 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
105 0x8f, 0xdc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
106 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
107 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
108 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
109 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
110 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
111 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
112 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
113 0x9f, 0xf2, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
114 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
115 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
116 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
117 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
118 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
119 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
120 0xa5, 0xac, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
121 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0xa6,
122 0xad, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
123 };
124
125 static const unsigned char uni2tcvn_2[40] = {
126 0xb0, 0xb3, 0x00, 0xb2, 0x00, 0x00, 0x00, 0x00,
127 0x00, 0xb1, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
128 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
129 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
130 0x00, 0x00, 0x00, 0xb4, 0x00, 0x00, 0x00, 0x00,
131 };
132 static const unsigned char uni2tcvn_3[96] = {
133 0x84, 0xb9, 0x81, 0xb6, 0xc4, 0xca, 0xc1, 0xc7,
134 0xc2, 0xc8, 0xc3, 0xc9, 0x86, 0xcb, 0xc0, 0xbe,
135 0xaf, 0xbb, 0xba, 0xbc, 0xbf, 0xbd, 0x85, 0xc6,
136 0x8b, 0xd1, 0x88, 0xce, 0x89, 0xcf, 0xda, 0xd5,
137 0xc5, 0xd2, 0xcd, 0xd3, 0xd9, 0xd4, 0x8c, 0xd6,
138 0x8e, 0xd8, 0x91, 0xde, 0x96, 0xe4, 0x93, 0xe1,
139 0xff, 0xe8, 0xdb, 0xe5, 0xe0, 0xe6, 0xf0, 0xe7,
140 0x97, 0xe9, 0x9b, 0xed, 0x98, 0xea, 0x99, 0xeb,
141 0x9a, 0xec, 0x9c, 0xee, 0x02, 0xf4, 0x9e, 0xf1,
142 0x11, 0xf8, 0x04, 0xf5, 0x05, 0xf6, 0x06, 0xf7,
143 0x12, 0xf9, 0x13, 0xfa, 0x17, 0xfe, 0x14, 0xfb,
144 0x15, 0xfc, 0x00, 0x00, 0x00, 0x00, 0x00, 0x00,
145 };
146
147 #ifdef __NEED_UNI_2_TCVN__
uni_2_tcvn(unsigned long in,unsigned char * out)148 static int uni_2_tcvn (unsigned long in, unsigned char *out)
149 {
150 unsigned char c = 0;
151
152 if (in < 0x0080 && (in >= 0x0020 || (0xFF01FF89 & (1 << in)) )) {
153 /* Bit mask, bit 1 means there have valid unicode value.
154 * 0xFF01FF89 = 1111 1111 0000 0001 1111 1111 1000 1001
155 */
156 *out = in;
157 return 1;
158 } else if (in >= 0x00a0 && in < 0x01b8)
159 c = uni2tcvn_1[in-0x00a0];
160 else if (in >= 0x0300 && in < 0x0328)
161 c = uni2tcvn_2[in-0x0300];
162 else if (in >= 0x1ea0 && in < 0x1f00)
163 c = uni2tcvn_3[in-0x1ea0];
164
165 if (c != 0) {
166 *out = c;
167 return 1;
168 }
169
170 return 0;
171 }
172 #endif /* __NEED_UNI_2_TCVN__ */
173
174 #endif
175