Introduction
Introduction Statistics Contact Development Disclaimer Help
tFix bug with undo - ledit - Text editor (WIP)
git clone git://lumidify.org/ledit.git (fast, but not encrypted)
git clone https://lumidify.org/git/ledit.git (encrypted, but very slow)
Log
Files
Refs
README
LICENSE
---
commit 81ddea61d765938b662b3456b3fe80369cfbc138
parent 626c8692fa7f3dadb3c83a7c5b68b129e9e04ad5
Author: lumidify <[email protected]>
Date: Fri, 6 Oct 2023 11:05:17 +0200
Fix bug with undo
Sometimes, the text would get scrambled when using undo. This was
actually due to a bug in the deletion function that only became
apparent when using undo.
Diffstat:
M buffer.c | 8 +++++++-
M undo.c | 32 ++++++++++++++++++++---------…
2 files changed, 28 insertions(+), 12 deletions(-)
---
diff --git a/buffer.c b/buffer.c
t@@ -909,8 +909,12 @@ buffer_prev_char_pos(
*byte_ret = cur_byte;
}
+/* The check for length == 0 in buffer_delete_line_section_base and the check …
+ empty range in delete_range_base shouldn't be needed, but I added them just…
static void
buffer_delete_line_section_base(ledit_buffer *buffer, size_t line, size_t star…
+ if (length == 0)
+ return;
ledit_line *l = buffer_get_line(buffer, line);
/* FIXME: somehow make sure this doesn't get optimized out? */
(void)add_sz(start, length); /* just check that no overflow */
t@@ -928,7 +932,7 @@ buffer_delete_line_section_base(ledit_buffer *buffer, size…
memmove(
l->text + l->gap,
l->text + l->gap + l->cap - l->len,
- start - l->gap
+ start - l->gap - l->cap + l->len
);
}
l->len -= length;
t@@ -947,6 +951,8 @@ delete_range_base(
size_t line_index1, size_t byte_index1,
size_t line_index2, size_t byte_index2,
txtbuf *text_ret) {
+ if (line_index1 == line_index2 && byte_index1 == byte_index2)
+ return;
sort_range(&line_index1, &byte_index1, &line_index2, &byte_index2);
if (line_index1 == line_index2) {
if (text_ret) {
diff --git a/undo.c b/undo.c
t@@ -101,6 +101,23 @@ undo_change_mode_group(undo_stack *undo) {
undo->change_mode_group = 1;
}
+/*
+static void
+dump_undo(undo_stack *undo) {
+ printf("START UNDO STACK\n");
+ printf("cur: %zu\n", undo->cur);
+ for (size_t i = 0; i < undo->len; i++) {
+ undo_elem *e = &undo->stack[i];
+ printf(
+ "type %d, mode %d, group %d, mode_group %d, text '%.*s', r…
+ e->type, e->mode, e->group, e->mode_group, (int)e->text->l…
+ e->op_range.byte1, e->op_range.byte2
+ );
+ }
+ printf("END UNDO STACK\n");
+}
+*/
+
static void
push_undo(
undo_stack *undo, txtbuf *text,
t@@ -123,17 +140,7 @@ push_undo(
txtbuf_copy(e->text, text);
else
e->text = txtbuf_dup(text);
- /*
- printf("START UNDO STACK\n");
- for (size_t i = 0; i < undo->len; i++) {
- undo_elem *e = &undo->stack[i];
- printf(
- "type %d, mode %d, group %d, mode_group %d, text '%.*s'\n",
- e->type, e->mode, e->group, e->mode_group, (int)e->text->l…
- );
- }
- printf("END UNDO STACK\n");
- */
+ /* dump_undo(undo); */
}
void
t@@ -195,6 +202,7 @@ ledit_undo(undo_stack *undo, ledit_mode mode, void *callba…
switch (e->type) {
case UNDO_INSERT:
/* FIXME: should the paste buffer also be modified? */
+ /* printf("delete %zu,%zu; %zu,%zu\n", e->op_range.lin…
delete_cb(
callback_data,
e->op_range.line1, e->op_range.byte1,
t@@ -202,6 +210,7 @@ ledit_undo(undo_stack *undo, ledit_mode mode, void *callba…
);
break;
case UNDO_DELETE:
+ /* printf("delete %zu,%zu; %zu,%zu\n", e->op_range.lin…
insert_cb(
callback_data,
e->op_range.line1, e->op_range.byte1,
t@@ -234,6 +243,7 @@ ledit_undo(undo_stack *undo, ledit_mode mode, void *callba…
*min_line_ret = min_line;
if (mode == NORMAL || mode == VISUAL)
undo_change_mode_group(undo);
+ /* dump_undo(undo); */
return UNDO_NORMAL;
}
You are viewing proxied material from lumidify.org. The copyright of proxied material belongs to its original authors. Any comments or complaints in relation to proxied material should be directed to the original authors of the content concerned. Please see the disclaimer for more details.