diff options
author | Sergio Medeiros <sqmedeiros@gmail.com> | 2015-03-23 14:13:25 -0300 |
---|---|---|
committer | Sergio Medeiros <sqmedeiros@gmail.com> | 2015-03-23 14:13:25 -0300 |
commit | 0e93d536ba2d312502737cce2ab0cc21393c4842 (patch) | |
tree | 7de1e3ae967c90a43e7086ccef61d1722881b20c /lpvm.c | |
parent | a5a4b257e626847be3be4878c603adb51cbb420f (diff) | |
download | lpeglabel-0e93d536ba2d312502737cce2ab0cc21393c4842.tar.gz lpeglabel-0e93d536ba2d312502737cce2ab0cc21393c4842.tar.bz2 lpeglabel-0e93d536ba2d312502737cce2ab0cc21393c4842.zip |
Updating to lpeg 0.12.2
Diffstat (limited to 'lpvm.c')
-rw-r--r-- | lpvm.c | 55 |
1 files changed, 26 insertions, 29 deletions
@@ -38,7 +38,7 @@ typedef struct Stack { | |||
38 | const char *s; /* saved position (or NULL for calls) */ | 38 | const char *s; /* saved position (or NULL for calls) */ |
39 | const Instruction *p; /* next instruction */ | 39 | const Instruction *p; /* next instruction */ |
40 | int caplevel; | 40 | int caplevel; |
41 | Labelset ls; /* labeled failure */ | 41 | Labelset ls; /* labeled failure */ |
42 | } Stack; | 42 | } Stack; |
43 | 43 | ||
44 | 44 | ||
@@ -146,7 +146,7 @@ static int removedyncap (lua_State *L, Capture *capture, | |||
146 | ** Opcode interpreter | 146 | ** Opcode interpreter |
147 | */ | 147 | */ |
148 | const char *match (lua_State *L, const char *o, const char *s, const char *e, | 148 | const char *match (lua_State *L, const char *o, const char *s, const char *e, |
149 | Instruction *op, Capture *capture, int ptop, Labelset *labelf) { | 149 | Instruction *op, Capture *capture, int ptop, Labelset *labelf) { /* labeled failure */ |
150 | Stack stackbase[INITBACK]; | 150 | Stack stackbase[INITBACK]; |
151 | Stack *stacklimit = stackbase + INITBACK; | 151 | Stack *stacklimit = stackbase + INITBACK; |
152 | Stack *stack = stackbase; /* point to first empty slot in stack */ | 152 | Stack *stack = stackbase; /* point to first empty slot in stack */ |
@@ -157,7 +157,7 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e, | |||
157 | stack->p = &giveup; stack->s = s; stack->caplevel = 0; stack++; | 157 | stack->p = &giveup; stack->s = s; stack->caplevel = 0; stack++; |
158 | lua_pushlightuserdata(L, stackbase); | 158 | lua_pushlightuserdata(L, stackbase); |
159 | for (;;) { | 159 | for (;;) { |
160 | #if defined(LPEGDEBUG) | 160 | #if defined(DEBUG) |
161 | printf("s: |%s| stck:%d, dyncaps:%d, caps:%d ", | 161 | printf("s: |%s| stck:%d, dyncaps:%d, caps:%d ", |
162 | s, stack - getstackbase(L, ptop), ndyncap, captop); | 162 | s, stack - getstackbase(L, ptop), ndyncap, captop); |
163 | printinst(op, p); | 163 | printinst(op, p); |
@@ -183,9 +183,9 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e, | |||
183 | case IAny: { | 183 | case IAny: { |
184 | if (s < e) { p++; s++; } | 184 | if (s < e) { p++; s++; } |
185 | else { | 185 | else { |
186 | *labelf = LFAIL; /* labeled failure */ | 186 | *labelf = LFAIL; /* labeled failure */ |
187 | goto fail; | 187 | goto fail; |
188 | } | 188 | } |
189 | continue; | 189 | continue; |
190 | } | 190 | } |
191 | case ITestAny: { | 191 | case ITestAny: { |
@@ -196,9 +196,9 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e, | |||
196 | case IChar: { | 196 | case IChar: { |
197 | if ((byte)*s == p->i.aux && s < e) { p++; s++; } | 197 | if ((byte)*s == p->i.aux && s < e) { p++; s++; } |
198 | else { | 198 | else { |
199 | *labelf = LFAIL; /* labeled failure */ | 199 | *labelf = LFAIL; /* labeled failure */ |
200 | goto fail; | 200 | goto fail; |
201 | } | 201 | } |
202 | continue; | 202 | continue; |
203 | } | 203 | } |
204 | case ITestChar: { | 204 | case ITestChar: { |
@@ -211,9 +211,9 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e, | |||
211 | if (testchar((p+1)->buff, c) && s < e) | 211 | if (testchar((p+1)->buff, c) && s < e) |
212 | { p += CHARSETINSTSIZE; s++; } | 212 | { p += CHARSETINSTSIZE; s++; } |
213 | else { | 213 | else { |
214 | *labelf = LFAIL; /* labeled failure */ | 214 | *labelf = LFAIL; /* labeled failure */ |
215 | goto fail; | 215 | goto fail; |
216 | } | 216 | } |
217 | continue; | 217 | continue; |
218 | } | 218 | } |
219 | case ITestSet: { | 219 | case ITestSet: { |
@@ -226,9 +226,9 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e, | |||
226 | case IBehind: { | 226 | case IBehind: { |
227 | int n = p->i.aux; | 227 | int n = p->i.aux; |
228 | if (n > s - o) { | 228 | if (n > s - o) { |
229 | *labelf = LFAIL; /* labeled failure */ | 229 | *labelf = LFAIL; /* labeled failure */ |
230 | goto fail; | 230 | goto fail; |
231 | } | 231 | } |
232 | s -= n; p++; | 232 | s -= n; p++; |
233 | continue; | 233 | continue; |
234 | } | 234 | } |
@@ -249,24 +249,23 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e, | |||
249 | stack = doublestack(L, &stacklimit, ptop); | 249 | stack = doublestack(L, &stacklimit, ptop); |
250 | stack->p = p + getoffset(p); | 250 | stack->p = p + getoffset(p); |
251 | stack->s = s; | 251 | stack->s = s; |
252 | stack->ls = LFAIL; /* labeled failure */ | 252 | stack->ls = LFAIL; /* labeled failure */ |
253 | stack->caplevel = captop; | 253 | stack->caplevel = captop; |
254 | stack++; | 254 | stack++; |
255 | p += 2; | 255 | p += 2; |
256 | continue; | 256 | continue; |
257 | } | 257 | } |
258 | case ILabChoice: { /* labeled failure */ | 258 | case ILabChoice: { /* labeled failure */ |
259 | if (stack == stacklimit) | 259 | if (stack == stacklimit) |
260 | stack = doublestack(L, &stacklimit, ptop); | 260 | stack = doublestack(L, &stacklimit, ptop); |
261 | stack->p = p + getoffset(p); | 261 | stack->p = p + getoffset(p); |
262 | stack->s = s; | 262 | stack->s = s; |
263 | stack->ls = (p + 2)->labels; | 263 | stack->ls = (p + 2)->labels; |
264 | stack->caplevel = captop; | 264 | stack->caplevel = captop; |
265 | stack++; | 265 | stack++; |
266 | p += 3; | 266 | p += 3; |
267 | continue; | 267 | continue; |
268 | } | 268 | } |
269 | |||
270 | case ICall: { | 269 | case ICall: { |
271 | if (stack == stacklimit) | 270 | if (stack == stacklimit) |
272 | stack = doublestack(L, &stacklimit, ptop); | 271 | stack = doublestack(L, &stacklimit, ptop); |
@@ -296,22 +295,20 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e, | |||
296 | p += getoffset(p); | 295 | p += getoffset(p); |
297 | continue; | 296 | continue; |
298 | } | 297 | } |
299 | case IThrow: { /* labeled failure */ | 298 | case IThrow: { /* labeled failure */ |
300 | *labelf = (p+1)->labels; | 299 | *labelf = (p+1)->labels; |
301 | goto fail; | 300 | goto fail; |
302 | } | 301 | } |
303 | case IFailTwice: | 302 | case IFailTwice: |
304 | assert(stack > getstackbase(L, ptop)); | 303 | assert(stack > getstackbase(L, ptop)); |
305 | stack--; | 304 | stack--; |
306 | /* go through */ | 305 | /* go through */ |
307 | case IFail: | 306 | case IFail: |
308 | *labelf = LFAIL; /* labeled failure */ | 307 | *labelf = LFAIL; /* labeled failure */ |
309 | fail: { /* pattern failed: try to backtrack */ | 308 | fail: { /* pattern failed: try to backtrack */ |
310 | do { /* remove pending calls */ | 309 | do { /* remove pending calls */ |
311 | assert(stack > getstackbase(L, ptop)); | 310 | assert(stack > getstackbase(L, ptop)); |
312 | s = (--stack)->s; | 311 | s = (--stack)->s; |
313 | /*printf("fail (s == NULL => %d), labelf=%d stack->ls=%d (stack-> == giveup %d)\n", | ||
314 | s == NULL, labelf, stack->ls, stack->p == &giveup);*/ | ||
315 | } while (s == NULL || (!(stack->ls & *labelf) && stack->p != &giveup)); | 312 | } while (s == NULL || (!(stack->ls & *labelf) && stack->p != &giveup)); |
316 | if (ndyncap > 0) /* is there matchtime captures? */ | 313 | if (ndyncap > 0) /* is there matchtime captures? */ |
317 | ndyncap -= removedyncap(L, capture, stack->caplevel, captop); | 314 | ndyncap -= removedyncap(L, capture, stack->caplevel, captop); |
@@ -328,10 +325,10 @@ const char *match (lua_State *L, const char *o, const char *s, const char *e, | |||
328 | captop -= n; /* remove nested captures */ | 325 | captop -= n; /* remove nested captures */ |
329 | fr -= rem; /* 'rem' items were popped from Lua stack */ | 326 | fr -= rem; /* 'rem' items were popped from Lua stack */ |
330 | res = resdyncaptures(L, fr, s - o, e - o); /* get result */ | 327 | res = resdyncaptures(L, fr, s - o, e - o); /* get result */ |
331 | if (res == -1) { /* fail? */ | 328 | if (res == -1) { /* fail? */ |
332 | *labelf = LFAIL; /* labeled failure */ | 329 | *labelf = LFAIL; /* labeled failure */ |
333 | goto fail; | 330 | goto fail; |
334 | } | 331 | } |
335 | s = o + res; /* else update current position */ | 332 | s = o + res; /* else update current position */ |
336 | n = lua_gettop(L) - fr + 1; /* number of new captures */ | 333 | n = lua_gettop(L) - fr + 1; /* number of new captures */ |
337 | ndyncap += n - rem; /* update number of dynamic captures */ | 334 | ndyncap += n - rem; /* update number of dynamic captures */ |