"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;
|
int out;
|
||||||
char *buf = msh_callocate(2048, sizeof(char));
|
char *buf = msh_callocate(2048, sizeof(char));
|
||||||
int i = 0, n = 0, last = 0;
|
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);
|
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) {
|
switch (out) {
|
||||||
|
/* backspace */
|
||||||
case 0x7F:
|
case 0x7F:
|
||||||
if (sz > 0) {
|
if (sz > 0) {
|
||||||
msh_move_cursor(1);
|
msh_move_cursor(-1);
|
||||||
msh_write(" ", 1);
|
msh_write(" ", 1);
|
||||||
msh_move_cursor(1);
|
msh_move_cursor(-1);
|
||||||
buf[sz--] = '\0';
|
buf[sz--] = '\0';
|
||||||
}
|
}
|
||||||
|
|
||||||
break;
|
break;
|
||||||
/* Ctrl-C */
|
/* Ctrl-C */
|
||||||
case 0x3:
|
case 0x3:
|
||||||
msh_print_string("^C\n\r");
|
msh_print_string("^C\n\r");
|
||||||
goto end_loop;
|
goto end_loop;
|
||||||
break;
|
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') {
|
if (*buf != '\0') {
|
||||||
msh_lexer_parse(lexer, buf, sz + 1);
|
msh_lexer_parse(lexer, buf, sz + 1);
|
||||||
msh_lexer_execute(lexer);
|
msh_lexer_execute(lexer);
|
||||||
|
|
|
||||||
|
|
@ -25,13 +25,23 @@ int msh_read_input(char *ptr, SIZE_TYPE *size, SIZE_TYPE n) {
|
||||||
*size += sz;
|
*size += sz;
|
||||||
} else {
|
} else {
|
||||||
switch (ch) {
|
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 */
|
/* return */
|
||||||
case '\r':
|
case '\r':
|
||||||
ptr[*size] = '\0';
|
|
||||||
SYSCALL(write, 1, "\n\r", 2);
|
SYSCALL(write, 1, "\n\r", 2);
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
|
||||||
/* backspace */
|
|
||||||
default:
|
default:
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
@ -47,10 +57,10 @@ int msh_read_input(char *ptr, SIZE_TYPE *size, SIZE_TYPE n) {
|
||||||
|
|
||||||
void msh_move_cursor(signed int offset) {
|
void msh_move_cursor(signed int offset) {
|
||||||
int i;
|
int i;
|
||||||
char *cmd = "\33[D";
|
char *cmd = "\33[C";
|
||||||
if (offset <= 0) {
|
if (offset < 0) {
|
||||||
offset &= ~0xffffffff;
|
offset *= -1;
|
||||||
cmd = "\33[C";
|
cmd = "\33[D";
|
||||||
}
|
}
|
||||||
for (i = 0; i < offset; i++) {
|
for (i = 0; i < offset; i++) {
|
||||||
SYSCALL(write, 1, cmd, 3);
|
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.
|
* Read user input into ptr, stopping if it has reached n characters.
|
||||||
* RETURNS:
|
* RETURNS:
|
||||||
* * -2 = if it ran out of space.
|
|
||||||
* * -1 = if finished reading
|
* * -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
|
* * 0 < ascii character
|
||||||
*/
|
*/
|
||||||
int msh_read_input(char *ptr, SIZE_TYPE *size, SIZE_TYPE n);
|
int msh_read_input(char *ptr, SIZE_TYPE *size, SIZE_TYPE n);
|
||||||
|
|
|
||||||
Loading…
Add table
Add a link
Reference in a new issue