From 6c8c5da804f47460394e8fbd34a0b754c7be5e74 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Mon, 3 Sep 2018 23:12:52 -0400 Subject: [PATCH] added transaction id to log items --- inc/edit.h | 2 ++ lib/buf.c | 38 ++++++++++++++++++-------------------- 2 files changed, 20 insertions(+), 20 deletions(-) diff --git a/inc/edit.h b/inc/edit.h index d9e9375..02f2a59 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -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; diff --git a/lib/buf.c b/lib/buf.c index 93dc9dc..b0c634b 100644 --- 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); } -- 2.49.0