From e8cd809a7a305e1b8c2d389198b6d2b387594752 Mon Sep 17 00:00:00 2001 From: Igor Cananea Date: Wed, 15 Nov 2023 11:19:32 -0500 Subject: [PATCH] Bug fixes for DEL/BACKSPACE merge + refactorings + correct tab spacing. (#14) This fixes all line merging bugs when using DELETE or BACKSPACE and refactors the scrolling code, reducing the binary size. --- bin/aed.bin | Bin 22306 -> 21873 bytes src/cmd_ops.c | 147 +++++++++++++++++++++++--------------------------- src/cmd_ops.h | 1 - src/editor.c | 7 ++- 4 files changed, 69 insertions(+), 86 deletions(-) diff --git a/bin/aed.bin b/bin/aed.bin index 2bafea66c5f8c1a58fa0ae6c84a78172520820ca..ddf9cad48bbf50ae66e626f6bdfc57845c60cb19 100644 GIT binary patch delta 6934 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 z9wtab_size_; i++) { + const uint8_t spaces = scr->tab_size_ - ((tb_xpos(buf)-1) % scr->tab_size_); + for (uint8_t i = 0; i < spaces; i++) { cmd_putc(scr, buf, k); } return; @@ -85,18 +82,7 @@ void cmd_putc(screen* scr, text_buffer* buf, key k) { scr_putc(scr, k.key, prefix, psz, suffix, ssz); } -static void scroll_down_from_top(screen* scr, text_buffer* buf, uint8_t ch) { - line_itr next = tb_nline(buf, tb_ypos(buf)); - uint8_t ypos = scr->currY_; - for (line l = next(); l.b != NULL && ypos < scr->bottomY_; l = next(), ++ypos) { - scr_overwrite_line(scr, ypos, l.b, l.sz, l.osz); - } - if (ypos < scr->bottomY_) { - scr_write_line(scr, ypos, NULL, 0); - } - vdp_cursor_tab(scr->currY_, scr->currX_); - scr_show_cursor_ch(scr, ch); - +static void scr_write_padded(screen* scr, text_buffer* buf) { vdp_cursor_tab(scr->currY_, 0); int psz = 0; uint8_t* prefix = tb_prefix(buf, &psz); @@ -114,44 +100,40 @@ static void scroll_down_from_top(screen* scr, text_buffer* buf, uint8_t ch) { for (int j = 0; j < sz && i < scr->cols_; i++, j++) { putch(suffix[j]); } - vdp_cursor_tab(scr->currY_, scr->currX_); - scr_show_cursor_ch(scr, ch); - } -static void scroll_up_from_top(screen* scr, text_buffer* buf, uint8_t ch) { + +static void scroll_from_top(screen* scr, text_buffer* buf, uint8_t ch, const bool osz_is_last) { line_itr next = tb_nline(buf, tb_ypos(buf)); uint8_t ypos = scr->currY_; int osz = 255; for (line l = next(); l.b != NULL && ypos < scr->bottomY_; l = next(), ++ypos) { + if (!osz_is_last) { + osz = l.osz; + } scr_overwrite_line(scr, ypos, l.b, l.sz, osz); - osz = l.sz; + if (osz_is_last) { + osz = l.sz; + } } if (ypos < scr->bottomY_) { - scr_overwrite_line(scr, ypos, NULL, 0, osz); - } - - vdp_cursor_tab(scr->currY_, 0); - int psz = 0; - uint8_t* prefix = tb_prefix(buf, &psz); - int i = 0; - int pad = buf->x_ - scr->currX_; - if (pad < 0) { - pad = 0; - } - for (; i < scr->currX_; i++) { - putch(prefix[i+pad]); - } - - int sz = 0; - uint8_t* suffix = tb_suffix(buf, &sz); - for (int j = 0; j < sz && i < scr->cols_; i++, j++) { - putch(suffix[j]); + scr_write_line(scr, ypos, NULL, 0); } + scr_write_padded(scr, buf); vdp_cursor_tab(scr->currY_, scr->currX_); scr_show_cursor_ch(scr, ch); + +} + +static void scroll_up_from_top(screen* scr, text_buffer* buf, uint8_t ch) { + scroll_from_top(scr, buf, ch, false); } +static void scroll_down_from_top(screen* scr, text_buffer* buf, uint8_t ch) { + scroll_from_top(scr, buf, ch, true); +} + + static void scroll_lines(screen* scr, text_buffer* buf, uint8_t ch) { if (scr->currY_ < scr->bottomY_-1) { line_itr next = tb_nline(buf, tb_ypos(buf)); @@ -172,7 +154,7 @@ static void scroll_lines(screen* scr, text_buffer* buf, uint8_t ch) { } void cmd_show(screen* scr, text_buffer* buf) { - uint8_t to_ch = tb_peek(buf); + const uint8_t to_ch = tb_peek(buf); scroll_down_from_top(scr, buf, to_ch); } @@ -180,8 +162,8 @@ static void cmd_del_merge(screen* scr, text_buffer* buf) { if (!tb_del_merge(buf)) { return; } - uint8_t ch = tb_peek(buf); - scroll_up_from_top(scr, buf, ch); + const uint8_t ch = tb_peek(buf); + scroll_down_from_top(scr, buf, ch); } void cmd_del(screen* scr, text_buffer* buf) { @@ -253,7 +235,7 @@ void cmd_del_line(screen* scr, text_buffer* buf) { } scr->currX_ = 0; uint8_t ch = tb_peek(buf); - scroll_up_from_top(scr, buf, ch); + scroll_down_from_top(scr, buf, ch); } void cmd_left(screen* scr, text_buffer* buf) { @@ -280,9 +262,9 @@ void cmd_w_left(screen* scr, text_buffer* buf) { } return; } - int from_x = tb_xpos(buf); - uint8_t from_ch = tb_peek(buf); - uint8_t to_ch = tb_w_prev(buf); + const int from_x = tb_xpos(buf); + const uint8_t from_ch = tb_peek(buf); + const uint8_t to_ch = tb_w_prev(buf); const uint8_t deltaX = from_x - tb_xpos(buf); int sz = 0; @@ -304,8 +286,8 @@ void cmd_right(screen* scr, text_buffer* buf) { if (from_ch == 0 ) { return; } - uint8_t to_ch = tb_next(buf); + const uint8_t to_ch = tb_next(buf); int sz = 0; uint8_t* prefix = tb_prefix(buf, &sz); scr_right(scr, from_ch, to_ch, 1, prefix, sz); @@ -321,9 +303,9 @@ void cmd_w_right(screen* scr, text_buffer* buf) { return; } - int from_x = tb_xpos(buf); - uint8_t from_ch = tb_peek(buf); - uint8_t to_ch = tb_w_next(buf); + const int from_x = tb_xpos(buf); + const uint8_t from_ch = tb_peek(buf); + const uint8_t to_ch = tb_w_next(buf); const uint8_t deltaX = tb_xpos(buf) - from_x; int sz = 0; @@ -343,23 +325,25 @@ void cmd_up(screen* scr, text_buffer* buf) { } if (scr->currY_ <= scr->topY_) { - scroll_down_from_top(scr, buf, to_ch); - } else { - if (scr->currX_ >= scr->cols_-1) { - scr_write_line(scr, scr->currY_, prefix, psz); - if (tb_xpos(buf) >= scr->cols_) { - psz = 0; - prefix = tb_prefix(buf, &psz); - int pad = (tb_xpos(buf)-1) - scr->currX_; - scr_write_line(scr, scr->currY_-1, prefix+pad, psz-pad); - } - } - int xpos = tb_xpos(buf)-1; - if (xpos > scr->cols_-1) { - xpos = scr->cols_-1; + scroll_up_from_top(scr, buf, to_ch); + return; + } + + if (scr->currX_ >= scr->cols_-1) { + scr_write_line(scr, scr->currY_, prefix, psz); + if (tb_xpos(buf) >= scr->cols_) { + psz = 0; + prefix = tb_prefix(buf, &psz); + int pad = (tb_xpos(buf)-1) - scr->currX_; + scr_write_line(scr, scr->currY_-1, prefix+pad, psz-pad); } - scr_up(scr, from_ch, to_ch, xpos); } + + int xpos = tb_xpos(buf)-1; + if (xpos > scr->cols_-1) { + xpos = scr->cols_-1; + } + scr_up(scr, from_ch, to_ch, xpos); } void cmd_down(screen* scr, text_buffer* buf) { @@ -373,22 +357,23 @@ void cmd_down(screen* scr, text_buffer* buf) { } if (scr->currY_ >= scr->bottomY_-1) { scroll_lines(scr, buf, to_ch); - } else { - if (scr->currX_ >= scr->cols_-1) { - scr_write_line(scr, scr->currY_, prefix, psz); - if (tb_xpos(buf) >= scr->cols_) { - psz = 0; - prefix = tb_prefix(buf, &psz); - int pad = (tb_xpos(buf)-1) - scr->currX_; - scr_write_line(scr, scr->currY_+1, prefix+pad, psz-pad); - } - } - int xpos = tb_xpos(buf)-1; - if (xpos > scr->cols_-1) { - xpos = scr->cols_-1; + return; + } + if (scr->currX_ >= scr->cols_-1) { + scr_write_line(scr, scr->currY_, prefix, psz); + if (tb_xpos(buf) >= scr->cols_) { + psz = 0; + prefix = tb_prefix(buf, &psz); + int pad = (tb_xpos(buf)-1) - scr->currX_; + scr_write_line(scr, scr->currY_+1, prefix+pad, psz-pad); } - scr_down(scr, from_ch, to_ch, xpos); } + + int xpos = tb_xpos(buf)-1; + if (xpos > scr->cols_-1) { + xpos = scr->cols_-1; + } + scr_down(scr, from_ch, to_ch, xpos); } void cmd_home(screen* scr, text_buffer* buf) { diff --git a/src/cmd_ops.h b/src/cmd_ops.h index ae0f587..686bd5a 100644 --- a/src/cmd_ops.h +++ b/src/cmd_ops.h @@ -33,7 +33,6 @@ typedef void(*cmd_op)(screen*, text_buffer*); void cmd_show(screen* scr, text_buffer* buf); bool cmd_quit(screen* scr, text_buffer* buf); -void cmd_noop(screen* scr, text_buffer* buf); void cmd_putc(screen* scr, text_buffer* buf, key k); void cmd_del(screen* scr, text_buffer* buf); void cmd_bksp(screen* scr, text_buffer* buf); diff --git a/src/editor.c b/src/editor.c index efcff6e..8716c72 100644 --- a/src/editor.c +++ b/src/editor.c @@ -47,7 +47,6 @@ void ed_destroy(editor* ed) { #define CMD_PUTC (cmd_op) 0x01 #define CMD_QUIT (cmd_op) 0x02 - typedef struct _key_command { cmd_op cmd; key k; @@ -66,7 +65,7 @@ void ed_run(editor* ed) { cmd_putc(scr, buf, kc.k); } else if (kc.cmd == CMD_QUIT && cmd_quit(scr, buf)) { break; - } else { + } else if (kc.cmd != NULL) { kc.cmd(scr, buf); } } @@ -94,7 +93,7 @@ key_command ctrlCmds(key_command kc) { kc.cmd = cmd_del_line; break; default: - kc.cmd = cmd_noop; + kc.cmd = NULL;; break; } return kc; @@ -144,7 +143,7 @@ key_command editCmds(key_command kc) { } key_command read_input() { - key_command kc = {cmd_noop, {'\0', VK_NONE}}; + key_command kc = {NULL, {'\0', VK_NONE}}; kc.k.key = getch(); kc.k.vkey = getsysvar_vkeycode();