}
}
-void buf_undo(Buf* buf) {
- if (!buf->undo) return;
- Log* item = buf->undo;
+static void log_swap(Buf* buf, Log** src, Log** dest) {
+ if (!*src) return;
+ Log* item = *src;
buf->selection.beg = item->beg;
buf->selection.end = item->end;
if (item->data) {
/* reinsert deleted bytes */
- for (char* s = item->data; s && *s; s++)
+ for (char* s = item->data; s && *s; s++, item->end++)
putb(buf, *s, &(buf->selection));
free(item->data);
item->data = NULL;
- } else {
+ buf->selection.beg = item->beg;
+ buf->selection.end = item->end;
+ } else {
/* delete the added bytes */
Sel sel = buf_getsel(buf);
item->data = buf_gets(buf);
item->end = sel.end;
}
/* push item onto redo stack */
- item->next = buf->redo;
- buf->redo = item;
+ item->next = *dest;
+ *dest = item;
+}
+
+void buf_undo(Buf* buf) {
+ log_swap(buf, &(buf->undo), &(buf->redo));
}
void buf_redo(Buf* buf) {
+ log_swap(buf, &(buf->redo), &(buf->undo));
}
void buf_logclear(Buf* buf) {
void buf_puts(Buf* buf, char* s) {
buf_del(buf);
- while (s && *s) putb(buf, *(s++), &(buf->selection));
+ size_t beg = buf_getsel(buf).beg;
+ if (s && *s) {
+ while (*s) putb(buf, *(s++), &(buf->selection));
+ buf->undo = mklog(beg, buf_getsel(buf).end, NULL, buf->undo);
+ }
}
int buf_getc(Buf* buf) {