aboutsummaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
authorB. Watson <urchlay@slackware.uk>2026-03-26 02:18:00 -0400
committerB. Watson <urchlay@slackware.uk>2026-03-26 02:18:00 -0400
commit706a53bfd61f711ae43ca1adf0d65fd5fdfe67da (patch)
tree58115f6b2afa7521ce63093ca4b0f0c7981e0aae /src
parent19aa5714cc3e51849bed0434769238cfcbb3efd8 (diff)
downloadfujinet-chat-706a53bfd61f711ae43ca1adf0d65fd5fdfe67da.tar.gz
editbox behaving better now, but still not right.
Diffstat (limited to 'src')
-rw-r--r--src/edbox.c47
-rw-r--r--src/edbox.h3
2 files changed, 34 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;
diff --git a/src/edbox.h b/src/edbox.h
index d35723e..ae0acfd 100644
--- a/src/edbox.h
+++ b/src/edbox.h
@@ -2,7 +2,10 @@
/**** public API ****/
+// #define EDBOX_SIZE 20 /* for testing only! */
+// #define EDBOX_MAXPOS 19 /* 1 less than EDBOX_SIZE! */
#define EDBOX_SIZE 240
+#define EDBOX_MAXPOS 239
extern char edbox_visible;
extern char edbox_len;