1 /* 2 * Copyright 2013 Garrett D'Amore <garrett@damore.org> 3 * Copyright 2010 Nexenta Systems, Inc. All rights reserved. 4 * Copyright (c) 1993 5 * The Regents of the University of California. All rights reserved. 6 * 7 * This code is derived from software contributed to Berkeley by 8 * Paul Borman at Krystal Technologies. 9 * 10 * Redistribution and use in source and binary forms, with or without 11 * modification, are permitted provided that the following conditions 12 * are met: 13 * 1. Redistributions of source code must retain the above copyright 14 * notice, this list of conditions and the following disclaimer. 15 * 2. Redistributions in binary form must reproduce the above copyright 16 * notice, this list of conditions and the following disclaimer in the 17 * documentation and/or other materials provided with the distribution. 18 * 3. Neither the name of the University nor the names of its contributors 19 * may be used to endorse or promote products derived from this software 20 * without specific prior written permission. 21 * 22 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 23 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 24 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 25 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 26 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 27 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 28 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 29 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 30 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 31 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 32 * SUCH DAMAGE. 33 */ 34 /* 35 * Because we borrowed the __rune_t defintions from _types.h, we need 36 * this copyright notice as well: 37 * 38 * Copyright (c) 2002 Mike Barcroft <mike@FreeBSD.org> 39 * All rights reserved. 40 * 41 * Redistribution and use in source and binary forms, with or without 42 * modification, are permitted provided that the following conditions 43 * are met: 44 * 1. Redistributions of source code must retain the above copyright 45 * notice, this list of conditions and the following disclaimer. 46 * 2. Redistributions in binary form must reproduce the above copyright 47 * notice, this list of conditions and the following disclaimer in the 48 * documentation and/or other materials provided with the distribution. 49 * 50 * THIS SOFTWARE IS PROVIDED BY THE AUTHOR AND CONTRIBUTORS ``AS IS'' AND 51 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 52 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 53 * ARE DISCLAIMED. IN NO EVENT SHALL THE AUTHOR OR CONTRIBUTORS BE LIABLE 54 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 55 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 56 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 57 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 58 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 59 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 60 * SUCH DAMAGE. 61 */ 62 63 #ifndef _RUNETYPE_H_ 64 #define _RUNETYPE_H_ 65 66 #define _CACHED_RUNES (1 << 8) /* Must be a power of 2 */ 67 #define _CRMASK (~(_CACHED_RUNES - 1)) 68 69 /* 70 * rune_t is declared to be an ``int'' instead of the more natural 71 * ``unsigned long'' or ``long''. Two things are happening here. It is not 72 * unsigned so that EOF (-1) can be naturally assigned to it and used. Also, 73 * it looks like 10646 will be a 31 bit standard. This means that if your 74 * ints cannot hold 32 bits, you will be in trouble. The reason an int was 75 * chosen over a long is that the is*() and to*() routines take ints (says 76 * ANSI C), but they use __ct_rune_t instead of int. 77 * 78 * NOTE: rune_t is not covered by ANSI nor other standards, and should not 79 * be instantiated outside of lib/libc/locale. Use wchar_t. wchar_t and 80 * rune_t must be the same type. Also, wint_t must be no narrower than 81 * wchar_t, and should be able to hold all members of the largest 82 * character set plus one extra value (WEOF), and must be at least 16 bits. 83 * 84 * For compatibility with Solaris, we want to use long in ILP32, and int in 85 * LP64. This is due to historical Solaris legacy. (See <wchar.h> for 86 * the definition.) 87 */ 88 89 #if defined(_LP64) 90 typedef int __ct_rune_t; /* arg type for ctype funcs */ 91 #else 92 typedef int __ct_rune_t; 93 #endif 94 95 typedef int __rune_t; /* rune_t (see above) */ 96 97 /* 98 * The lower 8 bits of runetype[] contain the digit value of the rune. 99 */ 100 typedef struct _RuneEntry { 101 __rune_t __min; /* First rune of the range */ 102 __rune_t __max; /* Last rune (inclusive) of the range */ 103 __rune_t __map; /* What first maps to in maps */ 104 unsigned *__types; /* Array of types in range */ 105 } _RuneEntry; 106 107 typedef struct _RuneRange { 108 int __nranges; /* Number of ranges stored */ 109 _RuneEntry *__ranges; /* Pointer to the ranges */ 110 } _RuneRange; 111 112 typedef struct _RuneLocale { 113 char __magic[8]; /* Magic saying what version we are */ 114 char __encoding[32]; /* ASCII name of encoding */ 115 116 unsigned int __runetype[_CACHED_RUNES]; 117 __rune_t __maplower[_CACHED_RUNES]; 118 __rune_t __mapupper[_CACHED_RUNES]; 119 120 /* 121 * The following are to deal with Runes larger than _CACHED_RUNES - 1. 122 * Their data is actually contiguous with this structure so as to make 123 * it easier to read/write from/to disk. 124 */ 125 _RuneRange __runetype_ext; 126 _RuneRange __maplower_ext; 127 _RuneRange __mapupper_ext; 128 129 void *__variable; /* Data which depends on the encoding */ 130 int __variable_len; /* how long that data is */ 131 } _RuneLocale; 132 133 #define _RUNE_MAGIC_1 "RuneMagi" /* Indicates version 0 of RuneLocale */ 134 135 extern _RuneLocale _DefaultRuneLocale; 136 137 unsigned int __runetype(const _RuneLocale *, int); 138 139 #endif /* !_RUNETYPE_H_ */ 140