From 68021eace7c6eaabbb6f0158e305b07375b86f37 Mon Sep 17 00:00:00 2001 From: "Michael D. Lowis" Date: Thu, 24 Oct 2019 12:01:36 -0400 Subject: [PATCH] move undo/redo log to substructure --- inc/edit.h | 6 ------ src/lib/buf.c | 10 +++++----- src/lib/editlog.c | 30 +++++++++++++++--------------- src/tide.c | 8 ++++---- tests/lib/buf.c | 24 ++++++++++++------------ 5 files changed, 36 insertions(+), 42 deletions(-) diff --git a/inc/edit.h b/inc/edit.h index 5e41b9e..c9529e9 100644 --- a/inc/edit.h +++ b/inc/edit.h @@ -39,12 +39,6 @@ typedef struct { char* path; /* the path to the open file */ GapBuf contents; /* underlying sequence data structure */ EditLog log; /* underlying log of edit operations */ - - int transid; /* id number of the current transaction */ - Log* undo; /* undo list */ - Log* redo; /* redo list */ - Log* save; /* pointer to last save position */ - Sel selection; /* the currently selected text */ } Buf; diff --git a/src/lib/buf.c b/src/lib/buf.c index 486f7af..08b84ff 100644 --- a/src/lib/buf.c +++ b/src/lib/buf.c @@ -109,10 +109,10 @@ void buf_init(Buf* buf) /* reset the state to defaults */ gapbuf_init(&buf->contents); - buf->status = NORMAL; - buf->undo = NULL; - buf->redo = NULL; - buf->transid = -1; + buf->status = NORMAL; + buf->log.undo = NULL; + buf->log.redo = NULL; + buf->log.transid = -1; buf->selection = (Sel){0,0,0}; ensure(buf_valid(buf)); @@ -223,7 +223,7 @@ int buf_save(Buf* buf, char* path) if (buf->status == NORMAL) { - buf->save = buf->undo; + buf->log.save = buf->log.undo; } } ensure(buf_valid(buf)); diff --git a/src/lib/editlog.c b/src/lib/editlog.c index ee2ce38..d570343 100644 --- a/src/lib/editlog.c +++ b/src/lib/editlog.c @@ -7,7 +7,7 @@ static Log* mklog(Buf* buf, size_t beg, size_t end, char* data, Log* next) { Log* log = calloc(1, sizeof(Log)); - log->transid = (buf->transid < 0 ? 0 : buf->transid); + log->transid = (buf->log.transid < 0 ? 0 : buf->log.transid); log->beg = beg; log->end = end; log->data = data; @@ -57,7 +57,7 @@ static void log_swap(Buf* buf, Log** src, Log** dest) log_swap(buf, src, dest); } - if (buf->save == buf->undo) + if (buf->log.save == buf->log.undo) { buf->status = NORMAL; } @@ -81,29 +81,29 @@ static void log_clear(Log** list) void editlog_seqstart(Buf* buf) { require(buf != NULL); - buf->transid = abs(buf->transid); + buf->log.transid = abs(buf->log.transid); } void editlog_seqstop(Buf* buf) { require(buf != NULL); - if (buf->transid > 0) + if (buf->log.transid > 0) { - buf->transid = -(buf->transid + 1); + buf->log.transid = -(buf->log.transid + 1); } } void editlog_clear(Buf* buf) { require(buf != NULL); - log_clear(&(buf->redo)); - log_clear(&(buf->undo)); + log_clear(&(buf->log.redo)); + log_clear(&(buf->log.undo)); } void editlog_lastins(Buf* buf, Sel* p_sel) { require(buf != NULL); - Log* log = buf->undo; + Log* log = buf->log.undo; if (log) { Sel sel = { .beg = log->beg, .end = log->end }; @@ -143,24 +143,24 @@ void editlog_lastins(Buf* buf, Sel* p_sel) void editlog_undo(Buf* buf) { require(buf != NULL); - log_swap(buf, &(buf->undo), &(buf->redo)); + log_swap(buf, &(buf->log.undo), &(buf->log.redo)); } void editlog_redo(Buf* buf) { require(buf != NULL); - log_swap(buf, &(buf->redo), &(buf->undo)); + log_swap(buf, &(buf->log.redo), &(buf->log.undo)); } void editlog_add(Buf* buf, size_t beg, size_t end, char* data) { - Log* prev = buf->undo; - log_clear(&(buf->redo)); + Log* prev = buf->log.undo; + log_clear(&(buf->log.redo)); /* check if this is new transaction or the first entry */ - if (!prev || (buf->transid > 0 && buf->transid != prev->transid)) + if (!prev || (buf->log.transid > 0 && buf->log.transid != prev->transid)) { - buf->undo = mklog(buf, beg, end, data, prev); + buf->log.undo = mklog(buf, beg, end, data, prev); } /* check if this is a sequential insert, just expand the previous one */ else if (!data && !prev->data && prev->end == beg) @@ -187,7 +187,7 @@ void editlog_add(Buf* buf, size_t beg, size_t end, char* data) /* otherwise, make a fresh delete operation */ else { - buf->undo = mklog(buf, beg, end, data, prev); + buf->log.undo = mklog(buf, beg, end, data, prev); } } diff --git a/src/tide.c b/src/tide.c index b4b05e6..5e3eeeb 100644 --- a/src/tide.c +++ b/src/tide.c @@ -65,10 +65,10 @@ static void dumpdata(FILE* f) fprintf(f, "\t\t.bufend:\t%p\n", (void*)Regions[i].buffer.contents.bufend); fprintf(f, "\t\t.gapstart:\t%p\n", (void*)Regions[i].buffer.contents.gapstart); fprintf(f, "\t\t.gapend:\t%p\n", (void*)Regions[i].buffer.contents.gapend); - fprintf(f, "\t\t.undo:\t\t%p\n", (void*)Regions[i].buffer.undo); - fprintf(f, "\t\t.redo:\t\t%p\n", (void*)Regions[i].buffer.redo); - fprintf(f, "\t\t.save:\t\t%p\n", (void*)Regions[i].buffer.save); - fprintf(f, "\t\t.transid:\t%d\n", Regions[i].buffer.transid); + fprintf(f, "\t\t.undo:\t\t%p\n", (void*)Regions[i].buffer.log.undo); + fprintf(f, "\t\t.redo:\t\t%p\n", (void*)Regions[i].buffer.log.redo); + fprintf(f, "\t\t.save:\t\t%p\n", (void*)Regions[i].buffer.log.save); + fprintf(f, "\t\t.transid:\t%d\n", Regions[i].buffer.log.transid); fprintf(f, "\t\t.selbeg:\t%zu\n", Regions[i].buffer.selection.beg); fprintf(f, "\t\t.selend:\t%zu\n", Regions[i].buffer.selection.end); fprintf(f, "\t\t.selcol:\t%zu\n", Regions[i].buffer.selection.col); diff --git a/tests/lib/buf.c b/tests/lib/buf.c index cc822b4..bce8927 100644 --- a/tests/lib/buf.c +++ b/tests/lib/buf.c @@ -143,8 +143,8 @@ TEST_SUITE(BufferTests) CHECK(TestBuf.contents.bufend == TestBuf.contents.bufstart + TestBuf.contents.bufsize); CHECK(TestBuf.contents.gapstart == TestBuf.contents.bufstart); CHECK(TestBuf.contents.gapend == TestBuf.contents.bufend); - CHECK(TestBuf.undo == NULL); - CHECK(TestBuf.redo == NULL); + CHECK(TestBuf.log.undo == NULL); + CHECK(TestBuf.log.redo == NULL); } TEST(buf_init shoud free old buffer and reinitialize) @@ -158,8 +158,8 @@ TEST_SUITE(BufferTests) CHECK(TestBuf.contents.bufend == TestBuf.contents.bufstart + TestBuf.contents.bufsize); CHECK(TestBuf.contents.gapstart == TestBuf.contents.bufstart); CHECK(TestBuf.contents.gapend == TestBuf.contents.bufend); - CHECK(TestBuf.undo == NULL); - CHECK(TestBuf.redo == NULL); + CHECK(TestBuf.log.undo == NULL); + CHECK(TestBuf.log.redo == NULL); } /* Set Path @@ -188,8 +188,8 @@ TEST_SUITE(BufferTests) buf_load(&TestBuf, "testdocs/lorem.txt"); CHECK(TestBuf.status != MODIFIED); CHECK(TestBuf.contents.bufsize == 61440); - CHECK(TestBuf.undo == NULL); - CHECK(TestBuf.redo == NULL); + CHECK(TestBuf.log.undo == NULL); + CHECK(TestBuf.log.redo == NULL); CHECK(!strcmp(TestBuf.path, "testdocs/lorem.txt")); } @@ -199,8 +199,8 @@ TEST_SUITE(BufferTests) buf_load(&TestBuf, "testdocs/waf"); CHECK(TestBuf.status != MODIFIED); CHECK(TestBuf.contents.bufsize == 98304); - CHECK(TestBuf.undo == NULL); - CHECK(TestBuf.redo == NULL); + CHECK(TestBuf.log.undo == NULL); + CHECK(TestBuf.log.redo == NULL); CHECK(!strcmp(TestBuf.path, "testdocs/waf")); } @@ -210,8 +210,8 @@ TEST_SUITE(BufferTests) buf_load(&TestBuf, "./testdocs/lorem.txt"); CHECK(TestBuf.status != MODIFIED); CHECK(TestBuf.contents.bufsize == 61440); - CHECK(TestBuf.undo == NULL); - CHECK(TestBuf.redo == NULL); + CHECK(TestBuf.log.undo == NULL); + CHECK(TestBuf.log.redo == NULL); CHECK(!strcmp(TestBuf.path, "testdocs/lorem.txt")); } @@ -224,8 +224,8 @@ TEST_SUITE(BufferTests) buf_reload(&TestBuf); CHECK(TestBuf.status != MODIFIED); CHECK(TestBuf.contents.bufsize == 61440); - CHECK(TestBuf.undo == NULL); - CHECK(TestBuf.redo == NULL); + CHECK(TestBuf.log.undo == NULL); + CHECK(TestBuf.log.redo == NULL); CHECK(!strcmp(TestBuf.path, "testdocs/lorem.txt")); } -- 2.52.0