diff --git a/src/main.c b/src/main.c index fd19b0f..c9b4235 100644 --- a/src/main.c +++ b/src/main.c @@ -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); diff --git a/src/system/linux/linux.c b/src/system/linux/linux.c index 93e0ee6..26895b6 100644 --- a/src/system/linux/linux.c +++ b/src/system/linux/linux.c @@ -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); diff --git a/src/system/system.h b/src/system/system.h index 41dd575..0a995ca 100644 --- a/src/system/system.h +++ b/src/system/system.h @@ -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);