From e4153a1990695daf33bcf8b0f004e201b721bb03 Mon Sep 17 00:00:00 2001 From: Curtis McEnroe Date: Sun, 18 Nov 2018 01:41:46 -0500 Subject: Add seeds of edi --- bin/edi/edi.h | 86 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 86 insertions(+) create mode 100644 bin/edi/edi.h (limited to 'bin/edi/edi.h') diff --git a/bin/edi/edi.h b/bin/edi/edi.h new file mode 100644 index 00000000..77c9d734 --- /dev/null +++ b/bin/edi/edi.h @@ -0,0 +1,86 @@ +/* Copyright (C) 2018 Curtis 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 + +struct Span { + size_t at, to; +}; + +static inline struct Span spanNext(struct Span span, size_t len) { + return (struct Span) { span.to, span.to + len }; +} + +struct Slice { + const wchar_t *ptr; + size_t len; +}; + +struct Buffer { + size_t cap; + size_t len; + struct Slice slice; + struct Block { + struct Block *prev; + wchar_t chars[]; + } *block; +}; + +struct Buffer bufferAlloc(size_t cap); +void bufferFree(struct Buffer *buf); +void bufferInsert(struct Buffer *buf); +void bufferAppend(struct Buffer *buf, wchar_t ch); +wchar_t *bufferDest(struct Buffer *buf, size_t len); + +struct Table { + size_t len; + struct Slice slices[]; +}; + +struct Table *tableInsert(const struct Table *prev, size_t at, struct Slice slice); +struct Table *tableDelete(const struct Table *prev, struct Span del); + +struct Log { + size_t cap; + size_t len; + size_t index; + struct State { + struct Table *table; + size_t prev; + size_t next; + } *states; +}; + +struct Log logAlloc(size_t cap); +void logFree(struct Log *log); +void logPush(struct Log *log, struct Table *table); + +static inline struct Table *logTable(struct Log *log) { + return log->states[log->index].table; +} +static inline void logPrev(struct Log *log) { + log->index = log->states[log->index].prev; +} +static inline void logNext(struct Log *log) { + log->index = log->states[log->index].next; +} +static inline void logBack(struct Log *log) { + if (log->index) log->index--; +} +static inline void logFore(struct Log *log) { + if (log->index + 1 < log->len) log->index++; +} -- cgit 1.4.1 ic_assert by _Static_assertJune McEnroe 2020-06-07Add OpenBSD to install.shJune McEnroe 2020-06-03Add The Song of AchillesJune McEnroe 2020-06-01Allow redirecting input in everJune McEnroe 2020-05-31Add %c conversion to c scriptJune McEnroe 2020-05-31Add c script to READMEJune McEnroe 2020-05-31Add c scriptJune McEnroe 2020-05-31Update mdoc source URLsJune McEnroe 2020-05-26Remove unfinished PSF fontsJune McEnroe