diff options
Diffstat (limited to 'src/user/lib/libc/std/readline.c')
-rw-r--r-- | src/user/lib/libc/std/readline.c | 19 |
1 files changed, 10 insertions, 9 deletions
diff --git a/src/user/lib/libc/std/readline.c b/src/user/lib/libc/std/readline.c index 50e4f0d..4177bf6 100644 --- a/src/user/lib/libc/std/readline.c +++ b/src/user/lib/libc/std/readline.c @@ -1,15 +1,14 @@ #include <readline.h> #include <stdlib.h> -char* freadln(FILE f) { - fprint(f, "\x1b[e"); // enable keyboard echo +char* freadln(FILE *f) { int i; char *p = (char*)malloc(256); char *b = p; while (1) { - int l = read(f, 0, 255, b); + int l = fread(b, 255, 1, f); if (l < 0) { free(b); return 0; @@ -36,15 +35,14 @@ char* freadln(FILE f) { } char* readln() { - return freadln(term); + return freadln(&term); } // ** READLINE -char *freadline(FILE f, readline_history *h) { +char *freadline(FILE *f, readline_history *h) { int i; - fprint(f, "\x1b[h"); // disable keyboard echo if (h->str == 0) { h->str = (char**)malloc(h->max * sizeof(char*)); @@ -78,12 +76,15 @@ char *freadline(FILE f, readline_history *h) { int te = cur - str; char buf[16]; - int l = read(f, 0, 16, buf); + int l = fread(buf, 16, 1, f); if (l < 0) return 0; char *in = buf; while (in < buf + l) { - if (*in == 27) { + if (*in == 4) { // eot + fprintf(f, "^D\n"); + return 0; + } else if (*in == 27) { in++; if (*in == '[') { in++; @@ -142,7 +143,7 @@ char *freadline(FILE f, readline_history *h) { if (finished) { - fprintf(f, "\n"); + fprint(f, "\n"); if (h->str[h->n-1] != str) h->n--; |