1 /* 2 * Copyright (c) 1993 3 * The Regents of the University of California. All rights reserved. 4 * 5 * This code is derived from software contributed to Berkeley by 6 * Paul Borman at Krystal Technologies. 7 * 8 * Redistribution and use in source and binary forms, with or without 9 * modification, are permitted provided that the following conditions 10 * are met: 11 * 1. Redistributions of source code must retain the above copyright 12 * notice, this list of conditions and the following disclaimer. 13 * 2. Redistributions in binary form must reproduce the above copyright 14 * notice, this list of conditions and the following disclaimer in the 15 * documentation and/or other materials provided with the distribution. 16 * 4. Neither the name of the University nor the names of its contributors 17 * may be used to endorse or promote products derived from this software 18 * without specific prior written permission. 19 * 20 * THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND 21 * ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE 22 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE 23 * ARE DISCLAIMED. IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE 24 * FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL 25 * DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS 26 * OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) 27 * HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT 28 * LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY 29 * OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF 30 * SUCH DAMAGE. 31 */ 32 33 /* 34 * Copyright 2010 Nexenta Systems, Inc. All rights reserved. 35 * Use is subject to license terms. 36 */ 37 38 #include "lint.h" 39 #include <ctype.h> 40 #include <wchar.h> 41 #include "runetype.h" 42 #include "mblocal.h" 43 #include "_ctype.h" 44 45 _RuneLocale _DefaultRuneLocale = { 46 _RUNE_MAGIC_1, 47 "NONE", 48 { 49 /* 00 */ 50 _CTYPE_C, 51 _CTYPE_C, 52 _CTYPE_C, 53 _CTYPE_C, 54 _CTYPE_C, 55 _CTYPE_C, 56 _CTYPE_C, 57 _CTYPE_C, 58 /* 08 */ 59 _CTYPE_C, 60 _CTYPE_C|_CTYPE_S|_CTYPE_B, 61 _CTYPE_C|_CTYPE_S, 62 _CTYPE_C|_CTYPE_S, 63 _CTYPE_C|_CTYPE_S, 64 _CTYPE_C|_CTYPE_S, 65 _CTYPE_C, 66 _CTYPE_C, 67 /* 10 */ 68 _CTYPE_C, 69 _CTYPE_C, 70 _CTYPE_C, 71 _CTYPE_C, 72 _CTYPE_C, 73 _CTYPE_C, 74 _CTYPE_C, 75 _CTYPE_C, 76 /* 18 */ 77 _CTYPE_C, 78 _CTYPE_C, 79 _CTYPE_C, 80 _CTYPE_C, 81 _CTYPE_C, 82 _CTYPE_C, 83 _CTYPE_C, 84 _CTYPE_C, 85 /* 20 */ 86 _CTYPE_S|_CTYPE_B|_CTYPE_R, 87 _CTYPE_P|_CTYPE_R|_CTYPE_G, 88 _CTYPE_P|_CTYPE_R|_CTYPE_G, 89 _CTYPE_P|_CTYPE_R|_CTYPE_G, 90 _CTYPE_P|_CTYPE_R|_CTYPE_G, 91 _CTYPE_P|_CTYPE_R|_CTYPE_G, 92 _CTYPE_P|_CTYPE_R|_CTYPE_G, 93 _CTYPE_P|_CTYPE_R|_CTYPE_G, 94 /* 28 */ 95 _CTYPE_P|_CTYPE_R|_CTYPE_G, 96 _CTYPE_P|_CTYPE_R|_CTYPE_G, 97 _CTYPE_P|_CTYPE_R|_CTYPE_G, 98 _CTYPE_P|_CTYPE_R|_CTYPE_G, 99 _CTYPE_P|_CTYPE_R|_CTYPE_G, 100 _CTYPE_P|_CTYPE_R|_CTYPE_G, 101 _CTYPE_P|_CTYPE_R|_CTYPE_G, 102 _CTYPE_P|_CTYPE_R|_CTYPE_G, 103 /* 30 */ 104 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 105 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 106 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 107 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 108 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 109 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 110 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 111 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 112 /* 38 */ 113 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 114 _CTYPE_D|_CTYPE_R|_CTYPE_G|_CTYPE_X, 115 _CTYPE_P|_CTYPE_R|_CTYPE_G, 116 _CTYPE_P|_CTYPE_R|_CTYPE_G, 117 _CTYPE_P|_CTYPE_R|_CTYPE_G, 118 _CTYPE_P|_CTYPE_R|_CTYPE_G, 119 _CTYPE_P|_CTYPE_R|_CTYPE_G, 120 _CTYPE_P|_CTYPE_R|_CTYPE_G, 121 /* 40 */ 122 _CTYPE_P|_CTYPE_R|_CTYPE_G, 123 _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 124 _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 125 _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 126 _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 127 _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 128 _CTYPE_U|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 129 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 130 /* 48 */ 131 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 132 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 133 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 134 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 135 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 136 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 137 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 138 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 139 /* 50 */ 140 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 141 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 142 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 143 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 144 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 145 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 146 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 147 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 148 /* 58 */ 149 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 150 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 151 _CTYPE_U|_CTYPE_R|_CTYPE_G|_CTYPE_A, 152 _CTYPE_P|_CTYPE_R|_CTYPE_G, 153 _CTYPE_P|_CTYPE_R|_CTYPE_G, 154 _CTYPE_P|_CTYPE_R|_CTYPE_G, 155 _CTYPE_P|_CTYPE_R|_CTYPE_G, 156 _CTYPE_P|_CTYPE_R|_CTYPE_G, 157 /* 60 */ 158 _CTYPE_P|_CTYPE_R|_CTYPE_G, 159 _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 160 _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 161 _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 162 _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 163 _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 164 _CTYPE_L|_CTYPE_X|_CTYPE_R|_CTYPE_G|_CTYPE_A, 165 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 166 /* 68 */ 167 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 168 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 169 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 170 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 171 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 172 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 173 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 174 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 175 /* 70 */ 176 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 177 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 178 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 179 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 180 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 181 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 182 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 183 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 184 /* 78 */ 185 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 186 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 187 _CTYPE_L|_CTYPE_R|_CTYPE_G|_CTYPE_A, 188 _CTYPE_P|_CTYPE_R|_CTYPE_G, 189 _CTYPE_P|_CTYPE_R|_CTYPE_G, 190 _CTYPE_P|_CTYPE_R|_CTYPE_G, 191 _CTYPE_P|_CTYPE_R|_CTYPE_G, 192 _CTYPE_C, 193 }, 194 195 /* BEGIN CSTYLED */ 196 { 197 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 198 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 199 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 200 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 201 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 202 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 203 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 204 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 205 0x40, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 206 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 207 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 208 'x', 'y', 'z', 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 209 0x60, 'a', 'b', 'c', 'd', 'e', 'f', 'g', 210 'h', 'i', 'j', 'k', 'l', 'm', 'n', 'o', 211 'p', 'q', 'r', 's', 't', 'u', 'v', 'w', 212 'x', 'y', 'z', 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 213 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 214 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 215 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 216 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 217 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 218 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 219 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 220 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 221 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 222 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 223 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 224 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 225 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 226 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 227 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 228 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 229 }, 230 { 231 0x00, 0x01, 0x02, 0x03, 0x04, 0x05, 0x06, 0x07, 232 0x08, 0x09, 0x0a, 0x0b, 0x0c, 0x0d, 0x0e, 0x0f, 233 0x10, 0x11, 0x12, 0x13, 0x14, 0x15, 0x16, 0x17, 234 0x18, 0x19, 0x1a, 0x1b, 0x1c, 0x1d, 0x1e, 0x1f, 235 0x20, 0x21, 0x22, 0x23, 0x24, 0x25, 0x26, 0x27, 236 0x28, 0x29, 0x2a, 0x2b, 0x2c, 0x2d, 0x2e, 0x2f, 237 0x30, 0x31, 0x32, 0x33, 0x34, 0x35, 0x36, 0x37, 238 0x38, 0x39, 0x3a, 0x3b, 0x3c, 0x3d, 0x3e, 0x3f, 239 0x40, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 240 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 241 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 242 'X', 'Y', 'Z', 0x5b, 0x5c, 0x5d, 0x5e, 0x5f, 243 0x60, 'A', 'B', 'C', 'D', 'E', 'F', 'G', 244 'H', 'I', 'J', 'K', 'L', 'M', 'N', 'O', 245 'P', 'Q', 'R', 'S', 'T', 'U', 'V', 'W', 246 'X', 'Y', 'Z', 0x7b, 0x7c, 0x7d, 0x7e, 0x7f, 247 0x80, 0x81, 0x82, 0x83, 0x84, 0x85, 0x86, 0x87, 248 0x88, 0x89, 0x8a, 0x8b, 0x8c, 0x8d, 0x8e, 0x8f, 249 0x90, 0x91, 0x92, 0x93, 0x94, 0x95, 0x96, 0x97, 250 0x98, 0x99, 0x9a, 0x9b, 0x9c, 0x9d, 0x9e, 0x9f, 251 0xa0, 0xa1, 0xa2, 0xa3, 0xa4, 0xa5, 0xa6, 0xa7, 252 0xa8, 0xa9, 0xaa, 0xab, 0xac, 0xad, 0xae, 0xaf, 253 0xb0, 0xb1, 0xb2, 0xb3, 0xb4, 0xb5, 0xb6, 0xb7, 254 0xb8, 0xb9, 0xba, 0xbb, 0xbc, 0xbd, 0xbe, 0xbf, 255 0xc0, 0xc1, 0xc2, 0xc3, 0xc4, 0xc5, 0xc6, 0xc7, 256 0xc8, 0xc9, 0xca, 0xcb, 0xcc, 0xcd, 0xce, 0xcf, 257 0xd0, 0xd1, 0xd2, 0xd3, 0xd4, 0xd5, 0xd6, 0xd7, 258 0xd8, 0xd9, 0xda, 0xdb, 0xdc, 0xdd, 0xde, 0xdf, 259 0xe0, 0xe1, 0xe2, 0xe3, 0xe4, 0xe5, 0xe6, 0xe7, 260 0xe8, 0xe9, 0xea, 0xeb, 0xec, 0xed, 0xee, 0xef, 261 0xf0, 0xf1, 0xf2, 0xf3, 0xf4, 0xf5, 0xf6, 0xf7, 262 0xf8, 0xf9, 0xfa, 0xfb, 0xfc, 0xfd, 0xfe, 0xff, 263 }, 264 /* END CSTYLED */ 265 }; 266 267 _RuneLocale *_CurrentRuneLocale = &_DefaultRuneLocale; 268 269 /* Taken from former _ctype.c */ 270 unsigned int *__ctype_mask = _DefaultRuneLocale.__runetype; 271 272 int *__trans_lower = _DefaultRuneLocale.__maplower; 273 int *__trans_upper = _DefaultRuneLocale.__mapupper; 274 275 /* 276 * Used in various string routines to conditionalize versions optimized for 277 * the ASCII case 278 */ 279 int charset_is_ascii = 1; 280