]> git.mdlowis.com Git - projs/tide.git/commitdiff
added transaction id to log items
authorMichael D. Lowis <mike@mdlowis.com>
Tue, 4 Sep 2018 03:12:52 +0000 (23:12 -0400)
committerMichael D. Lowis <mike@mdlowis.com>
Tue, 4 Sep 2018 03:12:52 +0000 (23:12 -0400)
inc/edit.h
lib/buf.c

index d9e937562bfbd57f91deb8eb9a3ef32a714a84d3..02f2a59e8e08e3ef08281d7e984a39d55828e395 100644 (file)
@@ -6,6 +6,7 @@ typedef struct Log {
     size_t beg;       /* beginning of affected region */
     size_t end;       /* end of affected region*/
     char* data;       /* pointer to deleted character data */
+    long transid;     /* id of transaction this item is a part of */
 } Log;
 
 /* cursor/selection representation */
@@ -29,6 +30,7 @@ typedef struct {
     char* gapend;     /* end of the gap */
     Log* undo;        /* undo list */
     Log* redo;        /* redo list */
+    long transid;     /* id number of the current transaction */
     Sel selection;    /* the currently selected text */
 } Buf;
 
index 93dc9dc85797bd0137de65dc586be722e5757e8a..b0c634b6c2fb8c2966286a3ee9c06457cb16e24a 100644 (file)
--- a/lib/buf.c
+++ b/lib/buf.c
@@ -32,6 +32,7 @@ void buf_init(Buf* buf) {
     buf->gapend    = buf->bufend;
     buf->undo      = NULL;
     buf->redo      = NULL;
+    buf->transid   = -1;
     buf->selection = (Sel){0,0,0};
     assert(buf->bufstart);
 }
@@ -178,26 +179,23 @@ 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 = end;
-        else
-            buf->undo = mklog(beg, end, data, prev);
+    if (!prev || (buf->transid > 0 && buf->transid == prev->transid)) {
+        buf->undo = mklog(beg, end, data, prev);
+    } else if (!data && !prev->data && prev->end == beg) {
+        prev->end = end;
+    } else if (prev->data && data && prev->beg == beg) {
+        char* newdata = strmcat(prev->data, data, 0);
+        free(data);
+        free(prev->data);
+        prev->data = newdata;
+    } else if (prev->data && data && prev->beg == beg+1) {
+        char* newdata = strmcat(data, prev->data, 0);
+        free(data);
+        free(prev->data);
+        prev->data = newdata;
+        prev->end = --prev->beg;
     } else {
-        if (prev && prev->data && prev->beg == beg) {
-            char* newdata = strmcat(prev->data, data, 0);
-            free(data);
-            free(prev->data);
-            prev->data = newdata;
-        } else if (prev && prev->data && prev->beg == beg+1) {
-            char* newdata = strmcat(data, prev->data, 0);
-            free(data);
-            free(prev->data);
-            prev->data = newdata;
-            prev->end = --prev->beg;
-        } else {
-            buf->undo = mklog(beg, end, data, prev);
-        }
+        buf->undo = mklog(beg, end, data, prev);
     }
     dumplog(buf);
 }
@@ -328,7 +326,7 @@ void buf_del(Buf* buf) {
         char* str = buf_gets(buf);
         buf_syncgap(buf, sel.beg);
         buf->gapend += nbytes;
-        sel.end = sel.beg;
+        sel.end = sel.beg = (sel.beg < sel.end ? sel.beg : sel.end);
         buf->selection = sel;
         log_add(buf, sel.beg, sel.end, str);
     }