#include "prv.h" #include "dbg.h" #include int pop(const struct lex *l, struct prv *p) { size_t n; struct pos *pos; int (*end)(const struct lex *, struct prv *); const char *name; if (!p->n) { fprintf(stderr, "%s: underflow\n", __func__); return -1; } pos = &p->pos[p->i]; end = pos->end; name = pos->name; if (!(n = p->n - 1)) { free(p->pos); p->pos = pos = NULL; } else if (!(pos = realloc(p->pos, n * sizeof *pos))) { perror("realloc(3)"); 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 (end) return end(l, p); return 0; }