diff options
| author | Xavier Del Campo Romero <xavi92@disroot.org> | 2026-10-01 01:04:30 +0200 |
|---|---|---|
| committer | Xavier Del Campo Romero <xavi92@disroot.org> | 2026-10-05 00:38:49 +0200 |
| commit | 2b0d4ead061a39da9dbd705c18c9955549c4d405 (patch) | |
| tree | 1412ac39adce3428b96caf67b1e7543f6c1246a5 /src/prc1/pop.c | |
| parent | 9140988be4e5bb028b7140aca1a67af1370c72a7 (diff) | |
| download | prc-2b0d4ead061a39da9dbd705c18c9955549c4d405.tar.gz | |
WIP symsym
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; } |
