xref: /linux-6.15/tools/include/linux/ctype.h (revision 23cd9543)
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 Melo static 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 Melo static 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 Melo static 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 Melo static 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 Melo static 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