return log;
}
-static void log_add(size_t beg, size_t end, char* data, Log** logstk) {
- Log* prev = *logstk;
+static void log_clear(Log** list) {
+ while (*list) {
+ Log* deadite = *list;
+ *list = (*list)->next;
+ if (deadite->data)
+ free(deadite->data);
+ free(deadite);
+ }
+}
+
+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++;
else
- *logstk = mklog(beg, end, data, prev);
+ buf->undo = mklog(beg, end, data, prev);
} else {
if (prev && prev->data && prev->beg == beg) {
char* newdata = strmcat(prev->data, data, 0);
prev->data = newdata;
prev->end = --prev->beg;
} else {
- *logstk = mklog(beg, end, data, prev);
+ buf->undo = mklog(beg, end, data, prev);
}
}
}
-static void log_clear(Log** list) {
- while (*list) {
- Log* deadite = *list;
- *list = (*list)->next;
- if (deadite->data)
- free(deadite->data);
- free(deadite);
- }
-}
-
static void log_swap(Buf* buf, Log** src, Log** dest) {
if (!*src) return;
Log* item = *src;
size_t beg = buf_getsel(buf).beg;
if (s && *s) {
while (*s) putb(buf, *(s++), &(buf->selection));
- log_add(beg, buf_getsel(buf).end, NULL, &(buf->undo));
+ log_add(buf, beg, buf_getsel(buf).end, NULL);
}
}
buf->gapend += nbytes;
sel.end = sel.beg;
buf->selection = sel;
- log_add(sel.beg, sel.end, str, &(buf->undo));
+ log_add(buf, sel.beg, sel.end, str);
}
}