1/*
2** $Id: lptypes.h,v 1.16 2017/01/13 13:33:17 roberto Exp $
3** LPeg - PEG pattern matching for Lua
4** Copyright 2007-2017, Lua.org & PUC-Rio (see 'lpeg.html' for license)
5** written by Roberto Ierusalimschy
6*/
7
8#if !defined(lptypes_h)
9#define lptypes_h
10
11
12#if !defined(LPEG_DEBUG)
13#define NDEBUG
14#endif
15
16#include <assert.h>
17#include <limits.h>
18
19#include "lua.h"
20
21
22#define VERSION "1.0.1"
23
24
25#define PATTERN_T "lpeg-pattern"
26#define MAXSTACKIDX "lpeg-maxstack"
27
28
29/*
30** compatibility with Lua 5.1
31*/
32#if (LUA_VERSION_NUM == 501)
33
34#define lp_equal lua_equal
35
36#define lua_getuservalue lua_getfenv
37#define lua_setuservalue lua_setfenv
38
39#define lua_rawlen lua_objlen
40
41#define luaL_setfuncs(L,f,n) luaL_register(L,NULL,f)
42#define luaL_newlib(L,f) luaL_register(L,"lpeg",f)
43
44#endif
45
46
47#if !defined(lp_equal)
48#define lp_equal(L,idx1,idx2) lua_compare(L,(idx1),(idx2),LUA_OPEQ)
49#endif
50
51
52/* default maximum size for call/backtrack stack */
53#if !defined(MAXBACK)
54#define MAXBACK 400
55#endif
56
57
58/* maximum number of rules in a grammar (limited by 'unsigned char') */
59#if !defined(MAXRULES)
60#define MAXRULES 250
61#endif
62
63
64
65/* initial size for capture's list */
66#define INITCAPSIZE 32
67
68
69/* index, on Lua stack, for subject */
70#define SUBJIDX 2
71
72/* number of fixed arguments to 'match' (before capture arguments) */
73#define FIXEDARGS 3
74
75/* index, on Lua stack, for capture list */
76#define caplistidx(ptop) ((ptop) + 2)
77
78/* index, on Lua stack, for pattern's ktable */
79#define ktableidx(ptop) ((ptop) + 3)
80
81/* index, on Lua stack, for backtracking stack */
82#define stackidx(ptop) ((ptop) + 4)
83
84
85
86typedef unsigned char byte;
87
88
89#define BITSPERCHAR 8
90
91#define CHARSETSIZE ((UCHAR_MAX/BITSPERCHAR) + 1)
92
93
94
95typedef struct Charset {
96 byte cs[CHARSETSIZE];
97} Charset;
98
99
100
101#define loopset(v,b) { int v; for (v = 0; v < CHARSETSIZE; v++) {b;} }
102
103/* access to charset */
104#define treebuffer(t) ((byte *)((t) + 1))
105
106/* number of slots needed for 'n' bytes */
107#define bytes2slots(n) (((n) - 1) / sizeof(TTree) + 1)
108
109/* set 'b' bit in charset 'cs' */
110#define setchar(cs,b) ((cs)[(b) >> 3] |= (1 << ((b) & 7)))
111
112
113/*
114** in capture instructions, 'kind' of capture and its offset are
115** packed in field 'aux', 4 bits for each
116*/
117#define getkind(op) ((op)->i.aux & 0xF)
118#define getoff(op) (((op)->i.aux >> 4) & 0xF)
119#define joinkindoff(k,o) ((k) | ((o) << 4))
120
121#define MAXOFF 0xF
122#define MAXAUX 0xFF
123
124
125/* maximum number of bytes to look behind */
126#define MAXBEHIND MAXAUX
127
128
129/* maximum size (in elements) for a pattern */
130#define MAXPATTSIZE (SHRT_MAX - 10)
131
132
133/* size (in elements) for an instruction plus extra l bytes */
134#define instsize(l) (((l) + sizeof(Instruction) - 1)/sizeof(Instruction) + 1)
135
136
137/* size (in elements) for a ISet instruction */
138#define CHARSETINSTSIZE instsize(CHARSETSIZE)
139
140/* size (in elements) for a IFunc instruction */
141#define funcinstsize(p) ((p)->i.aux + 2)
142
143
144
145#define testchar(st,c) (((int)(st)[((c) >> 3)] & (1 << ((c) & 7))))
146
147
148#endif
149
150