summaryrefslogtreecommitdiff
path: root/pop.c
diff options
context:
space:
mode:
authorXavier Del Campo Romero <xavi92@disroot.org>2026-05-09 02:56:07 +0200
committerXavier Del Campo Romero <xavi92@disroot.org>2026-05-31 20:43:27 +0200
commit8c4f46dca6a1bb02082886beac46cbb8e4cf2bbb (patch)
tree2fa198377214bac01713fcfd6004eb7ca3515dfe /pop.c
downloadslcob-8c4f46dca6a1bb02082886beac46cbb8e4cf2bbb.tar.gz
Add project skeleton
Diffstat (limited to 'pop.c')
-rw-r--r--pop.c37
1 files changed, 37 insertions, 0 deletions
diff --git a/pop.c b/pop.c
new file mode 100644
index 0000000..c97385c
--- /dev/null
+++ b/pop.c
@@ -0,0 +1,37 @@
+#include "prv.h"
+#include <stdlib.h>
+
+int pop(const struct lex *l, struct prv *p)
+{
+ size_t n;
+ struct pos *pos = NULL;
+
+ if (!p->n)
+ {
+ fprintf(stderr, "%s: underflow\n", __func__);
+ return -1;
+ }
+ else if (!(n = p->n - 1))
+ {
+ free(p->pos);
+ p->pos = NULL;
+ }
+ else if (!(pos = realloc(p->pos, n * sizeof *pos)))
+ {
+ perror("realloc(3)");
+ return -1;
+ }
+
+ p->pos = pos;
+ p->n = n;
+
+ if (p->n)
+ {
+ const struct pos *old = &p->pos[--p->i];
+
+ if (old->seq->end && old->seq->end(l, p))
+ return -1;
+ }
+
+ return 0;
+}