summaryrefslogtreecommitdiff
path: root/src/user/lib/libc/std/readline.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/user/lib/libc/std/readline.c')
-rw-r--r--src/user/lib/libc/std/readline.c19
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--;