From 4c48e993bfcb8672a3aa02b5b3ac9a0149a64e9a Mon Sep 17 00:00:00 2001 From: WormHeamer Date: Sun, 28 Dec 2025 21:13:33 -0500 Subject: fix txt_join_or_kill(), txt_delete_c() --- txt.c | 27 +++++++++++++++++++++++++-- 1 file changed, 25 insertions(+), 2 deletions(-) diff --git a/txt.c b/txt.c index b2dc2d8..9d5be97 100644 --- a/txt.c +++ b/txt.c @@ -104,12 +104,34 @@ static int txt_are_pieces_adjacent(Txt *t, u32 a, u32 b) { static TxtLoc txt_join_or_kill(TxtLoc l) { Txt *b = l.t; - if (l.t->ptbl.v[l.p].n == 0 && !(l.p == 0 && b->ptbl.n == 1)) { + while (l.t->ptbl.v[l.p].n == 0 && b->ptbl.n > 1) { txt_remove_piece(b, l.p); + if (l.p >= b->ptbl.n) { + l.p = b->ptbl.n - 1; + l.i = b->ptbl.v[l.p].n; + } + } + while (l.p + 1 < b->ptbl.n && l.t->ptbl.v[l.p + 1].n == 0) { + txt_remove_piece(b, l.p + 1); + if (l.p >= b->ptbl.n) { + l.p = b->ptbl.n - 1; + l.i = b->ptbl.v[l.p].n; + } } if (l.p + 1 < b->ptbl.n && txt_are_pieces_adjacent(b, l.p, l.p + 1)) { b->ptbl.v[l.p].n += b->ptbl.v[l.p+1].n; txt_remove_piece(b, l.p + 1); + if (l.p >= b->ptbl.n) { + l.p = b->ptbl.n - 1; + l.i = b->ptbl.v[l.p].n; + } + } + if (l.p > 0 && txt_are_pieces_adjacent(b, l.p - 1, l.p)) { + l.i = b->ptbl.v[l.p - 1].n; + b->ptbl.v[l.p - 1].n += b->ptbl.v[l.p].n; + txt_remove_piece(b, l.p); + l.p--; + ASSERT(l.p < b->ptbl.n); } return l; } @@ -133,12 +155,13 @@ TxtLoc txt_delete(TxtLoc l, u32 n) { l.p = l.p - 1; l.i = l.t->ptbl.v[l.p].n; } + l = txt_join_or_kill(l); } return txt_join_or_kill(l); } TxtLoc txt_delete_c(TxtLoc l) { - while (!at_start(l) && (txt_byte(l) & 0xc0) == 0x80) + while (!at_start(l) && (txt_byte(bprev(l)) & 0xc0) == 0x80) l = txt_delete(l, 1); l = txt_delete(l, 1); return l; -- cgit v1.2.3