13052ba56SArnaldo Carvalho de Melo /* SPDX-License-Identifier: GPL-2.0 */ 23052ba56SArnaldo Carvalho de Melo #ifndef _LINUX_CTYPE_H 33052ba56SArnaldo Carvalho de Melo #define _LINUX_CTYPE_H 43052ba56SArnaldo Carvalho de Melo 5*23cd9543SArnaldo Carvalho de Melo #include <linux/compiler.h> 6*23cd9543SArnaldo Carvalho de Melo 73052ba56SArnaldo Carvalho de Melo /* 83052ba56SArnaldo Carvalho de Melo * NOTE! This ctype does not handle EOF like the standard C 93052ba56SArnaldo Carvalho de Melo * library is required to. 103052ba56SArnaldo Carvalho de Melo */ 113052ba56SArnaldo Carvalho de Melo 123052ba56SArnaldo Carvalho de Melo #define _U 0x01 /* upper */ 133052ba56SArnaldo Carvalho de Melo #define _L 0x02 /* lower */ 143052ba56SArnaldo Carvalho de Melo #define _D 0x04 /* digit */ 153052ba56SArnaldo Carvalho de Melo #define _C 0x08 /* cntrl */ 163052ba56SArnaldo Carvalho de Melo #define _P 0x10 /* punct */ 173052ba56SArnaldo Carvalho de Melo #define _S 0x20 /* white space (space/lf/tab) */ 183052ba56SArnaldo Carvalho de Melo #define _X 0x40 /* hex digit */ 193052ba56SArnaldo Carvalho de Melo #define _SP 0x80 /* hard space (0x20) */ 203052ba56SArnaldo Carvalho de Melo 213052ba56SArnaldo Carvalho de Melo extern const unsigned char _ctype[]; 223052ba56SArnaldo Carvalho de Melo 233052ba56SArnaldo Carvalho de Melo #define __ismask(x) (_ctype[(int)(unsigned char)(x)]) 243052ba56SArnaldo Carvalho de Melo 253052ba56SArnaldo Carvalho de Melo #define isalnum(c) ((__ismask(c)&(_U|_L|_D)) != 0) 263052ba56SArnaldo Carvalho de Melo #define isalpha(c) ((__ismask(c)&(_U|_L)) != 0) 273052ba56SArnaldo Carvalho de Melo #define iscntrl(c) ((__ismask(c)&(_C)) != 0) 283052ba56SArnaldo Carvalho de Melo #define isgraph(c) ((__ismask(c)&(_P|_U|_L|_D)) != 0) 293052ba56SArnaldo Carvalho de Melo #define islower(c) ((__ismask(c)&(_L)) != 0) 303052ba56SArnaldo Carvalho de Melo #define isprint(c) ((__ismask(c)&(_P|_U|_L|_D|_SP)) != 0) 313052ba56SArnaldo Carvalho de Melo #define ispunct(c) ((__ismask(c)&(_P)) != 0) 323052ba56SArnaldo Carvalho de Melo /* Note: isspace() must return false for %NUL-terminator */ 333052ba56SArnaldo Carvalho de Melo #define isspace(c) ((__ismask(c)&(_S)) != 0) 343052ba56SArnaldo Carvalho de Melo #define isupper(c) ((__ismask(c)&(_U)) != 0) 353052ba56SArnaldo Carvalho de Melo #define isxdigit(c) ((__ismask(c)&(_D|_X)) != 0) 363052ba56SArnaldo Carvalho de Melo 373052ba56SArnaldo Carvalho de Melo #define isascii(c) (((unsigned char)(c))<=0x7f) 383052ba56SArnaldo Carvalho de Melo #define toascii(c) (((unsigned char)(c))&0x7f) 393052ba56SArnaldo Carvalho de Melo 40*23cd9543SArnaldo Carvalho de Melo #if __has_builtin(__builtin_isdigit) 41*23cd9543SArnaldo Carvalho de Melo #define isdigit(c) __builtin_isdigit(c) 42*23cd9543SArnaldo Carvalho de Melo #else __isdigit(int c)43*23cd9543SArnaldo Carvalho de Melostatic inline int __isdigit(int c) 44*23cd9543SArnaldo Carvalho de Melo { 45*23cd9543SArnaldo Carvalho de Melo return '0' <= c && c <= '9'; 46*23cd9543SArnaldo Carvalho de Melo } 47*23cd9543SArnaldo Carvalho de Melo #define isdigit(c) __isdigit(c) 48*23cd9543SArnaldo Carvalho de Melo #endif 49*23cd9543SArnaldo Carvalho de Melo __tolower(unsigned char c)503052ba56SArnaldo Carvalho de Melostatic inline unsigned char __tolower(unsigned char c) 513052ba56SArnaldo Carvalho de Melo { 523052ba56SArnaldo Carvalho de Melo if (isupper(c)) 533052ba56SArnaldo Carvalho de Melo c -= 'A'-'a'; 543052ba56SArnaldo Carvalho de Melo return c; 553052ba56SArnaldo Carvalho de Melo } 563052ba56SArnaldo Carvalho de Melo __toupper(unsigned char c)573052ba56SArnaldo Carvalho de Melostatic inline unsigned char __toupper(unsigned char c) 583052ba56SArnaldo Carvalho de Melo { 593052ba56SArnaldo Carvalho de Melo if (islower(c)) 603052ba56SArnaldo Carvalho de Melo c -= 'a'-'A'; 613052ba56SArnaldo Carvalho de Melo return c; 623052ba56SArnaldo Carvalho de Melo } 633052ba56SArnaldo Carvalho de Melo 643052ba56SArnaldo Carvalho de Melo #define tolower(c) __tolower(c) 653052ba56SArnaldo Carvalho de Melo #define toupper(c) __toupper(c) 663052ba56SArnaldo Carvalho de Melo 673052ba56SArnaldo Carvalho de Melo /* 683052ba56SArnaldo Carvalho de Melo * Fast implementation of tolower() for internal usage. Do not use in your 693052ba56SArnaldo Carvalho de Melo * code. 703052ba56SArnaldo Carvalho de Melo */ _tolower(const char c)713052ba56SArnaldo Carvalho de Melostatic inline char _tolower(const char c) 723052ba56SArnaldo Carvalho de Melo { 733052ba56SArnaldo Carvalho de Melo return c | 0x20; 743052ba56SArnaldo Carvalho de Melo } 753052ba56SArnaldo Carvalho de Melo 763052ba56SArnaldo Carvalho de Melo /* Fast check for octal digit */ isodigit(const char c)773052ba56SArnaldo Carvalho de Melostatic inline int isodigit(const char c) 783052ba56SArnaldo Carvalho de Melo { 793052ba56SArnaldo Carvalho de Melo return c >= '0' && c <= '7'; 803052ba56SArnaldo Carvalho de Melo } 813052ba56SArnaldo Carvalho de Melo 823052ba56SArnaldo Carvalho de Melo #endif 83