From a7a0138754da60a37437b7a857e632db21b514a3 Mon Sep 17 00:00:00 2001 From: Kelvin Sherlock Date: Sat, 6 Apr 2019 20:54:37 -0400 Subject: [PATCH] simplify readline a bit. EOF will auto-print a CR if there was a prompt. --- src/debug_shell.re2c | 1 - src/debug_sweet16.re2c | 3 +-- src/readline.c | 37 +++++++++++++++++++++++++------------ 3 files changed, 26 insertions(+), 15 deletions(-) diff --git a/src/debug_shell.re2c b/src/debug_shell.re2c index 949f27b..665021a 100644 --- a/src/debug_shell.re2c +++ b/src/debug_shell.re2c @@ -1769,7 +1769,6 @@ int debug_shell(int code) { for(;;) { cp = x_readline("] "); if (!cp) { - fputs("\n", stdout); if (++control_d_count < 2) continue; fputs("quit\n", stdout); diff --git a/src/debug_sweet16.re2c b/src/debug_sweet16.re2c index 93068ae..1aea18d 100644 --- a/src/debug_sweet16.re2c +++ b/src/debug_sweet16.re2c @@ -390,8 +390,7 @@ uint32_t sweet16_asm_shell(uint32_t addr) { for(;;) { const char *cp = x_readline("!!"); - if (!cp) { fputc('\n', stdout); return addr; } - if (!*cp) return addr; + if (!cp || !*cp) return addr; parse_line(cp, &addr); diff --git a/src/readline.c b/src/readline.c index d9fd215..8476ea2 100644 --- a/src/readline.c +++ b/src/readline.c @@ -57,7 +57,10 @@ char *x_readline(const char *prompt) { el_prompt = prompt; cp = el_gets(el, &count); el_prompt = NULL; - if (count <= 0) return NULL; + if (count <= 0) { + if (prompt) fputc('\n', stdout); + return NULL; + } if (count > sizeof(buffer) - 1) return ""; @@ -109,7 +112,10 @@ char *x_readline(const char *prompt) { } cp = readline(prompt); - if (!cp) return NULL; + if (!cp) { + if (prompt) fputc('\n', stdout); + return NULL; + } count = strlen(cp); if (count > sizeof(buffer) - 1) { free(cp); @@ -149,6 +155,7 @@ char *x_readline(const char *prompt) { HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); HANDLE hOut = GetStdHandle(STD_OUTPUT_HANDLE); + /* MS CRT uses -2 to indicate there is no stdin/stdout/stderr fileno */ /* if (h == INVALID_HANDLE_VALUE) { @@ -203,20 +210,25 @@ char *x_readline(const char *prompt) { if (!ok) { /* msys/cygwin? */ - fprintf(stderr, "WriteConsole: %lx (h = %p)\n", GetLastError(), hOut); + // fprintf(stderr, "WriteConsole: %lx (h = %p)\n", GetLastError(), hOut); fflush(stderr); - fputs(prompt, stdout); + if (prompt) fputs(prompt, stdout); fflush(stdout); char *cp = fgets(buffer, sizeof(buffer), stdin); - if (!cp) return NULL; + if (!cp) { + if (prompt) fputc('\n', stdout); + return NULL; + } cleanup_buffer(buffer, strlen(buffer)); return buffer; } ok = ReadConsole(hIn, buffer, sizeof(buffer), &count, NULL); if (!ok) { - fprintf(stderr, "Error: %lx (h = %p)\n", GetLastError(), hIn); - fprintf(stderr, "Type: %08x\n", GetFileType(hIn)); - fflush(stderr); + if (prompt) fputc('\n', stdout); + // fflush(stdout); + // fprintf(stderr, "Error: %lx (h = %p)\n", GetLastError(), hIn); + // fprintf(stderr, "Type: %08x\n", GetFileType(hIn)); + // fflush(stderr); return NULL; } cleanup_buffer(buffer, count); @@ -230,16 +242,17 @@ char *x_readline(const char *prompt) { char *x_readline(const char *prompt) { static char buffer[1024]; - fputs(prompt, stdout); + + if (prompt) fputs(prompt, stdout); fflush(stdout); for(;;) { int ok = read(STDIN_FILENO, buffer, sizeof(buffer)-1); - if (ok < 0) { - if (ok == EINTR) continue; + if (ok < 0 && ok == EINTR) continue; + if (ok <= 0) { + if (prompt) fputc('\n', stdout); return NULL; } - if (ok == 0) return NULL; cleanup_buffer(buffer, ok); return buffer;