"fix backspace, get left/right working (in insert mode though...)"

This commit is contained in:
IoIxD 2026-01-21 14:10:08 -07:00
commit 1940122a89
3 changed files with 53 additions and 13 deletions

View file

@ -13,29 +13,55 @@ MSH_ENTRY_POINT {
int out;
char *buf = msh_callocate(2048, sizeof(char));
int i = 0, n = 0, last = 0;
unsigned long long sz = 0;
SIZE_TYPE sz = 0, leftoff = 0;
msh_print_strings(msh_working_directory(), " %> ", 0);
while ((out = msh_read_input(buf, &sz, 2048)), out > 0) {
while ((out = msh_read_input(buf, &sz, 2048)), out != -1) {
switch (out) {
/* backspace */
case 0x7F:
if (sz > 0) {
msh_move_cursor(1);
msh_move_cursor(-1);
msh_write(" ", 1);
msh_move_cursor(1);
msh_move_cursor(-1);
buf[sz--] = '\0';
}
break;
/* Ctrl-C */
case 0x3:
msh_print_string("^C\n\r");
goto end_loop;
break;
/* left */
case -3:
if (sz > 0) {
msh_move_cursor(-1);
--sz;
++leftoff;
}
break;
/* right */
case -4:
if (leftoff > 0) {
msh_move_cursor(1);
--leftoff;
}
if (sz < 2048) {
++sz;
}
break;
default:
if (leftoff > 0) {
--leftoff;
}
break;
}
}
sz += leftoff;
buf[sz] = '\0';
if (*buf != '\0') {
msh_lexer_parse(lexer, buf, sz + 1);
msh_lexer_execute(lexer);

View file

@ -25,13 +25,23 @@ int msh_read_input(char *ptr, SIZE_TYPE *size, SIZE_TYPE n) {
*size += sz;
} else {
switch (ch) {
/* left/right arrow */
case '\033':
SYSCALL(read, 0, &ch, 1);
if (ch == '[') {
SYSCALL(read, 0, &ch, 1);
switch (ch) {
case 'C':
return -4;
case 'D':
return -3;
}
}
break;
/* return */
case '\r':
ptr[*size] = '\0';
SYSCALL(write, 1, "\n\r", 2);
return -1;
break;
/* backspace */
default:
break;
}
@ -47,10 +57,10 @@ int msh_read_input(char *ptr, SIZE_TYPE *size, SIZE_TYPE n) {
void msh_move_cursor(signed int offset) {
int i;
char *cmd = "\33[D";
if (offset <= 0) {
offset &= ~0xffffffff;
cmd = "\33[C";
char *cmd = "\33[C";
if (offset < 0) {
offset *= -1;
cmd = "\33[D";
}
for (i = 0; i < offset; i++) {
SYSCALL(write, 1, cmd, 3);

View file

@ -60,8 +60,12 @@ void msh_file_read(msh_file *file, char *ptr, SIZE_TYPE n);
/*
* Read user input into ptr, stopping if it has reached n characters.
* RETURNS:
* * -2 = if it ran out of space.
* * -1 = if finished reading
* * -2 = if it ran out of space.
* * -3 = left arrow
* * -4 = right arrow
* * -5 = ctrl left arrow
* * -6 = ctrl right arrow
* * 0 < ascii character
*/
int msh_read_input(char *ptr, SIZE_TYPE *size, SIZE_TYPE n);