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