1 /* -*- buffer-read-only: t -*- vi: set ro: */ 2 /* DO NOT EDIT! GENERATED AUTOMATICALLY! */ 3 /* Character handling in C locale. 4 5 These functions work like the corresponding functions in <ctype.h>, 6 except that they have the C (POSIX) locale hardwired, whereas the 7 <ctype.h> functions' behaviour depends on the current locale set via 8 setlocale. 9 10 Copyright (C) 2000-2003, 2006, 2008 Free Software Foundation, Inc. 11 12 This program is free software; you can redistribute it and/or modify 13 it under the terms of the GNU General Public License as published by 14 the Free Software Foundation; either version 3 of the License, or 15 (at your option) any later version. 16 17 This program is distributed in the hope that it will be useful, 18 but WITHOUT ANY WARRANTY; without even the implied warranty of 19 MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 20 GNU General Public License for more details. 21 22 You should have received a copy of the GNU General Public License 23 along with this program; if not, write to the Free Software Foundation, 24 Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ 25 26 #ifndef C_CTYPE_H 27 #define C_CTYPE_H 28 29 #include <stdbool.h> 30 31 32 #ifdef __cplusplus 33 extern "C" { 34 #endif 35 36 37 /* The functions defined in this file assume the "C" locale and a character 38 set without diacritics (ASCII-US or EBCDIC-US or something like that). 39 Even if the "C" locale on a particular system is an extension of the ASCII 40 character set (like on BeOS, where it is UTF-8, or on AmigaOS, where it 41 is ISO-8859-1), the functions in this file recognize only the ASCII 42 characters. */ 43 44 45 /* Check whether the ASCII optimizations apply. */ 46 47 /* ANSI C89 (and ISO C99 5.2.1.3 too) already guarantees that 48 '0', '1', ..., '9' have consecutive integer values. */ 49 #define C_CTYPE_CONSECUTIVE_DIGITS 1 50 51 #if ('A' <= 'Z') \ 52 && ('A' + 1 == 'B') && ('B' + 1 == 'C') && ('C' + 1 == 'D') \ 53 && ('D' + 1 == 'E') && ('E' + 1 == 'F') && ('F' + 1 == 'G') \ 54 && ('G' + 1 == 'H') && ('H' + 1 == 'I') && ('I' + 1 == 'J') \ 55 && ('J' + 1 == 'K') && ('K' + 1 == 'L') && ('L' + 1 == 'M') \ 56 && ('M' + 1 == 'N') && ('N' + 1 == 'O') && ('O' + 1 == 'P') \ 57 && ('P' + 1 == 'Q') && ('Q' + 1 == 'R') && ('R' + 1 == 'S') \ 58 && ('S' + 1 == 'T') && ('T' + 1 == 'U') && ('U' + 1 == 'V') \ 59 && ('V' + 1 == 'W') && ('W' + 1 == 'X') && ('X' + 1 == 'Y') \ 60 && ('Y' + 1 == 'Z') 61 #define C_CTYPE_CONSECUTIVE_UPPERCASE 1 62 #endif 63 64 #if ('a' <= 'z') \ 65 && ('a' + 1 == 'b') && ('b' + 1 == 'c') && ('c' + 1 == 'd') \ 66 && ('d' + 1 == 'e') && ('e' + 1 == 'f') && ('f' + 1 == 'g') \ 67 && ('g' + 1 == 'h') && ('h' + 1 == 'i') && ('i' + 1 == 'j') \ 68 && ('j' + 1 == 'k') && ('k' + 1 == 'l') && ('l' + 1 == 'm') \ 69 && ('m' + 1 == 'n') && ('n' + 1 == 'o') && ('o' + 1 == 'p') \ 70 && ('p' + 1 == 'q') && ('q' + 1 == 'r') && ('r' + 1 == 's') \ 71 && ('s' + 1 == 't') && ('t' + 1 == 'u') && ('u' + 1 == 'v') \ 72 && ('v' + 1 == 'w') && ('w' + 1 == 'x') && ('x' + 1 == 'y') \ 73 && ('y' + 1 == 'z') 74 #define C_CTYPE_CONSECUTIVE_LOWERCASE 1 75 #endif 76 77 #if (' ' == 32) && ('!' == 33) && ('"' == 34) && ('#' == 35) \ 78 && ('%' == 37) && ('&' == 38) && ('\'' == 39) && ('(' == 40) \ 79 && (')' == 41) && ('*' == 42) && ('+' == 43) && (',' == 44) \ 80 && ('-' == 45) && ('.' == 46) && ('/' == 47) && ('0' == 48) \ 81 && ('1' == 49) && ('2' == 50) && ('3' == 51) && ('4' == 52) \ 82 && ('5' == 53) && ('6' == 54) && ('7' == 55) && ('8' == 56) \ 83 && ('9' == 57) && (':' == 58) && (';' == 59) && ('<' == 60) \ 84 && ('=' == 61) && ('>' == 62) && ('?' == 63) && ('A' == 65) \ 85 && ('B' == 66) && ('C' == 67) && ('D' == 68) && ('E' == 69) \ 86 && ('F' == 70) && ('G' == 71) && ('H' == 72) && ('I' == 73) \ 87 && ('J' == 74) && ('K' == 75) && ('L' == 76) && ('M' == 77) \ 88 && ('N' == 78) && ('O' == 79) && ('P' == 80) && ('Q' == 81) \ 89 && ('R' == 82) && ('S' == 83) && ('T' == 84) && ('U' == 85) \ 90 && ('V' == 86) && ('W' == 87) && ('X' == 88) && ('Y' == 89) \ 91 && ('Z' == 90) && ('[' == 91) && ('\\' == 92) && (']' == 93) \ 92 && ('^' == 94) && ('_' == 95) && ('a' == 97) && ('b' == 98) \ 93 && ('c' == 99) && ('d' == 100) && ('e' == 101) && ('f' == 102) \ 94 && ('g' == 103) && ('h' == 104) && ('i' == 105) && ('j' == 106) \ 95 && ('k' == 107) && ('l' == 108) && ('m' == 109) && ('n' == 110) \ 96 && ('o' == 111) && ('p' == 112) && ('q' == 113) && ('r' == 114) \ 97 && ('s' == 115) && ('t' == 116) && ('u' == 117) && ('v' == 118) \ 98 && ('w' == 119) && ('x' == 120) && ('y' == 121) && ('z' == 122) \ 99 && ('{' == 123) && ('|' == 124) && ('}' == 125) && ('~' == 126) 100 /* The character set is ASCII or one of its variants or extensions, not EBCDIC. 101 Testing the value of '\n' and '\r' is not relevant. */ 102 #define C_CTYPE_ASCII 1 103 #endif 104 105 106 /* Function declarations. */ 107 108 /* Unlike the functions in <ctype.h>, which require an argument in the range 109 of the 'unsigned char' type, the functions here operate on values that are 110 in the 'unsigned char' range or in the 'char' range. In other words, 111 when you have a 'char' value, you need to cast it before using it as 112 argument to a <ctype.h> function: 113 114 const char *s = ...; 115 if (isalpha ((unsigned char) *s)) ... 116 117 but you don't need to cast it for the functions defined in this file: 118 119 const char *s = ...; 120 if (c_isalpha (*s)) ... 121 */ 122 123 extern bool c_isascii (int c); /* not locale dependent */ 124 125 extern bool c_isalnum (int c); 126 extern bool c_isalpha (int c); 127 extern bool c_isblank (int c); 128 extern bool c_iscntrl (int c); 129 extern bool c_isdigit (int c); 130 extern bool c_islower (int c); 131 extern bool c_isgraph (int c); 132 extern bool c_isprint (int c); 133 extern bool c_ispunct (int c); 134 extern bool c_isspace (int c); 135 extern bool c_isupper (int c); 136 extern bool c_isxdigit (int c); 137 138 extern int c_tolower (int c); 139 extern int c_toupper (int c); 140 141 142 #if defined __GNUC__ && defined __OPTIMIZE__ && !defined __OPTIMIZE_SIZE__ && !defined NO_C_CTYPE_MACROS 143 144 /* ASCII optimizations. */ 145 146 #undef c_isascii 147 #define c_isascii(c) \ 148 ({ int __c = (c); \ 149 (__c >= 0x00 && __c <= 0x7f); \ 150 }) 151 152 #if C_CTYPE_CONSECUTIVE_DIGITS \ 153 && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 154 #if C_CTYPE_ASCII 155 #undef c_isalnum 156 #define c_isalnum(c) \ 157 ({ int __c = (c); \ 158 ((__c >= '0' && __c <= '9') \ 159 || ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'Z')); \ 160 }) 161 #else 162 #undef c_isalnum 163 #define c_isalnum(c) \ 164 ({ int __c = (c); \ 165 ((__c >= '0' && __c <= '9') \ 166 || (__c >= 'A' && __c <= 'Z') \ 167 || (__c >= 'a' && __c <= 'z')); \ 168 }) 169 #endif 170 #endif 171 172 #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 173 #if C_CTYPE_ASCII 174 #undef c_isalpha 175 #define c_isalpha(c) \ 176 ({ int __c = (c); \ 177 ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'Z'); \ 178 }) 179 #else 180 #undef c_isalpha 181 #define c_isalpha(c) \ 182 ({ int __c = (c); \ 183 ((__c >= 'A' && __c <= 'Z') || (__c >= 'a' && __c <= 'z')); \ 184 }) 185 #endif 186 #endif 187 188 #undef c_isblank 189 #define c_isblank(c) \ 190 ({ int __c = (c); \ 191 (__c == ' ' || __c == '\t'); \ 192 }) 193 194 #if C_CTYPE_ASCII 195 #undef c_iscntrl 196 #define c_iscntrl(c) \ 197 ({ int __c = (c); \ 198 ((__c & ~0x1f) == 0 || __c == 0x7f); \ 199 }) 200 #endif 201 202 #if C_CTYPE_CONSECUTIVE_DIGITS 203 #undef c_isdigit 204 #define c_isdigit(c) \ 205 ({ int __c = (c); \ 206 (__c >= '0' && __c <= '9'); \ 207 }) 208 #endif 209 210 #if C_CTYPE_CONSECUTIVE_LOWERCASE 211 #undef c_islower 212 #define c_islower(c) \ 213 ({ int __c = (c); \ 214 (__c >= 'a' && __c <= 'z'); \ 215 }) 216 #endif 217 218 #if C_CTYPE_ASCII 219 #undef c_isgraph 220 #define c_isgraph(c) \ 221 ({ int __c = (c); \ 222 (__c >= '!' && __c <= '~'); \ 223 }) 224 #endif 225 226 #if C_CTYPE_ASCII 227 #undef c_isprint 228 #define c_isprint(c) \ 229 ({ int __c = (c); \ 230 (__c >= ' ' && __c <= '~'); \ 231 }) 232 #endif 233 234 #if C_CTYPE_ASCII 235 #undef c_ispunct 236 #define c_ispunct(c) \ 237 ({ int _c = (c); \ 238 (c_isgraph (_c) && ! c_isalnum (_c)); \ 239 }) 240 #endif 241 242 #undef c_isspace 243 #define c_isspace(c) \ 244 ({ int __c = (c); \ 245 (__c == ' ' || __c == '\t' \ 246 || __c == '\n' || __c == '\v' || __c == '\f' || __c == '\r'); \ 247 }) 248 249 #if C_CTYPE_CONSECUTIVE_UPPERCASE 250 #undef c_isupper 251 #define c_isupper(c) \ 252 ({ int __c = (c); \ 253 (__c >= 'A' && __c <= 'Z'); \ 254 }) 255 #endif 256 257 #if C_CTYPE_CONSECUTIVE_DIGITS \ 258 && C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 259 #if C_CTYPE_ASCII 260 #undef c_isxdigit 261 #define c_isxdigit(c) \ 262 ({ int __c = (c); \ 263 ((__c >= '0' && __c <= '9') \ 264 || ((__c & ~0x20) >= 'A' && (__c & ~0x20) <= 'F')); \ 265 }) 266 #else 267 #undef c_isxdigit 268 #define c_isxdigit(c) \ 269 ({ int __c = (c); \ 270 ((__c >= '0' && __c <= '9') \ 271 || (__c >= 'A' && __c <= 'F') \ 272 || (__c >= 'a' && __c <= 'f')); \ 273 }) 274 #endif 275 #endif 276 277 #if C_CTYPE_CONSECUTIVE_UPPERCASE && C_CTYPE_CONSECUTIVE_LOWERCASE 278 #undef c_tolower 279 #define c_tolower(c) \ 280 ({ int __c = (c); \ 281 (__c >= 'A' && __c <= 'Z' ? __c - 'A' + 'a' : __c); \ 282 }) 283 #undef c_toupper 284 #define c_toupper(c) \ 285 ({ int __c = (c); \ 286 (__c >= 'a' && __c <= 'z' ? __c - 'a' + 'A' : __c); \ 287 }) 288 #endif 289 290 #endif /* optimizing for speed */ 291 292 293 #ifdef __cplusplus 294 } 295 #endif 296 297 #endif /* C_CTYPE_H */ 298