}
}
+static void dumplog(Buf* buf) {
+#if 0
+ printf("\nUndo:\n");
+ for (Log* log = buf->undo; log; log = log->next)
+ printf(" %lu-%lu '%s'\n", log->beg, log->end, log->data);
+ printf("Redo:\n");
+ for (Log* log = buf->redo; log; log = log->next)
+ printf(" %lu-%lu '%s'\n", log->beg, log->end, log->data);
+#endif
+}
+
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++;
+ prev->end = end;
else
buf->undo = mklog(beg, end, data, prev);
} else {
buf->undo = mklog(beg, end, data, prev);
}
}
+ dumplog(buf);
}
static void log_swap(Buf* buf, Log** src, Log** dest) {
/* push item onto redo stack */
item->next = *dest;
*dest = item;
+ dumplog(buf);
}
void buf_undo(Buf* buf) {
long nread = read(job->fd, buffer, sizeof(buffer)-1);
if (nread <= 0) {
job->readfn = NULL;
+ view_selprev(pipedata->dest);
} else if (nread > 0) {
buffer[nread] = '\0';
view_putstr(pipedata->dest, buffer);