lua

A copy of the Lua development repository
Log | Files | Refs | README

lctype.h (2115B)


      1 /*
      2 ** $Id: lctype.h $
      3 ** 'ctype' functions for Lua
      4 ** See Copyright Notice in lua.h
      5 */
      6 
      7 #ifndef lctype_h
      8 #define lctype_h
      9 
     10 #include "lua.h"
     11 
     12 
     13 /*
     14 ** WARNING: the functions defined here do not necessarily correspond
     15 ** to the similar functions in the standard C ctype.h. They are
     16 ** optimized for the specific needs of Lua.
     17 */
     18 
     19 #if !defined(LUA_USE_CTYPE)
     20 
     21 #if 'A' == 65 && '0' == 48
     22 /* ASCII case: can use its own tables; faster and fixed */
     23 #define LUA_USE_CTYPE	0
     24 #else
     25 /* must use standard C ctype */
     26 #define LUA_USE_CTYPE	1
     27 #endif
     28 
     29 #endif
     30 
     31 
     32 #if !LUA_USE_CTYPE	/* { */
     33 
     34 #include <limits.h>
     35 
     36 #include "llimits.h"
     37 
     38 
     39 #define ALPHABIT	0
     40 #define DIGITBIT	1
     41 #define PRINTBIT	2
     42 #define SPACEBIT	3
     43 #define XDIGITBIT	4
     44 
     45 
     46 #define MASK(B)		(1 << (B))
     47 
     48 
     49 /*
     50 ** add 1 to char to allow index -1 (EOZ)
     51 */
     52 #define testprop(c,p)	(luai_ctype_[(c)+1] & (p))
     53 
     54 /*
     55 ** 'lalpha' (Lua alphabetic) and 'lalnum' (Lua alphanumeric) both include '_'
     56 */
     57 #define lislalpha(c)	testprop(c, MASK(ALPHABIT))
     58 #define lislalnum(c)	testprop(c, (MASK(ALPHABIT) | MASK(DIGITBIT)))
     59 #define lisdigit(c)	testprop(c, MASK(DIGITBIT))
     60 #define lisspace(c)	testprop(c, MASK(SPACEBIT))
     61 #define lisprint(c)	testprop(c, MASK(PRINTBIT))
     62 #define lisxdigit(c)	testprop(c, MASK(XDIGITBIT))
     63 
     64 
     65 /*
     66 ** In ASCII, this 'ltolower' is correct for alphabetic characters and
     67 ** for '.'. That is enough for Lua needs. ('check_exp' ensures that
     68 ** the character either is an upper-case letter or is unchanged by
     69 ** the transformation, which holds for lower-case letters and '.'.)
     70 */
     71 #define ltolower(c)  \
     72   check_exp(('A' <= (c) && (c) <= 'Z') || (c) == ((c) | ('A' ^ 'a')),  \
     73             (c) | ('A' ^ 'a'))
     74 
     75 
     76 /* one entry for each character and for -1 (EOZ) */
     77 LUAI_DDEC(const lu_byte luai_ctype_[UCHAR_MAX + 2];)
     78 
     79 
     80 #else			/* }{ */
     81 
     82 /*
     83 ** use standard C ctypes
     84 */
     85 
     86 #include <ctype.h>
     87 
     88 
     89 #define lislalpha(c)	(isalpha(c) || (c) == '_')
     90 #define lislalnum(c)	(isalnum(c) || (c) == '_')
     91 #define lisdigit(c)	(isdigit(c))
     92 #define lisspace(c)	(isspace(c))
     93 #define lisprint(c)	(isprint(c))
     94 #define lisxdigit(c)	(isxdigit(c))
     95 
     96 #define ltolower(c)	(tolower(c))
     97 
     98 #endif			/* } */
     99 
    100 #endif
    101