From 4e814a03cf077a36bfed4985705276cd875c752c Mon Sep 17 00:00:00 2001 From: June McEnroe Date: Sun, 18 Nov 2018 01:41:46 -0500 Subject: Add seeds of edi --- bin/edi/log.c | 63 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 63 insertions(+) create mode 100644 bin/edi/log.c (limited to 'bin/edi/log.c') diff --git a/bin/edi/log.c b/bin/edi/log.c new file mode 100644 index 00000000..b0bd117e --- /dev/null +++ b/bin/edi/log.c @@ -0,0 +1,63 @@ +/* Copyright (C) 2018 June McEnroe + * + * This program is free software: you can redistribute it and/or modify + * it under the terms of the GNU Affero General Public License as published by + * the Free Software Foundation, either version 3 of the License, or + * (at your option) any later version. + * + * This program is distributed in the hope that it will be useful, + * but WITHOUT ANY WARRANTY; without even the implied warranty of + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the + * GNU Affero General Public License for more details. + * + * You should have received a copy of the GNU Affero General Public License + * along with this program. If not, see . + */ + +#include +#include +#include +#include +#include + +#include "edi.h" + +struct Log logAlloc(size_t cap) { + assert(cap); + struct State *states = malloc(sizeof(*states) * cap); + if (!states) err(EX_OSERR, "malloc"); + states[0] = (struct State) { + .table = NULL, + .prev = 0, + .next = 0, + }; + return (struct Log) { + .cap = cap, + .len = 1, + .index = 0, + .states = states, + }; +} + +void logFree(struct Log *log) { + for (size_t i = 0; i < log->len; ++i) { + free(log->states[i].table); + } + free(log->states); +} + +void logPush(struct Log *log, struct Table *table) { + if (log->len == log->cap) { + log->cap *= 2; + log->states = realloc(log->states, sizeof(*log->states) * log->cap); + if (!log->states) err(EX_OSERR, "realloc"); + } + size_t next = log->len++; + log->states[next] = (struct State) { + .table = table, + .prev = log->index, + .next = next, + }; + log->states[log->index].next = next; + log->index = next; +} -- cgit 1.4.1