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;
/* 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));
if (buf->status == NORMAL)
{
- buf->save = buf->undo;
+ buf->log.save = buf->log.undo;
}
}
ensure(buf_valid(buf));
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;
log_swap(buf, src, dest);
}
- if (buf->save == buf->undo)
+ if (buf->log.save == buf->log.undo)
{
buf->status = NORMAL;
}
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 };
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)
/* otherwise, make a fresh delete operation */
else
{
- buf->undo = mklog(buf, beg, end, data, prev);
+ buf->log.undo = mklog(buf, beg, end, data, prev);
}
}
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);
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)
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
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"));
}
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"));
}
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"));
}
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"));
}