diff options
Diffstat (limited to 'src/edbox.c')
| -rw-r--r-- | src/edbox.c | 47 |
1 files changed, 31 insertions, 16 deletions
diff --git a/src/edbox.c b/src/edbox.c index 8c6e663..ff61359 100644 --- a/src/edbox.c +++ b/src/edbox.c @@ -27,7 +27,7 @@ static void show_cursor(void) { } void edbox_clear(void) { - memset(edit_box, 0, EDBOX_SIZE + 1); + bzero(edit_box, EDBOX_SIZE + 1); edbox_pos = edbox_len = 0; show_cursor(); // not needed? seems it is.. } @@ -55,7 +55,23 @@ void edbox_hide(void) { } void move_right(void) { - memmove(edit_box + edbox_pos + 1, edit_box + edbox_pos, EDBOX_SIZE - edbox_pos - 1); + memmove(edit_box + edbox_pos + 1, edit_box + edbox_pos, EDBOX_MAXPOS - edbox_pos); +} + +void storechr(char c) { + edit_box[edbox_pos] = c; +} + +void inschr(char c) { + if(edbox_len == EDBOX_MAXPOS) { + /* buffer full, can't insert */ + bell(); + return; + } + move_right(); + edbox_len++; + storechr(c); + edbox_pos++; } /* note: c will never be an EOL. @@ -67,22 +83,24 @@ void edbox_putc(char c) { if(!c) return; /* no inserting nulls */ - if(!typeover) - move_right(); + /* cannot insert *or* typeover at end of buffer! */ + if(edbox_pos == EDBOX_MAXPOS) { + bell(); + return; + } - edit_box[edbox_pos] = c; - if(edbox_pos < EDBOX_SIZE - 1) { + if(typeover) { + storechr(c); edbox_pos++; - edbox_len++; } else { - bell(); + inschr(c); } } static void copy_to_old(void) { if(!edbox_len) return; memcpy(old_edbox, edit_box, edbox_len); - memset(old_edbox + edbox_len, 0, (EDBOX_SIZE - 1) - edbox_len); + bzero(old_edbox + edbox_len, EDBOX_MAXPOS - edbox_len); old_len = edbox_len; } @@ -95,7 +113,7 @@ static void restore_old(void) { static void del_char(void) { if(!edbox_len) return; - memmove(edit_box + edbox_pos, edit_box + edbox_pos + 1, EDBOX_SIZE - edbox_pos - 1); + memmove(edit_box + edbox_pos, edit_box + edbox_pos + 1, EDBOX_MAXPOS - edbox_pos); edbox_len--; } @@ -163,8 +181,9 @@ static void forward_word(void) { static void del_to_start(void) { if(!edbox_pos) return; - memmove(edit_box, edit_box + edbox_pos, EDBOX_SIZE - edbox_pos - 1); + memmove(edit_box, edit_box + edbox_pos, EDBOX_MAXPOS - edbox_pos); edbox_len -= edbox_pos; + bzero(edit_box + edbox_len, EDBOX_MAXPOS - edbox_len); edbox_pos = 0; } @@ -237,11 +256,7 @@ void edbox_keystroke(char c) { edbox_clear(); break; case XCH_INSCHR: - if(edbox_len < EDBOX_SIZE - 1) { - move_right(); - edbox_len++; - edit_box[edbox_pos] = ' '; - } + inschr(' '); break; case CH_INSLINE: typeover = !typeover; |
