"fix backspace, get left/right working (in insert mode though...)"
This commit is contained in:
parent
0ed0d32b27
commit
1940122a89
3 changed files with 53 additions and 13 deletions
36
src/main.c
36
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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue