xref: /freebsd-src/contrib/lua/src/lctype.h (revision 0495ed398c4f64013bab2327eb13a303e1f90c13)
18e3e3a7aSWarner Losh /*
2*0495ed39SKyle Evans ** $Id: lctype.h $
38e3e3a7aSWarner Losh ** 'ctype' functions for Lua
48e3e3a7aSWarner Losh ** See Copyright Notice in lua.h
58e3e3a7aSWarner Losh */
68e3e3a7aSWarner Losh 
78e3e3a7aSWarner Losh #ifndef lctype_h
88e3e3a7aSWarner Losh #define lctype_h
98e3e3a7aSWarner Losh 
108e3e3a7aSWarner Losh #include "lua.h"
118e3e3a7aSWarner Losh 
128e3e3a7aSWarner Losh 
138e3e3a7aSWarner Losh /*
148e3e3a7aSWarner Losh ** WARNING: the functions defined here do not necessarily correspond
158e3e3a7aSWarner Losh ** to the similar functions in the standard C ctype.h. They are
16*0495ed39SKyle Evans ** optimized for the specific needs of Lua.
178e3e3a7aSWarner Losh */
188e3e3a7aSWarner Losh 
198e3e3a7aSWarner Losh #if !defined(LUA_USE_CTYPE)
208e3e3a7aSWarner Losh 
218e3e3a7aSWarner Losh #if 'A' == 65 && '0' == 48
228e3e3a7aSWarner Losh /* ASCII case: can use its own tables; faster and fixed */
238e3e3a7aSWarner Losh #define LUA_USE_CTYPE	0
248e3e3a7aSWarner Losh #else
258e3e3a7aSWarner Losh /* must use standard C ctype */
268e3e3a7aSWarner Losh #define LUA_USE_CTYPE	1
278e3e3a7aSWarner Losh #endif
288e3e3a7aSWarner Losh 
298e3e3a7aSWarner Losh #endif
308e3e3a7aSWarner Losh 
318e3e3a7aSWarner Losh 
328e3e3a7aSWarner Losh #if !LUA_USE_CTYPE	/* { */
338e3e3a7aSWarner Losh 
348e3e3a7aSWarner Losh #include <limits.h>
358e3e3a7aSWarner Losh 
368e3e3a7aSWarner Losh #include "llimits.h"
378e3e3a7aSWarner Losh 
388e3e3a7aSWarner Losh 
398e3e3a7aSWarner Losh #define ALPHABIT	0
408e3e3a7aSWarner Losh #define DIGITBIT	1
418e3e3a7aSWarner Losh #define PRINTBIT	2
428e3e3a7aSWarner Losh #define SPACEBIT	3
438e3e3a7aSWarner Losh #define XDIGITBIT	4
448e3e3a7aSWarner Losh 
458e3e3a7aSWarner Losh 
468e3e3a7aSWarner Losh #define MASK(B)		(1 << (B))
478e3e3a7aSWarner Losh 
488e3e3a7aSWarner Losh 
498e3e3a7aSWarner Losh /*
508e3e3a7aSWarner Losh ** add 1 to char to allow index -1 (EOZ)
518e3e3a7aSWarner Losh */
528e3e3a7aSWarner Losh #define testprop(c,p)	(luai_ctype_[(c)+1] & (p))
538e3e3a7aSWarner Losh 
548e3e3a7aSWarner Losh /*
558e3e3a7aSWarner Losh ** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_'
568e3e3a7aSWarner Losh */
578e3e3a7aSWarner Losh #define lislalpha(c)	testprop(c, MASK(ALPHABIT))
588e3e3a7aSWarner Losh #define lislalnum(c)	testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT)))
598e3e3a7aSWarner Losh #define lisdigit(c)	testprop(c, MASK(DIGITBIT))
608e3e3a7aSWarner Losh #define lisspace(c)	testprop(c, MASK(SPACEBIT))
618e3e3a7aSWarner Losh #define lisprint(c)	testprop(c, MASK(PRINTBIT))
628e3e3a7aSWarner Losh #define lisxdigit(c)	testprop(c, MASK(XDIGITBIT))
638e3e3a7aSWarner Losh 
64*0495ed39SKyle Evans 
658e3e3a7aSWarner Losh /*
66*0495ed39SKyle Evans ** In ASCII, this 'ltolower' is correct for alphabetic characters and
67*0495ed39SKyle Evans ** for '.'. That is enough for Lua needs. ('check_exp' ensures that
68*0495ed39SKyle Evans ** the character either is an upper-case letter or is unchanged by
69*0495ed39SKyle Evans ** the transformation, which holds for lower-case letters and '.'.)
708e3e3a7aSWarner Losh */
71*0495ed39SKyle Evans #define ltolower(c)  \
72*0495ed39SKyle Evans   check_exp(('A' <= (c) && (c) <= 'Z') || (c) == ((c) | ('A' ^ 'a')),  \
73*0495ed39SKyle Evans             (c) | ('A' ^ 'a'))
748e3e3a7aSWarner Losh 
758e3e3a7aSWarner Losh 
76*0495ed39SKyle Evans /* one entry for each character and for -1 (EOZ) */
77*0495ed39SKyle Evans LUAI_DDEC(const lu_byte luai_ctype_[UCHAR_MAX + 2];)
788e3e3a7aSWarner Losh 
798e3e3a7aSWarner Losh 
808e3e3a7aSWarner Losh #else			/* }{ */
818e3e3a7aSWarner Losh 
828e3e3a7aSWarner Losh /*
838e3e3a7aSWarner Losh ** use standard C ctypes
848e3e3a7aSWarner Losh */
858e3e3a7aSWarner Losh 
868e3e3a7aSWarner Losh #include <ctype.h>
878e3e3a7aSWarner Losh 
888e3e3a7aSWarner Losh 
898e3e3a7aSWarner Losh #define lislalpha(c)	(isalpha(c) || (c) == '_')
908e3e3a7aSWarner Losh #define lislalnum(c)	(isalnum(c) || (c) == '_')
918e3e3a7aSWarner Losh #define lisdigit(c)	(isdigit(c))
928e3e3a7aSWarner Losh #define lisspace(c)	(isspace(c))
938e3e3a7aSWarner Losh #define lisprint(c)	(isprint(c))
948e3e3a7aSWarner Losh #define lisxdigit(c)	(isxdigit(c))
958e3e3a7aSWarner Losh 
968e3e3a7aSWarner Losh #define ltolower(c)	(tolower(c))
978e3e3a7aSWarner Losh 
988e3e3a7aSWarner Losh #endif			/* } */
998e3e3a7aSWarner Losh 
1008e3e3a7aSWarner Losh #endif
1018e3e3a7aSWarner Losh 
102