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 | |
86 | typedef unsigned char byte; |
87 | |
88 | |
89 | #define BITSPERCHAR 8 |
90 | |
91 | #define CHARSETSIZE ((UCHAR_MAX/BITSPERCHAR) + 1) |
92 | |
93 | |
94 | |
95 | typedef 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 | |