From d854d5fc54f6001cc201847a599ec7d91b4d5341 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Tue, 21 Aug 2018 21:08:15 -0400 Subject: [PATCH] implemented first pass at redo --- lib/buf.c | 27 +++++++++++++++++++-------- 1 file changed, 19 insertions(+), 8 deletions(-) diff --git a/lib/buf.c b/lib/buf.c index f97a23c..ce01472 100644 --- a/lib/buf.c +++ b/lib/buf.c @@ -163,18 +163,20 @@ static void log_clear(Log** list) { } } -void buf_undo(Buf* buf) { - if (!buf->undo) return; - Log* item = buf->undo; +static void log_swap(Buf* buf, Log** src, Log** dest) { + if (!*src) return; + Log* item = *src; buf->selection.beg = item->beg; buf->selection.end = item->end; if (item->data) { /* reinsert deleted bytes */ - for (char* s = item->data; s && *s; s++) + for (char* s = item->data; s && *s; s++, item->end++) putb(buf, *s, &(buf->selection)); free(item->data); item->data = NULL; - } else { + buf->selection.beg = item->beg; + buf->selection.end = item->end; + } else { /* delete the added bytes */ Sel sel = buf_getsel(buf); item->data = buf_gets(buf); @@ -186,11 +188,16 @@ void buf_undo(Buf* buf) { item->end = sel.end; } /* push item onto redo stack */ - item->next = buf->redo; - buf->redo = item; + item->next = *dest; + *dest = item; +} + +void buf_undo(Buf* buf) { + log_swap(buf, &(buf->undo), &(buf->redo)); } void buf_redo(Buf* buf) { + log_swap(buf, &(buf->redo), &(buf->undo)); } void buf_logclear(Buf* buf) { @@ -236,7 +243,11 @@ void buf_putc(Buf* buf, int c) { void buf_puts(Buf* buf, char* s) { buf_del(buf); - while (s && *s) putb(buf, *(s++), &(buf->selection)); + size_t beg = buf_getsel(buf).beg; + if (s && *s) { + while (*s) putb(buf, *(s++), &(buf->selection)); + buf->undo = mklog(beg, buf_getsel(buf).end, NULL, buf->undo); + } } int buf_getc(Buf* buf) { -- 2.49.0