From f1f5d4b24d53f91912d3e740dbef50cac9eb6f42 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Wed, 22 Aug 2018 11:49:04 -0400 Subject: [PATCH] refactored to clear the redo log when a new undo item is added --- lib/buf.c | 33 +++++++++++++++++---------------- 1 file changed, 17 insertions(+), 16 deletions(-) diff --git a/lib/buf.c b/lib/buf.c index b4c61bc..3df154b 100644 --- a/lib/buf.c +++ b/lib/buf.c @@ -153,14 +153,25 @@ static Log* mklog(size_t beg, size_t end, char* data, Log* next) { return log; } -static void log_add(size_t beg, size_t end, char* data, Log** logstk) { - Log* prev = *logstk; +static void log_clear(Log** list) { + while (*list) { + Log* deadite = *list; + *list = (*list)->next; + if (deadite->data) + free(deadite->data); + free(deadite); + } +} + +static void log_add(Buf* buf, size_t beg, size_t end, char* data) { + Log* prev = buf->undo; + log_clear(&(buf->redo)); /* decide if this is an insert or delete */ if (!data) { if (prev && !prev->data && prev->end == beg) prev->end++; else - *logstk = mklog(beg, end, data, prev); + buf->undo = mklog(beg, end, data, prev); } else { if (prev && prev->data && prev->beg == beg) { char* newdata = strmcat(prev->data, data, 0); @@ -174,21 +185,11 @@ static void log_add(size_t beg, size_t end, char* data, Log** logstk) { prev->data = newdata; prev->end = --prev->beg; } else { - *logstk = mklog(beg, end, data, prev); + buf->undo = mklog(beg, end, data, prev); } } } -static void log_clear(Log** list) { - while (*list) { - Log* deadite = *list; - *list = (*list)->next; - if (deadite->data) - free(deadite->data); - free(deadite); - } -} - static void log_swap(Buf* buf, Log** src, Log** dest) { if (!*src) return; Log* item = *src; @@ -273,7 +274,7 @@ void buf_puts(Buf* buf, char* s) { size_t beg = buf_getsel(buf).beg; if (s && *s) { while (*s) putb(buf, *(s++), &(buf->selection)); - log_add(beg, buf_getsel(buf).end, NULL, &(buf->undo)); + log_add(buf, beg, buf_getsel(buf).end, NULL); } } @@ -301,7 +302,7 @@ void buf_del(Buf* buf) { buf->gapend += nbytes; sel.end = sel.beg; buf->selection = sel; - log_add(sel.beg, sel.end, str, &(buf->undo)); + log_add(buf, sel.beg, sel.end, str); } } -- 2.49.0