1 /* 2 * Copyright (C) 2001, 2004 Free Software Foundation, Inc. 3 * This file is part of the GNU LIBICONV Library. 4 * 5 * The GNU LIBICONV Library is free software; you can redistribute it 6 * and/or modify it under the terms of the GNU Library General Public 7 * License as published by the Free Software Foundation; either version 2 8 * of the License, or (at your option) any later version. 9 * 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 * Library General Public License for more details. 14 * 15 * You should have received a copy of the GNU Library General Public 16 * License along with the GNU LIBICONV Library; see the file COPYING.LIB. 17 * If not, write to the Free Software Foundation, Inc., 51 Franklin Street, 18 * Fifth Floor, Boston, MA 02110-1301, USA. 19 */ 20 21 /* Combining characters used in Vietnamese encodings CP1258, TCVN. */ 22 23 #ifndef _VIETCOMB_H 24 #define _VIETCOMB_H 25 26 /* Relevant combining characters: 27 0x0300, 0x0301, 0x0303, 0x0309, 0x0323. */ 28 29 /* Composition tables for each of the relevant combining characters. */ 30 static const struct { unsigned short base; unsigned short composed; } viet_comp_table_data[] = { 31 #define viet_comp_table0300_idx 0 32 #define viet_comp_table0300_len 31 33 { 0x0041, 0x00C0 }, 34 { 0x0045, 0x00C8 }, 35 { 0x0049, 0x00CC }, 36 { 0x004E, 0x01F8 }, 37 { 0x004F, 0x00D2 }, 38 { 0x0055, 0x00D9 }, 39 { 0x0057, 0x1E80 }, 40 { 0x0059, 0x1EF2 }, 41 { 0x0061, 0x00E0 }, 42 { 0x0065, 0x00E8 }, 43 { 0x0069, 0x00EC }, 44 { 0x006E, 0x01F9 }, 45 { 0x006F, 0x00F2 }, 46 { 0x0075, 0x00F9 }, 47 { 0x0077, 0x1E81 }, 48 { 0x0079, 0x1EF3 }, 49 { 0x00A8, 0x1FED }, 50 { 0x00C2, 0x1EA6 }, 51 { 0x00CA, 0x1EC0 }, 52 { 0x00D4, 0x1ED2 }, 53 { 0x00DC, 0x01DB }, 54 { 0x00E2, 0x1EA7 }, 55 { 0x00EA, 0x1EC1 }, 56 { 0x00F4, 0x1ED3 }, 57 { 0x00FC, 0x01DC }, 58 { 0x0102, 0x1EB0 }, 59 { 0x0103, 0x1EB1 }, 60 /*{ 0x0112, 0x1E14 },*/ 61 /*{ 0x0113, 0x1E15 },*/ 62 /*{ 0x014C, 0x1E50 },*/ 63 /*{ 0x014D, 0x1E51 },*/ 64 { 0x01A0, 0x1EDC }, 65 { 0x01A1, 0x1EDD }, 66 { 0x01AF, 0x1EEA }, 67 { 0x01B0, 0x1EEB }, 68 #define viet_comp_table0301_idx (viet_comp_table0300_idx+viet_comp_table0300_len) 69 #define viet_comp_table0301_len 64 70 { 0x0041, 0x00C1 }, 71 { 0x0043, 0x0106 }, 72 { 0x0045, 0x00C9 }, 73 { 0x0047, 0x01F4 }, 74 { 0x0049, 0x00CD }, 75 { 0x004B, 0x1E30 }, 76 { 0x004C, 0x0139 }, 77 { 0x004D, 0x1E3E }, 78 { 0x004E, 0x0143 }, 79 { 0x004F, 0x00D3 }, 80 { 0x0050, 0x1E54 }, 81 { 0x0052, 0x0154 }, 82 { 0x0053, 0x015A }, 83 { 0x0055, 0x00DA }, 84 { 0x0057, 0x1E82 }, 85 { 0x0059, 0x00DD }, 86 { 0x005A, 0x0179 }, 87 { 0x0061, 0x00E1 }, 88 { 0x0063, 0x0107 }, 89 { 0x0065, 0x00E9 }, 90 { 0x0067, 0x01F5 }, 91 { 0x0069, 0x00ED }, 92 { 0x006B, 0x1E31 }, 93 { 0x006C, 0x013A }, 94 { 0x006D, 0x1E3F }, 95 { 0x006E, 0x0144 }, 96 { 0x006F, 0x00F3 }, 97 { 0x0070, 0x1E55 }, 98 { 0x0072, 0x0155 }, 99 { 0x0073, 0x015B }, 100 { 0x0075, 0x00FA }, 101 { 0x0077, 0x1E83 }, 102 { 0x0079, 0x00FD }, 103 { 0x007A, 0x017A }, 104 { 0x00A5, 0x0385 }, 105 { 0x00A8, 0x1FEE }, 106 { 0x00C2, 0x1EA4 }, 107 { 0x00C5, 0x01FA }, 108 { 0x00C6, 0x01FC }, 109 { 0x00C7, 0x1E08 }, 110 { 0x00CA, 0x1EBE }, 111 { 0x00CF, 0x1E2E }, 112 { 0x00D4, 0x1ED0 }, 113 { 0x00D5, 0x1E4C }, 114 { 0x00D8, 0x01FE }, 115 { 0x00DC, 0x01D7 }, 116 { 0x00E2, 0x1EA5 }, 117 { 0x00E5, 0x01FB }, 118 { 0x00E6, 0x01FD }, 119 { 0x00E7, 0x1E09 }, 120 { 0x00EA, 0x1EBF }, 121 { 0x00EF, 0x1E2F }, 122 { 0x00F4, 0x1ED1 }, 123 { 0x00F5, 0x1E4D }, 124 { 0x00F8, 0x01FF }, 125 { 0x00FC, 0x01D8 }, 126 { 0x0102, 0x1EAE }, 127 { 0x0103, 0x1EAF }, 128 /*{ 0x0112, 0x1E16 },*/ 129 /*{ 0x0113, 0x1E17 },*/ 130 /*{ 0x014C, 0x1E52 },*/ 131 /*{ 0x014D, 0x1E53 },*/ 132 { 0x0168, 0x1E78 }, 133 { 0x0169, 0x1E79 }, 134 { 0x01A0, 0x1EDA }, 135 { 0x01A1, 0x1EDB }, 136 { 0x01AF, 0x1EE8 }, 137 { 0x01B0, 0x1EE9 }, 138 #define viet_comp_table0303_idx (viet_comp_table0301_idx+viet_comp_table0301_len) 139 #define viet_comp_table0303_len 34 140 { 0x0041, 0x00C3 }, 141 { 0x0045, 0x1EBC }, 142 { 0x0049, 0x0128 }, 143 { 0x004E, 0x00D1 }, 144 { 0x004F, 0x00D5 }, 145 { 0x0055, 0x0168 }, 146 { 0x0056, 0x1E7C }, 147 { 0x0059, 0x1EF8 }, 148 { 0x0061, 0x00E3 }, 149 { 0x0065, 0x1EBD }, 150 { 0x0069, 0x0129 }, 151 { 0x006E, 0x00F1 }, 152 { 0x006F, 0x00F5 }, 153 { 0x0075, 0x0169 }, 154 { 0x0076, 0x1E7D }, 155 { 0x0079, 0x1EF9 }, 156 { 0x00C2, 0x1EAA }, 157 { 0x00CA, 0x1EC4 }, 158 { 0x00D3, 0x1E4C }, 159 { 0x00D4, 0x1ED6 }, 160 { 0x00D6, 0x1E4E }, 161 { 0x00DA, 0x1E78 }, 162 { 0x00E2, 0x1EAB }, 163 { 0x00EA, 0x1EC5 }, 164 { 0x00F3, 0x1E4D }, 165 { 0x00F4, 0x1ED7 }, 166 { 0x00F6, 0x1E4F }, 167 { 0x00FA, 0x1E79 }, 168 { 0x0102, 0x1EB4 }, 169 { 0x0103, 0x1EB5 }, 170 { 0x01A0, 0x1EE0 }, 171 { 0x01A1, 0x1EE1 }, 172 { 0x01AF, 0x1EEE }, 173 { 0x01B0, 0x1EEF }, 174 #define viet_comp_table0309_idx (viet_comp_table0303_idx+viet_comp_table0303_len) 175 #define viet_comp_table0309_len 24 176 { 0x0041, 0x1EA2 }, 177 { 0x0045, 0x1EBA }, 178 { 0x0049, 0x1EC8 }, 179 { 0x004F, 0x1ECE }, 180 { 0x0055, 0x1EE6 }, 181 { 0x0059, 0x1EF6 }, 182 { 0x0061, 0x1EA3 }, 183 { 0x0065, 0x1EBB }, 184 { 0x0069, 0x1EC9 }, 185 { 0x006F, 0x1ECF }, 186 { 0x0075, 0x1EE7 }, 187 { 0x0079, 0x1EF7 }, 188 { 0x00C2, 0x1EA8 }, 189 { 0x00CA, 0x1EC2 }, 190 { 0x00D4, 0x1ED4 }, 191 { 0x00E2, 0x1EA9 }, 192 { 0x00EA, 0x1EC3 }, 193 { 0x00F4, 0x1ED5 }, 194 { 0x0102, 0x1EB2 }, 195 { 0x0103, 0x1EB3 }, 196 { 0x01A0, 0x1EDE }, 197 { 0x01A1, 0x1EDF }, 198 { 0x01AF, 0x1EEC }, 199 { 0x01B0, 0x1EED }, 200 #define viet_comp_table0323_idx (viet_comp_table0309_idx+viet_comp_table0309_len) 201 #define viet_comp_table0323_len 50 202 { 0x0041, 0x1EA0 }, 203 { 0x0042, 0x1E04 }, 204 { 0x0044, 0x1E0C }, 205 { 0x0045, 0x1EB8 }, 206 { 0x0048, 0x1E24 }, 207 { 0x0049, 0x1ECA }, 208 { 0x004B, 0x1E32 }, 209 { 0x004C, 0x1E36 }, 210 { 0x004D, 0x1E42 }, 211 { 0x004E, 0x1E46 }, 212 { 0x004F, 0x1ECC }, 213 { 0x0052, 0x1E5A }, 214 { 0x0053, 0x1E62 }, 215 { 0x0054, 0x1E6C }, 216 { 0x0055, 0x1EE4 }, 217 { 0x0056, 0x1E7E }, 218 { 0x0057, 0x1E88 }, 219 { 0x0059, 0x1EF4 }, 220 { 0x005A, 0x1E92 }, 221 { 0x0061, 0x1EA1 }, 222 { 0x0062, 0x1E05 }, 223 { 0x0064, 0x1E0D }, 224 { 0x0065, 0x1EB9 }, 225 { 0x0068, 0x1E25 }, 226 { 0x0069, 0x1ECB }, 227 { 0x006B, 0x1E33 }, 228 { 0x006C, 0x1E37 }, 229 { 0x006D, 0x1E43 }, 230 { 0x006E, 0x1E47 }, 231 { 0x006F, 0x1ECD }, 232 { 0x0072, 0x1E5B }, 233 { 0x0073, 0x1E63 }, 234 { 0x0074, 0x1E6D }, 235 { 0x0075, 0x1EE5 }, 236 { 0x0076, 0x1E7F }, 237 { 0x0077, 0x1E89 }, 238 { 0x0079, 0x1EF5 }, 239 { 0x007A, 0x1E93 }, 240 { 0x00C2, 0x1EAC }, 241 { 0x00CA, 0x1EC6 }, 242 { 0x00D4, 0x1ED8 }, 243 { 0x00E2, 0x1EAD }, 244 { 0x00EA, 0x1EC7 }, 245 { 0x00F4, 0x1ED9 }, 246 { 0x0102, 0x1EB6 }, 247 { 0x0103, 0x1EB7 }, 248 { 0x01A0, 0x1EE2 }, 249 { 0x01A1, 0x1EE3 }, 250 { 0x01AF, 0x1EF0 }, 251 { 0x01B0, 0x1EF1 }, 252 }; 253 static const struct { unsigned int len; unsigned int idx; } viet_comp_table[] = { 254 { viet_comp_table0300_len, viet_comp_table0300_idx }, 255 { viet_comp_table0301_len, viet_comp_table0301_idx }, 256 { viet_comp_table0303_len, viet_comp_table0303_idx }, 257 { viet_comp_table0309_len, viet_comp_table0309_idx }, 258 { viet_comp_table0323_len, viet_comp_table0323_idx }, 259 }; 260 261 /* Decomposition table for the relevant Unicode characters. */ 262 struct viet_decomp { unsigned short composed; unsigned int base : 12; int comb1 : 4; }; 263 static const struct viet_decomp viet_decomp_table[] = { 264 { 0x00B4, 0x0020, 1 }, /* compatibility decomposition - for TCVN only */ 265 { 0x00C0, 0x0041, 0 }, 266 { 0x00C1, 0x0041, 1 }, 267 { 0x00C3, 0x0041, 2 }, 268 { 0x00C8, 0x0045, 0 }, 269 { 0x00C9, 0x0045, 1 }, 270 { 0x00CC, 0x0049, 0 }, 271 { 0x00CD, 0x0049, 1 }, 272 { 0x00D1, 0x004E, 2 }, 273 { 0x00D2, 0x004F, 0 }, 274 { 0x00D3, 0x004F, 1 }, 275 { 0x00D5, 0x004F, 2 }, 276 { 0x00D9, 0x0055, 0 }, 277 { 0x00DA, 0x0055, 1 }, 278 { 0x00DD, 0x0059, 1 }, 279 { 0x00E0, 0x0061, 0 }, 280 { 0x00E1, 0x0061, 1 }, 281 { 0x00E3, 0x0061, 2 }, 282 { 0x00E8, 0x0065, 0 }, 283 { 0x00E9, 0x0065, 1 }, 284 { 0x00EC, 0x0069, 0 }, 285 { 0x00ED, 0x0069, 1 }, 286 { 0x00F1, 0x006E, 2 }, 287 { 0x00F2, 0x006F, 0 }, 288 { 0x00F3, 0x006F, 1 }, 289 { 0x00F5, 0x006F, 2 }, 290 { 0x00F9, 0x0075, 0 }, 291 { 0x00FA, 0x0075, 1 }, 292 { 0x00FD, 0x0079, 1 }, 293 { 0x0106, 0x0043, 1 }, 294 { 0x0107, 0x0063, 1 }, 295 { 0x0128, 0x0049, 2 }, 296 { 0x0129, 0x0069, 2 }, 297 { 0x0139, 0x004C, 1 }, 298 { 0x013A, 0x006C, 1 }, 299 { 0x0143, 0x004E, 1 }, 300 { 0x0144, 0x006E, 1 }, 301 { 0x0154, 0x0052, 1 }, 302 { 0x0155, 0x0072, 1 }, 303 { 0x015A, 0x0053, 1 }, 304 { 0x015B, 0x0073, 1 }, 305 { 0x0168, 0x0055, 2 }, 306 { 0x0169, 0x0075, 2 }, 307 { 0x0179, 0x005A, 1 }, 308 { 0x017A, 0x007A, 1 }, 309 { 0x01D7, 0x00DC, 1 }, 310 { 0x01D8, 0x00FC, 1 }, 311 { 0x01DB, 0x00DC, 0 }, 312 { 0x01DC, 0x00FC, 0 }, 313 { 0x01F4, 0x0047, 1 }, 314 { 0x01F5, 0x0067, 1 }, 315 { 0x01F8, 0x004E, 0 }, 316 { 0x01F9, 0x006E, 0 }, 317 { 0x01FA, 0x00C5, 1 }, 318 { 0x01FB, 0x00E5, 1 }, 319 { 0x01FC, 0x00C6, 1 }, 320 { 0x01FD, 0x00E6, 1 }, 321 { 0x01FE, 0x00D8, 1 }, 322 { 0x01FF, 0x00F8, 1 }, 323 { 0x02DC, 0x0020, 2 }, /* compatibility decomposition - for TCVN only */ 324 { 0x0385, 0x00A5, 1 }, 325 { 0x1E04, 0x0042, 4 }, 326 { 0x1E05, 0x0062, 4 }, 327 { 0x1E08, 0x00C7, 1 }, 328 { 0x1E09, 0x00E7, 1 }, 329 { 0x1E0C, 0x0044, 4 }, 330 { 0x1E0D, 0x0064, 4 }, 331 { 0x1E24, 0x0048, 4 }, 332 { 0x1E25, 0x0068, 4 }, 333 { 0x1E2E, 0x00CF, 1 }, 334 { 0x1E2F, 0x00EF, 1 }, 335 { 0x1E30, 0x004B, 1 }, 336 { 0x1E31, 0x006B, 1 }, 337 { 0x1E32, 0x004B, 4 }, 338 { 0x1E33, 0x006B, 4 }, 339 { 0x1E36, 0x004C, 4 }, 340 { 0x1E37, 0x006C, 4 }, 341 { 0x1E3E, 0x004D, 1 }, 342 { 0x1E3F, 0x006D, 1 }, 343 { 0x1E42, 0x004D, 4 }, 344 { 0x1E43, 0x006D, 4 }, 345 { 0x1E46, 0x004E, 4 }, 346 { 0x1E47, 0x006E, 4 }, 347 { 0x1E4C, 0x00D3, 2 }, /*{ 0x1E4C, 0x00D5, 1 },*/ /*{ 0x1E4C, 0x004F, 1, 2 },*/ 348 { 0x1E4D, 0x00F3, 2 }, /*{ 0x1E4D, 0x00F5, 1 },*/ /*{ 0x1E4D, 0x006F, 1, 2 },*/ 349 { 0x1E4E, 0x00D6, 2 }, 350 { 0x1E4F, 0x00F6, 2 }, 351 { 0x1E54, 0x0050, 1 }, 352 { 0x1E55, 0x0070, 1 }, 353 { 0x1E5A, 0x0052, 4 }, 354 { 0x1E5B, 0x0072, 4 }, 355 { 0x1E62, 0x0053, 4 }, 356 { 0x1E63, 0x0073, 4 }, 357 { 0x1E6C, 0x0054, 4 }, 358 { 0x1E6D, 0x0074, 4 }, 359 { 0x1E78, 0x00DA, 2 }, /*{ 0x1E78, 0x0168, 1 },*/ /*{ 0x1E78, 0x0055, 1, 2 },*/ 360 { 0x1E79, 0x00FA, 2 }, /*{ 0x1E79, 0x0169, 1 },*/ /*{ 0x1E79, 0x0075, 1, 2 },*/ 361 { 0x1E7C, 0x0056, 2 }, 362 { 0x1E7D, 0x0076, 2 }, 363 { 0x1E7E, 0x0056, 4 }, 364 { 0x1E7F, 0x0076, 4 }, 365 { 0x1E80, 0x0057, 0 }, 366 { 0x1E81, 0x0077, 0 }, 367 { 0x1E82, 0x0057, 1 }, 368 { 0x1E83, 0x0077, 1 }, 369 { 0x1E88, 0x0057, 4 }, 370 { 0x1E89, 0x0077, 4 }, 371 { 0x1E92, 0x005A, 4 }, 372 { 0x1E93, 0x007A, 4 }, 373 { 0x1EA0, 0x0041, 4 }, 374 { 0x1EA1, 0x0061, 4 }, 375 { 0x1EA2, 0x0041, 3 }, 376 { 0x1EA3, 0x0061, 3 }, 377 { 0x1EA4, 0x00C2, 1 }, 378 { 0x1EA5, 0x00E2, 1 }, 379 { 0x1EA6, 0x00C2, 0 }, 380 { 0x1EA7, 0x00E2, 0 }, 381 { 0x1EA8, 0x00C2, 3 }, 382 { 0x1EA9, 0x00E2, 3 }, 383 { 0x1EAA, 0x00C2, 2 }, 384 { 0x1EAB, 0x00E2, 2 }, 385 { 0x1EAC, 0x00C2, 4 }, 386 { 0x1EAD, 0x00E2, 4 }, 387 { 0x1EAE, 0x0102, 1 }, 388 { 0x1EAF, 0x0103, 1 }, 389 { 0x1EB0, 0x0102, 0 }, 390 { 0x1EB1, 0x0103, 0 }, 391 { 0x1EB2, 0x0102, 3 }, 392 { 0x1EB3, 0x0103, 3 }, 393 { 0x1EB4, 0x0102, 2 }, 394 { 0x1EB5, 0x0103, 2 }, 395 { 0x1EB6, 0x0102, 4 }, 396 { 0x1EB7, 0x0103, 4 }, 397 { 0x1EB8, 0x0045, 4 }, 398 { 0x1EB9, 0x0065, 4 }, 399 { 0x1EBA, 0x0045, 3 }, 400 { 0x1EBB, 0x0065, 3 }, 401 { 0x1EBC, 0x0045, 2 }, 402 { 0x1EBD, 0x0065, 2 }, 403 { 0x1EBE, 0x00CA, 1 }, 404 { 0x1EBF, 0x00EA, 1 }, 405 { 0x1EC0, 0x00CA, 0 }, 406 { 0x1EC1, 0x00EA, 0 }, 407 { 0x1EC2, 0x00CA, 3 }, 408 { 0x1EC3, 0x00EA, 3 }, 409 { 0x1EC4, 0x00CA, 2 }, 410 { 0x1EC5, 0x00EA, 2 }, 411 { 0x1EC6, 0x00CA, 4 }, 412 { 0x1EC7, 0x00EA, 4 }, 413 { 0x1EC8, 0x0049, 3 }, 414 { 0x1EC9, 0x0069, 3 }, 415 { 0x1ECA, 0x0049, 4 }, 416 { 0x1ECB, 0x0069, 4 }, 417 { 0x1ECC, 0x004F, 4 }, 418 { 0x1ECD, 0x006F, 4 }, 419 { 0x1ECE, 0x004F, 3 }, 420 { 0x1ECF, 0x006F, 3 }, 421 { 0x1ED0, 0x00D4, 1 }, 422 { 0x1ED1, 0x00F4, 1 }, 423 { 0x1ED2, 0x00D4, 0 }, 424 { 0x1ED3, 0x00F4, 0 }, 425 { 0x1ED4, 0x00D4, 3 }, 426 { 0x1ED5, 0x00F4, 3 }, 427 { 0x1ED6, 0x00D4, 2 }, 428 { 0x1ED7, 0x00F4, 2 }, 429 { 0x1ED8, 0x00D4, 4 }, 430 { 0x1ED9, 0x00F4, 4 }, 431 { 0x1EDA, 0x01A0, 1 }, 432 { 0x1EDB, 0x01A1, 1 }, 433 { 0x1EDC, 0x01A0, 0 }, 434 { 0x1EDD, 0x01A1, 0 }, 435 { 0x1EDE, 0x01A0, 3 }, 436 { 0x1EDF, 0x01A1, 3 }, 437 { 0x1EE0, 0x01A0, 2 }, 438 { 0x1EE1, 0x01A1, 2 }, 439 { 0x1EE2, 0x01A0, 4 }, 440 { 0x1EE3, 0x01A1, 4 }, 441 { 0x1EE4, 0x0055, 4 }, 442 { 0x1EE5, 0x0075, 4 }, 443 { 0x1EE6, 0x0055, 3 }, 444 { 0x1EE7, 0x0075, 3 }, 445 { 0x1EE8, 0x01AF, 1 }, 446 { 0x1EE9, 0x01B0, 1 }, 447 { 0x1EEA, 0x01AF, 0 }, 448 { 0x1EEB, 0x01B0, 0 }, 449 { 0x1EEC, 0x01AF, 3 }, 450 { 0x1EED, 0x01B0, 3 }, 451 { 0x1EEE, 0x01AF, 2 }, 452 { 0x1EEF, 0x01B0, 2 }, 453 { 0x1EF0, 0x01AF, 4 }, 454 { 0x1EF1, 0x01B0, 4 }, 455 { 0x1EF2, 0x0059, 0 }, 456 { 0x1EF3, 0x0079, 0 }, 457 { 0x1EF4, 0x0059, 4 }, 458 { 0x1EF5, 0x0079, 4 }, 459 { 0x1EF6, 0x0059, 3 }, 460 { 0x1EF7, 0x0079, 3 }, 461 { 0x1EF8, 0x0059, 2 }, 462 { 0x1EF9, 0x0079, 2 }, 463 { 0x1FED, 0x00A8, 0 }, 464 { 0x1FEE, 0x00A8, 1 }, 465 }; 466 467 #endif /* _VIETCOMB_H */ 468