]> git.mdlowis.com Git - projs/tide.git/commitdiff
implemented first pass at redo
authorMichael D. Lowis <mike.lowis@gentex.com>
Wed, 22 Aug 2018 01:08:15 +0000 (21:08 -0400)
committerMichael D. Lowis <mike.lowis@gentex.com>
Wed, 22 Aug 2018 01:08:15 +0000 (21:08 -0400)
lib/buf.c

index f97a23ca6bffbb0f3788d75308f5e544ce14c2b6..ce014726e6b40a54fe3711727016049ff3413fde 100644 (file)
--- 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) {