diff options
Diffstat (limited to 'unix/main.c')
-rw-r--r-- | unix/main.c | 32 |
1 files changed, 30 insertions, 2 deletions
diff --git a/unix/main.c b/unix/main.c index 73da1ecfc2..79fe1b5153 100644 --- a/unix/main.c +++ b/unix/main.c @@ -15,7 +15,10 @@ #include "runtime.h" #include "repl.h" +#ifdef USE_READLINE #include <readline/readline.h> +#include <readline/history.h> +#endif static char *str_join(const char *s1, int sep_char, const char *s2) { int l1 = strlen(s1); @@ -31,16 +34,41 @@ static char *str_join(const char *s1, int sep_char, const char *s2) { return s; } +static char *prompt(char *p) { +#ifdef USE_READLINE + char *line = readline(p); + if (line) { + add_history(line); + } +#else + static char buf[256]; + fputs(p, stdout); + char *s = fgets(buf, sizeof(buf), stdin); + if (!s) { + return NULL; + } + int l = strlen(buf); + if (buf[l - 1] == '\n') { + buf[l - 1] = 0; + } else { + l++; + } + char *line = m_new(char, l); + memcpy(line, buf, l); +#endif + return line; +} + static void do_repl(void) { for (;;) { - char *line = readline(">>> "); + char *line = prompt(">>> "); if (line == NULL) { // EOF return; } if (mp_repl_is_compound_stmt(line)) { for (;;) { - char *line2 = readline("... "); + char *line2 = prompt("... "); if (line2 == NULL || strlen(line2) == 0) { break; } |