1/* Character handling in C locale. 2 3 Copyright 2000-2003, 2006, 2009-2011 Free Software Foundation, Inc. 4 5This program is free software; you can redistribute it and/or modify 6it under the terms of the GNU General Public License as published by 7the Free Software Foundation; either version 3 of the License, or 8(at your option) any later version. 9 10This program is distributed in the hope that it will be useful, 11but WITHOUT ANY WARRANTY; without even the implied warranty of 12MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13GNU General Public License for more details. 14 15You should have received a copy of the GNU General Public License 16along with this program; if not, write to the Free Software Foundation, 17Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 18 19#include <config.h> 20 21/* Specification. */ 22#define NO_C_CTYPE_MACROS 23#include "c-ctype.h" 24 25/* The function isascii is not locale dependent. Its use in EBCDIC is 26 questionable. */ 27bool 28c_isascii (int c) 29{ 30 return (c >= 0x00 && c <= 0x7f); 31} 32 33bool 34c_isalnum (int c) 35{ 36#if C_CTYPE_CONSECUTIVE_DIGITS \ 37 && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 38#if C_CTYPE_ASCII 39 return ((c >= '0' && c <= '9') 40 || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z')); 41#else 42 return ((c >= '0' && c <= '9') 43 || (c >= 'A' && c <= 'Z') 44 || (c >= 'a' && c <= 'z')); 45#endif 46#else 47 switch (c) 48 { 49 case '0': case '1': case '2': case '3': case '4': case '5': 50 case '6': case '7': case '8': case '9': 51 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 52 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 53 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 54 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 55 case 'Y': case 'Z': 56 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 57 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 58 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 59 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 60 case 'y': case 'z': 61 return 1; 62 default: 63 return 0; 64 } 65#endif 66} 67 68bool 69c_isalpha (int c) 70{ 71#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 72#if C_CTYPE_ASCII 73 return ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z'); 74#else 75 return ((c >= 'A' && c <= 'Z') || (c >= 'a' && c <= 'z')); 76#endif 77#else 78 switch (c) 79 { 80 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 81 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 82 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 83 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 84 case 'Y': case 'Z': 85 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 86 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 87 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 88 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 89 case 'y': case 'z': 90 return 1; 91 default: 92 return 0; 93 } 94#endif 95} 96 97bool 98c_isblank (int c) 99{ 100 return (c == ' ' || c == '\t'); 101} 102 103bool 104c_iscntrl (int c) 105{ 106#if C_CTYPE_ASCII 107 return ((c & ~0x1f) == 0 || c == 0x7f); 108#else 109 switch (c) 110 { 111 case ' ': case '!': case '"': case '#': case '$': case '%': 112 case '&': case '\'': case '(': case ')': case '*': case '+': 113 case ',': case '-': case '.': case '/': 114 case '0': case '1': case '2': case '3': case '4': case '5': 115 case '6': case '7': case '8': case '9': 116 case ':': case ';': case '<': case '=': case '>': case '?': 117 case '@': 118 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 119 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 120 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 121 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 122 case 'Y': case 'Z': 123 case '[': case '\\': case ']': case '^': case '_': case '`': 124 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 125 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 126 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 127 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 128 case 'y': case 'z': 129 case '{': case '|': case '}': case '~': 130 return 0; 131 default: 132 return 1; 133 } 134#endif 135} 136 137bool 138c_isdigit (int c) 139{ 140#if C_CTYPE_CONSECUTIVE_DIGITS 141 return (c >= '0' && c <= '9'); 142#else 143 switch (c) 144 { 145 case '0': case '1': case '2': case '3': case '4': case '5': 146 case '6': case '7': case '8': case '9': 147 return 1; 148 default: 149 return 0; 150 } 151#endif 152} 153 154bool 155c_islower (int c) 156{ 157#if C_CTYPE_CONSECUTIVE_LOWERCASE 158 return (c >= 'a' && c <= 'z'); 159#else 160 switch (c) 161 { 162 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 163 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 164 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 165 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 166 case 'y': case 'z': 167 return 1; 168 default: 169 return 0; 170 } 171#endif 172} 173 174bool 175c_isgraph (int c) 176{ 177#if C_CTYPE_ASCII 178 return (c >= '!' && c <= '~'); 179#else 180 switch (c) 181 { 182 case '!': case '"': case '#': case '$': case '%': case '&': 183 case '\'': case '(': case ')': case '*': case '+': case ',': 184 case '-': case '.': case '/': 185 case '0': case '1': case '2': case '3': case '4': case '5': 186 case '6': case '7': case '8': case '9': 187 case ':': case ';': case '<': case '=': case '>': case '?': 188 case '@': 189 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 190 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 191 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 192 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 193 case 'Y': case 'Z': 194 case '[': case '\\': case ']': case '^': case '_': case '`': 195 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 196 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 197 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 198 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 199 case 'y': case 'z': 200 case '{': case '|': case '}': case '~': 201 return 1; 202 default: 203 return 0; 204 } 205#endif 206} 207 208bool 209c_isprint (int c) 210{ 211#if C_CTYPE_ASCII 212 return (c >= ' ' && c <= '~'); 213#else 214 switch (c) 215 { 216 case ' ': case '!': case '"': case '#': case '$': case '%': 217 case '&': case '\'': case '(': case ')': case '*': case '+': 218 case ',': case '-': case '.': case '/': 219 case '0': case '1': case '2': case '3': case '4': case '5': 220 case '6': case '7': case '8': case '9': 221 case ':': case ';': case '<': case '=': case '>': case '?': 222 case '@': 223 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 224 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 225 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 226 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 227 case 'Y': case 'Z': 228 case '[': case '\\': case ']': case '^': case '_': case '`': 229 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 230 case 'g': case 'h': case 'i': case 'j': case 'k': case 'l': 231 case 'm': case 'n': case 'o': case 'p': case 'q': case 'r': 232 case 's': case 't': case 'u': case 'v': case 'w': case 'x': 233 case 'y': case 'z': 234 case '{': case '|': case '}': case '~': 235 return 1; 236 default: 237 return 0; 238 } 239#endif 240} 241 242bool 243c_ispunct (int c) 244{ 245#if C_CTYPE_ASCII 246 return ((c >= '!' && c <= '~') 247 && !((c >= '0' && c <= '9') 248 || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'Z'))); 249#else 250 switch (c) 251 { 252 case '!': case '"': case '#': case '$': case '%': case '&': 253 case '\'': case '(': case ')': case '*': case '+': case ',': 254 case '-': case '.': case '/': 255 case ':': case ';': case '<': case '=': case '>': case '?': 256 case '@': 257 case '[': case '\\': case ']': case '^': case '_': case '`': 258 case '{': case '|': case '}': case '~': 259 return 1; 260 default: 261 return 0; 262 } 263#endif 264} 265 266bool 267c_isspace (int c) 268{ 269 return (c == ' ' || c == '\t' 270 || c == '\n' || c == '\v' || c == '\f' || c == '\r'); 271} 272 273bool 274c_isupper (int c) 275{ 276#if C_CTYPE_CONSECUTIVE_UPPERCASE 277 return (c >= 'A' && c <= 'Z'); 278#else 279 switch (c) 280 { 281 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 282 case 'G': case 'H': case 'I': case 'J': case 'K': case 'L': 283 case 'M': case 'N': case 'O': case 'P': case 'Q': case 'R': 284 case 'S': case 'T': case 'U': case 'V': case 'W': case 'X': 285 case 'Y': case 'Z': 286 return 1; 287 default: 288 return 0; 289 } 290#endif 291} 292 293bool 294c_isxdigit (int c) 295{ 296#if C_CTYPE_CONSECUTIVE_DIGITS \ 297 && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 298#if C_CTYPE_ASCII 299 return ((c >= '0' && c <= '9') 300 || ((c & ~0x20) >= 'A' && (c & ~0x20) <= 'F')); 301#else 302 return ((c >= '0' && c <= '9') 303 || (c >= 'A' && c <= 'F') 304 || (c >= 'a' && c <= 'f')); 305#endif 306#else 307 switch (c) 308 { 309 case '0': case '1': case '2': case '3': case '4': case '5': 310 case '6': case '7': case '8': case '9': 311 case 'A': case 'B': case 'C': case 'D': case 'E': case 'F': 312 case 'a': case 'b': case 'c': case 'd': case 'e': case 'f': 313 return 1; 314 default: 315 return 0; 316 } 317#endif 318} 319 320int 321c_tolower (int c) 322{ 323#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 324 return (c >= 'A' && c <= 'Z' ? c - 'A' + 'a' : c); 325#else 326 switch (c) 327 { 328 case 'A': return 'a'; 329 case 'B': return 'b'; 330 case 'C': return 'c'; 331 case 'D': return 'd'; 332 case 'E': return 'e'; 333 case 'F': return 'f'; 334 case 'G': return 'g'; 335 case 'H': return 'h'; 336 case 'I': return 'i'; 337 case 'J': return 'j'; 338 case 'K': return 'k'; 339 case 'L': return 'l'; 340 case 'M': return 'm'; 341 case 'N': return 'n'; 342 case 'O': return 'o'; 343 case 'P': return 'p'; 344 case 'Q': return 'q'; 345 case 'R': return 'r'; 346 case 'S': return 's'; 347 case 'T': return 't'; 348 case 'U': return 'u'; 349 case 'V': return 'v'; 350 case 'W': return 'w'; 351 case 'X': return 'x'; 352 case 'Y': return 'y'; 353 case 'Z': return 'z'; 354 default: return c; 355 } 356#endif 357} 358 359int 360c_toupper (int c) 361{ 362#if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 363 return (c >= 'a' && c <= 'z' ? c - 'a' + 'A' : c); 364#else 365 switch (c) 366 { 367 case 'a': return 'A'; 368 case 'b': return 'B'; 369 case 'c': return 'C'; 370 case 'd': return 'D'; 371 case 'e': return 'E'; 372 case 'f': return 'F'; 373 case 'g': return 'G'; 374 case 'h': return 'H'; 375 case 'i': return 'I'; 376 case 'j': return 'J'; 377 case 'k': return 'K'; 378 case 'l': return 'L'; 379 case 'm': return 'M'; 380 case 'n': return 'N'; 381 case 'o': return 'O'; 382 case 'p': return 'P'; 383 case 'q': return 'Q'; 384 case 'r': return 'R'; 385 case 's': return 'S'; 386 case 't': return 'T'; 387 case 'u': return 'U'; 388 case 'v': return 'V'; 389 case 'w': return 'W'; 390 case 'x': return 'X'; 391 case 'y': return 'Y'; 392 case 'z': return 'Z'; 393 default: return c; 394 } 395#endif 396} 397