]> git.mdlowis.com Git - projs/tide.git/commitdiff
refactored to clear the redo log when a new undo item is added
authorMichael D. Lowis <mike.lowis@gentex.com>
Wed, 22 Aug 2018 15:49:04 +0000 (11:49 -0400)
committerMichael D. Lowis <mike.lowis@gentex.com>
Wed, 22 Aug 2018 15:49:04 +0000 (11:49 -0400)
lib/buf.c

index b4c61bcb1f77b68c66a4ad1d57306ec10441f37b..3df154bb1ea09e4ac8c2f435644236369b0211b3 100644 (file)
--- 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);
     }
 }