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 usr/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 usr/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 2007 Sun Microsystems, Inc.  All rights reserved.
  23  * Use is subject to license terms.
  24  */
  25 /*
  26  * ICU License - ICU 1.8.1 and later
  27  *
  28  * COPYRIGHT AND PERMISSION NOTICE
  29  *
  30  * Copyright (c) 1995-2006 International Business Machines Corporation and
  31  * others
  32  *
  33  * All rights reserved.
  34  *
  35  * Permission is hereby granted, free of charge, to any person obtaining a
  36  * copy of this software and associated documentation files (the
  37  * "Software"), to deal in the Software without restriction, including
  38  * without limitation the rights to use, copy, modify, merge, publish,
  39  * distribute, and/or sell copies of the Software, and to permit persons
  40  * to whom the Software is furnished to do so, provided that the above
  41  * copyright notice(s) and this permission notice appear in all copies of
  42  * the Software and that both the above copyright notice(s) and this
  43  * permission notice appear in supporting documentation.
  44  *
  45  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS
  46  * OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
  47  * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT
  48  * OF THIRD PARTY RIGHTS. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR
  49  * HOLDERS INCLUDED IN THIS NOTICE BE LIABLE FOR ANY CLAIM, OR ANY SPECIAL
  50  * INDIRECT OR CONSEQUENTIAL DAMAGES, OR ANY DAMAGES WHATSOEVER RESULTING
  51  * FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN ACTION OF CONTRACT,
  52  * NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF OR IN CONNECTION
  53  * WITH THE USE OR PERFORMANCE OF THIS SOFTWARE.
  54  *
  55  * Except as contained in this notice, the name of a copyright holder
  56  * shall not be used in advertising or otherwise to promote the sale, use
  57  * or other dealings in this Software without prior written authorization
  58  * of the copyright holder.
  59  *
  60  * -----------------------------------------------------------------------------
  61  * All trademarks and registered trademarks mentioned herein are the property of
  62  * their respective owners.
  63  */
  64 /*
  65  * This file has been modified by Sun Microsystems, Inc.
  66  */
  67 
  68 #ifndef _SYS_KICONV_EMEA2_H
  69 #define _SYS_KICONV_EMEA2_H
  70 
  71 #pragma ident   "%Z%%M% %I%     %E% SMI"
  72 
  73 #ifdef __cplusplus
  74 extern "C" {
  75 #endif
  76 
  77 #include <sys/kiconv.h>
  78 
  79 #ifdef  _KERNEL
  80 
  81 /*
  82  * Mapping tables from CP720 to UTF-8.
  83  *
  84  * Indices are calculated by subtracting 0x80 from single byte character code
  85  * values.
  86  *
  87  * Each component has up to three UTF-8 character bytes; the first byte will
  88  * be used to figure out on how many bytes should be taken. If size figured
  89  * out has a value less than zero, that means that component isn't valid and
  90  * has no assigned character.
  91  *
  92  * We only provide mappings that will guarantee exact 1-to-1 roundtrip code
  93  * conversions for the maximum compatibility with previous CP720 conversions
  94  * in our storage products. (The same also goes to the other table at below.)
  95  */
  96 static const kiconv_to_utf8_tbl_comp_t cp720_to_u8_tbl[128] = {
  97         { 0xC2, 0x80, 0x00 },   /* 0x80 */
  98         { 0xC2, 0x81, 0x00 },   /* 0x81 */
  99         { 0xC3, 0xA9, 0x00 },   /* 0x82 */
 100         { 0xC3, 0xA2, 0x00 },   /* 0x83 */
 101         { 0xC2, 0x84, 0x00 },   /* 0x84 */
 102         { 0xC3, 0xA0, 0x00 },   /* 0x85 */
 103         { 0xC2, 0x86, 0x00 },   /* 0x86 */
 104         { 0xC3, 0xA7, 0x00 },   /* 0x87 */
 105         { 0xC3, 0xAA, 0x00 },   /* 0x88 */
 106         { 0xC3, 0xAB, 0x00 },   /* 0x89 */
 107         { 0xC3, 0xA8, 0x00 },   /* 0x8A */
 108         { 0xC3, 0xAF, 0x00 },   /* 0x8B */
 109         { 0xC3, 0xAE, 0x00 },   /* 0x8C */
 110         { 0xC2, 0x8D, 0x00 },   /* 0x8D */
 111         { 0xC2, 0x8E, 0x00 },   /* 0x8E */
 112         { 0xC2, 0x8F, 0x00 },   /* 0x8F */
 113         { 0xC2, 0x90, 0x00 },   /* 0x90 */
 114         { 0xD9, 0x91, 0x00 },   /* 0x91 */
 115         { 0xD9, 0x92, 0x00 },   /* 0x92 */
 116         { 0xC3, 0xB4, 0x00 },   /* 0x93 */
 117         { 0xC2, 0xA4, 0x00 },   /* 0x94 */
 118         { 0xD9, 0x80, 0x00 },   /* 0x95 */
 119         { 0xC3, 0xBB, 0x00 },   /* 0x96 */
 120         { 0xC3, 0xB9, 0x00 },   /* 0x97 */
 121         { 0xD8, 0xA1, 0x00 },   /* 0x98 */
 122         { 0xD8, 0xA2, 0x00 },   /* 0x99 */
 123         { 0xD8, 0xA3, 0x00 },   /* 0x9A */
 124         { 0xD8, 0xA4, 0x00 },   /* 0x9B */
 125         { 0xC2, 0xA3, 0x00 },   /* 0x9C */
 126         { 0xD8, 0xA5, 0x00 },   /* 0x9D */
 127         { 0xD8, 0xA6, 0x00 },   /* 0x9E */
 128         { 0xD8, 0xA7, 0x00 },   /* 0x9F */
 129         { 0xD8, 0xA8, 0x00 },   /* 0xA0 */
 130         { 0xD8, 0xA9, 0x00 },   /* 0xA1 */
 131         { 0xD8, 0xAA, 0x00 },   /* 0xA2 */
 132         { 0xD8, 0xAB, 0x00 },   /* 0xA3 */
 133         { 0xD8, 0xAC, 0x00 },   /* 0xA4 */
 134         { 0xD8, 0xAD, 0x00 },   /* 0xA5 */
 135         { 0xD8, 0xAE, 0x00 },   /* 0xA6 */
 136         { 0xD8, 0xAF, 0x00 },   /* 0xA7 */
 137         { 0xD8, 0xB0, 0x00 },   /* 0xA8 */
 138         { 0xD8, 0xB1, 0x00 },   /* 0xA9 */
 139         { 0xD8, 0xB2, 0x00 },   /* 0xAA */
 140         { 0xD8, 0xB3, 0x00 },   /* 0xAB */
 141         { 0xD8, 0xB4, 0x00 },   /* 0xAC */
 142         { 0xD8, 0xB5, 0x00 },   /* 0xAD */
 143         { 0xC2, 0xAB, 0x00 },   /* 0xAE */
 144         { 0xC2, 0xBB, 0x00 },   /* 0xAF */
 145         { 0xE2, 0x96, 0x91 },   /* 0xB0 */
 146         { 0xE2, 0x96, 0x92 },   /* 0xB1 */
 147         { 0xE2, 0x96, 0x93 },   /* 0xB2 */
 148         { 0xE2, 0x94, 0x82 },   /* 0xB3 */
 149         { 0xE2, 0x94, 0xA4 },   /* 0xB4 */
 150         { 0xE2, 0x95, 0xA1 },   /* 0xB5 */
 151         { 0xE2, 0x95, 0xA2 },   /* 0xB6 */
 152         { 0xE2, 0x95, 0x96 },   /* 0xB7 */
 153         { 0xE2, 0x95, 0x95 },   /* 0xB8 */
 154         { 0xE2, 0x95, 0xA3 },   /* 0xB9 */
 155         { 0xE2, 0x95, 0x91 },   /* 0xBA */
 156         { 0xE2, 0x95, 0x97 },   /* 0xBB */
 157         { 0xE2, 0x95, 0x9D },   /* 0xBC */
 158         { 0xE2, 0x95, 0x9C },   /* 0xBD */
 159         { 0xE2, 0x95, 0x9B },   /* 0xBE */
 160         { 0xE2, 0x94, 0x90 },   /* 0xBF */
 161         { 0xE2, 0x94, 0x94 },   /* 0xC0 */
 162         { 0xE2, 0x94, 0xB4 },   /* 0xC1 */
 163         { 0xE2, 0x94, 0xAC },   /* 0xC2 */
 164         { 0xE2, 0x94, 0x9C },   /* 0xC3 */
 165         { 0xE2, 0x94, 0x80 },   /* 0xC4 */
 166         { 0xE2, 0x94, 0xBC },   /* 0xC5 */
 167         { 0xE2, 0x95, 0x9E },   /* 0xC6 */
 168         { 0xE2, 0x95, 0x9F },   /* 0xC7 */
 169         { 0xE2, 0x95, 0x9A },   /* 0xC8 */
 170         { 0xE2, 0x95, 0x94 },   /* 0xC9 */
 171         { 0xE2, 0x95, 0xA9 },   /* 0xCA */
 172         { 0xE2, 0x95, 0xA6 },   /* 0xCB */
 173         { 0xE2, 0x95, 0xA0 },   /* 0xCC */
 174         { 0xE2, 0x95, 0x90 },   /* 0xCD */
 175         { 0xE2, 0x95, 0xAC },   /* 0xCE */
 176         { 0xE2, 0x95, 0xA7 },   /* 0xCF */
 177         { 0xE2, 0x95, 0xA8 },   /* 0xD0 */
 178         { 0xE2, 0x95, 0xA4 },   /* 0xD1 */
 179         { 0xE2, 0x95, 0xA5 },   /* 0xD2 */
 180         { 0xE2, 0x95, 0x99 },   /* 0xD3 */
 181         { 0xE2, 0x95, 0x98 },   /* 0xD4 */
 182         { 0xE2, 0x95, 0x92 },   /* 0xD5 */
 183         { 0xE2, 0x95, 0x93 },   /* 0xD6 */
 184         { 0xE2, 0x95, 0xAB },   /* 0xD7 */
 185         { 0xE2, 0x95, 0xAA },   /* 0xD8 */
 186         { 0xE2, 0x94, 0x98 },   /* 0xD9 */
 187         { 0xE2, 0x94, 0x8C },   /* 0xDA */
 188         { 0xE2, 0x96, 0x88 },   /* 0xDB */
 189         { 0xE2, 0x96, 0x84 },   /* 0xDC */
 190         { 0xE2, 0x96, 0x8C },   /* 0xDD */
 191         { 0xE2, 0x96, 0x90 },   /* 0xDE */
 192         { 0xE2, 0x96, 0x80 },   /* 0xDF */
 193         { 0xD8, 0xB6, 0x00 },   /* 0xE0 */
 194         { 0xD8, 0xB7, 0x00 },   /* 0xE1 */
 195         { 0xD8, 0xB8, 0x00 },   /* 0xE2 */
 196         { 0xD8, 0xB9, 0x00 },   /* 0xE3 */
 197         { 0xD8, 0xBA, 0x00 },   /* 0xE4 */
 198         { 0xD9, 0x81, 0x00 },   /* 0xE5 */
 199         { 0xC2, 0xB5, 0x00 },   /* 0xE6 */
 200         { 0xD9, 0x82, 0x00 },   /* 0xE7 */
 201         { 0xD9, 0x83, 0x00 },   /* 0xE8 */
 202         { 0xD9, 0x84, 0x00 },   /* 0xE9 */
 203         { 0xD9, 0x85, 0x00 },   /* 0xEA */
 204         { 0xD9, 0x86, 0x00 },   /* 0xEB */
 205         { 0xD9, 0x87, 0x00 },   /* 0xEC */
 206         { 0xD9, 0x88, 0x00 },   /* 0xED */
 207         { 0xD9, 0x89, 0x00 },   /* 0xEE */
 208         { 0xD9, 0x8A, 0x00 },   /* 0xEF */
 209         { 0xE2, 0x89, 0xA1 },   /* 0xF0 */
 210         { 0xD9, 0x8B, 0x00 },   /* 0xF1 */
 211         { 0xD9, 0x8C, 0x00 },   /* 0xF2 */
 212         { 0xD9, 0x8D, 0x00 },   /* 0xF3 */
 213         { 0xD9, 0x8E, 0x00 },   /* 0xF4 */
 214         { 0xD9, 0x8F, 0x00 },   /* 0xF5 */
 215         { 0xD9, 0x90, 0x00 },   /* 0xF6 */
 216         { 0xE2, 0x89, 0x88 },   /* 0xF7 */
 217         { 0xC2, 0xB0, 0x00 },   /* 0xF8 */
 218         { 0xE2, 0x88, 0x99 },   /* 0xF9 */
 219         { 0xC2, 0xB7, 0x00 },   /* 0xFA */
 220         { 0xE2, 0x88, 0x9A },   /* 0xFB */
 221         { 0xE2, 0x81, 0xBF },   /* 0xFC */
 222         { 0xC2, 0xB2, 0x00 },   /* 0xFD */
 223         { 0xE2, 0x96, 0xA0 },   /* 0xFE */
 224         { 0xC2, 0xA0, 0x00 },   /* 0xFF */
 225 };
 226 
 227 /*
 228  * Mapping tables from UTF-8 to CP720.
 229  *
 230  * The table is sorted with UTF-8 values to be used with binary search.
 231  * UTF-8 character byte values are saved at uint32_t:24 contiguously as
 232  * scalar values.
 233  */
 234 static const kiconv_to_sb_tbl_comp_t u8_to_cp720_tbl[128] = {
 235         { 0x00C280, 0x80 },
 236         { 0x00C281, 0x81 },
 237         { 0x00C284, 0x84 },
 238         { 0x00C286, 0x86 },
 239         { 0x00C28D, 0x8D },
 240         { 0x00C28E, 0x8E },
 241         { 0x00C28F, 0x8F },
 242         { 0x00C290, 0x90 },
 243         { 0x00C2A0, 0xFF },
 244         { 0x00C2A3, 0x9C },
 245         { 0x00C2A4, 0x94 },
 246         { 0x00C2AB, 0xAE },
 247         { 0x00C2B0, 0xF8 },
 248         { 0x00C2B2, 0xFD },
 249         { 0x00C2B5, 0xE6 },
 250         { 0x00C2B7, 0xFA },
 251         { 0x00C2BB, 0xAF },
 252         { 0x00C3A0, 0x85 },
 253         { 0x00C3A2, 0x83 },
 254         { 0x00C3A7, 0x87 },
 255         { 0x00C3A8, 0x8A },
 256         { 0x00C3A9, 0x82 },
 257         { 0x00C3AA, 0x88 },
 258         { 0x00C3AB, 0x89 },
 259         { 0x00C3AE, 0x8C },
 260         { 0x00C3AF, 0x8B },
 261         { 0x00C3B4, 0x93 },
 262         { 0x00C3B9, 0x97 },
 263         { 0x00C3BB, 0x96 },
 264         { 0x00D8A1, 0x98 },
 265         { 0x00D8A2, 0x99 },
 266         { 0x00D8A3, 0x9A },
 267         { 0x00D8A4, 0x9B },
 268         { 0x00D8A5, 0x9D },
 269         { 0x00D8A6, 0x9E },
 270         { 0x00D8A7, 0x9F },
 271         { 0x00D8A8, 0xA0 },
 272         { 0x00D8A9, 0xA1 },
 273         { 0x00D8AA, 0xA2 },
 274         { 0x00D8AB, 0xA3 },
 275         { 0x00D8AC, 0xA4 },
 276         { 0x00D8AD, 0xA5 },
 277         { 0x00D8AE, 0xA6 },
 278         { 0x00D8AF, 0xA7 },
 279         { 0x00D8B0, 0xA8 },
 280         { 0x00D8B1, 0xA9 },
 281         { 0x00D8B2, 0xAA },
 282         { 0x00D8B3, 0xAB },
 283         { 0x00D8B4, 0xAC },
 284         { 0x00D8B5, 0xAD },
 285         { 0x00D8B6, 0xE0 },
 286         { 0x00D8B7, 0xE1 },
 287         { 0x00D8B8, 0xE2 },
 288         { 0x00D8B9, 0xE3 },
 289         { 0x00D8BA, 0xE4 },
 290         { 0x00D980, 0x95 },
 291         { 0x00D981, 0xE5 },
 292         { 0x00D982, 0xE7 },
 293         { 0x00D983, 0xE8 },
 294         { 0x00D984, 0xE9 },
 295         { 0x00D985, 0xEA },
 296         { 0x00D986, 0xEB },
 297         { 0x00D987, 0xEC },
 298         { 0x00D988, 0xED },
 299         { 0x00D989, 0xEE },
 300         { 0x00D98A, 0xEF },
 301         { 0x00D98B, 0xF1 },
 302         { 0x00D98C, 0xF2 },
 303         { 0x00D98D, 0xF3 },
 304         { 0x00D98E, 0xF4 },
 305         { 0x00D98F, 0xF5 },
 306         { 0x00D990, 0xF6 },
 307         { 0x00D991, 0x91 },
 308         { 0x00D992, 0x92 },
 309         { 0xE281BF, 0xFC },
 310         { 0xE28899, 0xF9 },
 311         { 0xE2889A, 0xFB },
 312         { 0xE28988, 0xF7 },
 313         { 0xE289A1, 0xF0 },
 314         { 0xE29480, 0xC4 },
 315         { 0xE29482, 0xB3 },
 316         { 0xE2948C, 0xDA },
 317         { 0xE29490, 0xBF },
 318         { 0xE29494, 0xC0 },
 319         { 0xE29498, 0xD9 },
 320         { 0xE2949C, 0xC3 },
 321         { 0xE294A4, 0xB4 },
 322         { 0xE294AC, 0xC2 },
 323         { 0xE294B4, 0xC1 },
 324         { 0xE294BC, 0xC5 },
 325         { 0xE29590, 0xCD },
 326         { 0xE29591, 0xBA },
 327         { 0xE29592, 0xD5 },
 328         { 0xE29593, 0xD6 },
 329         { 0xE29594, 0xC9 },
 330         { 0xE29595, 0xB8 },
 331         { 0xE29596, 0xB7 },
 332         { 0xE29597, 0xBB },
 333         { 0xE29598, 0xD4 },
 334         { 0xE29599, 0xD3 },
 335         { 0xE2959A, 0xC8 },
 336         { 0xE2959B, 0xBE },
 337         { 0xE2959C, 0xBD },
 338         { 0xE2959D, 0xBC },
 339         { 0xE2959E, 0xC6 },
 340         { 0xE2959F, 0xC7 },
 341         { 0xE295A0, 0xCC },
 342         { 0xE295A1, 0xB5 },
 343         { 0xE295A2, 0xB6 },
 344         { 0xE295A3, 0xB9 },
 345         { 0xE295A4, 0xD1 },
 346         { 0xE295A5, 0xD2 },
 347         { 0xE295A6, 0xCB },
 348         { 0xE295A7, 0xCF },
 349         { 0xE295A8, 0xD0 },
 350         { 0xE295A9, 0xCA },
 351         { 0xE295AA, 0xD8 },
 352         { 0xE295AB, 0xD7 },
 353         { 0xE295AC, 0xCE },
 354         { 0xE29680, 0xDF },
 355         { 0xE29684, 0xDC },
 356         { 0xE29688, 0xDB },
 357         { 0xE2968C, 0xDD },
 358         { 0xE29690, 0xDE },
 359         { 0xE29691, 0xB0 },
 360         { 0xE29692, 0xB1 },
 361         { 0xE29693, 0xB2 },
 362         { 0xE296A0, 0xFE },
 363 };
 364 
 365 #endif  /* _KERNEL */
 366 
 367 #ifdef __cplusplus
 368 }
 369 #endif
 370 
 371 #endif /* _SYS_KICONV_EMEA2_H */