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__ 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__ 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