From: Michael D. Lowis Date: Wed, 22 Aug 2018 15:49:04 +0000 (-0400) Subject: refactored to clear the redo log when a new undo item is added X-Git-Url: https://git.mdlowis.com/?a=commitdiff_plain;h=f1f5d4b24d53f91912d3e740dbef50cac9eb6f42;p=projs%2Ftide.git refactored to clear the redo log when a new undo item is added --- 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); } }