diff options
| author | WormHeamer | 2025-12-28 21:13:33 -0500 |
|---|---|---|
| committer | WormHeamer | 2025-12-28 21:13:33 -0500 |
| commit | 4c48e993bfcb8672a3aa02b5b3ac9a0149a64e9a (patch) | |
| tree | 0f099d1b6f576a6a0c8fef6712e7cb6b4912c739 | |
| parent | 2fe237e65a13545c053c31b7b413898d5b8734ac (diff) | |
fix txt_join_or_kill(), txt_delete_c()
| -rw-r--r-- | txt.c | 27 |
1 files changed, 25 insertions, 2 deletions
@@ -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; |
