zombiezen.com/go/lua@v0.0.0-20231013005828-290725fb9140/internal/lua54/lctype.h (about)

     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