#include #include #include "abuf.h" #include "undo.h" undo_node * undo_node_new(undo_kind kind) { undo_node *node = NULL; node = (undo_node *)malloc(sizeof(undo_node)); assert(node != NULL); node->kind = kind; node->row = node->col = 0; ab_init(&node->text); node->next = NULL; node->parent = NULL; return node; } void undo_node_free(undo_node *node) { undo_node *next = NULL; if (node == NULL) { return; } ab_free(&node->text); } void undo_node_free_all(undo_node *node) { undo_node *next = NULL; if (node == NULL) { return; } while (node != NULL) { next = node->next; undo_node_free(node); free(node); node = next; } } void undo_tree_init(undo_tree *tree) { assert(tree != NULL); tree->root = NULL; tree->current = NULL; tree->pending = NULL; } void undo_tree_free(undo_tree *tree) { assert(tree != NULL); undo_node_free(tree->pending); undo_node_free_all(tree->root); undo_tree_init(tree); } void undo_begin(undo_tree *tree, undo_kind kind) { undo_node *pending = NULL; if (tree->pending != NULL) { if (tree->pending->kind == kind) { /* don't initiate a new undo sequence if it's the same kind */ return; } undo_commit(tree); } pending = undo_node_new(kind); assert(pending != NULL); tree->pending = pending; } void undo_prepend(undo_tree *tree, abuf *buf) { } void undo_append(undo_tree *tree, abuf *buf); void undo_prependch(undo_tree *tree, char c); void undo_appendch(undo_tree *tree, char c); void undo_commit(undo_tree *tree); void undo_apply(struct editor *editor); void editor_undo(undo_tree *tree); void editor_redo(undo_tree *tree);