Home | History | Annotate | Download | only in src
      1 /*
      2 ** $Id: lctype.h,v 1.12 2011/07/15 12:50:29 roberto Exp $
      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 ** this 'ltolower' only works for alphabetic characters
     66 */
     67 #define ltolower(c)	((c) | ('A' ^ 'a'))
     68 
     69 
     70 /* two more entries for 0 and -1 (EOZ) */
     71 LUAI_DDEC const lu_byte luai_ctype_[UCHAR_MAX + 2];
     72 
     73 
     74 #else			/* }{ */
     75 
     76 /*
     77 ** use standard C ctypes
     78 */
     79 
     80 #include <ctype.h>
     81 
     82 
     83 #define lislalpha(c)	(isalpha(c) || (c) == '_')
     84 #define lislalnum(c)	(isalnum(c) || (c) == '_')
     85 #define lisdigit(c)	(isdigit(c))
     86 #define lisspace(c)	(isspace(c))
     87 #define lisprint(c)	(isprint(c))
     88 #define lisxdigit(c)	(isxdigit(c))
     89 
     90 #define ltolower(c)	(tolower(c))
     91 
     92 #endif			/* } */
     93 
     94 #endif
     95 
     96