Log* prev = buf->undo;
log_clear(&(buf->redo));
- /* decide if this is an insert or delete */
+ /* check if this is new transaction or the first entry */
if (!prev || (buf->transid > 0 && buf->transid != prev->transid))
{
buf->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)
{
prev->end = end;
}
+ /* check if this is a sequential delete, append to deleted text */
else if (prev->data && data && prev->beg == beg)
{
char* newdata = strmcat(prev->data, data, 0);
free(prev->data);
prev->data = newdata;
}
+ /* check if this is a delete before the previous operation, prepend to deleted text */
else if (prev->data && data && prev->beg == beg+1)
{
char* newdata = strmcat(data, prev->data, 0);
prev->data = newdata;
prev->end = --prev->beg;
}
+ /* otherwise, make a fresh delete operation */
else
{
buf->undo = mklog(buf, beg, end, data, prev);