summaryrefslogtreecommitdiff
path: root/push.c
diff options
context:
space:
mode:
Diffstat (limited to 'push.c')
-rw-r--r--push.c26
1 files changed, 26 insertions, 0 deletions
diff --git a/push.c b/push.c
new file mode 100644
index 0000000..d31de5e
--- /dev/null
+++ b/push.c
@@ -0,0 +1,26 @@
+#include "prv.h"
+#include <stdlib.h>
+
+int push(const struct pos *pos, struct prv *p)
+{
+ size_t n = p->n + 1;
+ struct pos *npos = realloc(p->pos, n * sizeof *npos);
+
+ if (!npos)
+ {
+ perror("realloc(3)");
+ return -1;
+ }
+ else if (p->n)
+ {
+ struct pos *prev = &npos[p->n - 1];
+
+ prev->seq = prev->stseq;
+ prev->step = prev->seq->steps;
+ p->i++;
+ }
+
+ npos[p->n++] = *pos;
+ p->pos = npos;
+ return 0;
+}