summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorWormHeamer2025-12-28 21:13:33 -0500
committerWormHeamer2025-12-28 21:13:33 -0500
commit4c48e993bfcb8672a3aa02b5b3ac9a0149a64e9a (patch)
tree0f099d1b6f576a6a0c8fef6712e7cb6b4912c739
parent2fe237e65a13545c053c31b7b413898d5b8734ac (diff)
fix txt_join_or_kill(), txt_delete_c()
-rw-r--r--txt.c27
1 files 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;