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) */
 77LUAI_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