diff options
Diffstat (limited to 'src/prc1/pop.c')
| -rw-r--r-- | src/prc1/pop.c | 30 |
1 files changed, 20 insertions, 10 deletions
diff --git a/src/prc1/pop.c b/src/prc1/pop.c index ba2f3a1..977129e 100644 --- a/src/prc1/pop.c +++ b/src/prc1/pop.c @@ -1,20 +1,28 @@ #include "prv.h" +#include "dbg.h" #include <stdlib.h> int pop(const struct lex *l, struct prv *p) { size_t n; - struct pos *pos = NULL; + struct pos *pos; + int (*end)(const struct lex *, struct prv *); + const char *name; if (!p->n) { fprintf(stderr, "%s: underflow\n", __func__); return -1; } - else if (!(n = p->n - 1)) + + pos = &p->pos[p->i]; + end = pos->end; + name = pos->name; + + if (!(n = p->n - 1)) { free(p->pos); - p->pos = NULL; + p->pos = pos = NULL; } else if (!(pos = realloc(p->pos, n * sizeof *pos))) { @@ -22,16 +30,18 @@ int pop(const struct lex *l, struct prv *p) return -1; } + ddbg("pop rule %s [%zu]", name, p->i); + + if (end) + ddbg(", end=%p", end); + + ddbg("\n"); p->pos = pos; p->n = n; + p->i--; - if (p->n) - { - const struct pos *old = &p->pos[--p->i]; - - if (old->end && old->end(l, p)) - return -1; - } + if (end) + return end(l, p); return 0; } |
