simplify readline a bit. EOF will auto-print a CR if there was a prompt.

This commit is contained in:
Kelvin Sherlock 2019-04-06 20:54:37 -04:00
parent 290f36c4d3
commit a7a0138754
3 changed files with 26 additions and 15 deletions

View File

@ -1769,7 +1769,6 @@ int debug_shell(int code) {
for(;;) { for(;;) {
cp = x_readline("] "); cp = x_readline("] ");
if (!cp) { if (!cp) {
fputs("\n", stdout);
if (++control_d_count < 2) if (++control_d_count < 2)
continue; continue;
fputs("quit\n", stdout); fputs("quit\n", stdout);

View File

@ -390,8 +390,7 @@ uint32_t sweet16_asm_shell(uint32_t addr) {
for(;;) { for(;;) {
const char *cp = x_readline("!!"); const char *cp = x_readline("!!");
if (!cp) { fputc('\n', stdout); return addr; } if (!cp || !*cp) return addr;
if (!*cp) return addr;
parse_line(cp, &addr); parse_line(cp, &addr);

View File

@ -57,7 +57,10 @@ char *x_readline(const char *prompt) {
el_prompt = prompt; el_prompt = prompt;
cp = el_gets(el, &count); cp = el_gets(el, &count);
el_prompt = NULL; el_prompt = NULL;
if (count <= 0) return NULL; if (count <= 0) {
if (prompt) fputc('\n', stdout);
return NULL;
}
if (count > sizeof(buffer) - 1) return ""; if (count > sizeof(buffer) - 1) return "";
@ -109,7 +112,10 @@ char *x_readline(const char *prompt) {
} }
cp = readline(prompt); cp = readline(prompt);
if (!cp) return NULL; if (!cp) {
if (prompt) fputc('\n', stdout);
return NULL;
}
count = strlen(cp); count = strlen(cp);
if (count > sizeof(buffer) - 1) { if (count > sizeof(buffer) - 1) {
free(cp); free(cp);
@ -149,6 +155,7 @@ char *x_readline(const char *prompt) {
HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE); HANDLE hIn = GetStdHandle(STD_INPUT_HANDLE);
HANDLE hOut = GetStdHandle(STD_OUTPUT_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) { if (h == INVALID_HANDLE_VALUE) {
@ -203,20 +210,25 @@ char *x_readline(const char *prompt) {
if (!ok) { if (!ok) {
/* msys/cygwin? */ /* msys/cygwin? */
fprintf(stderr, "WriteConsole: %lx (h = %p)\n", GetLastError(), hOut); // fprintf(stderr, "WriteConsole: %lx (h = %p)\n", GetLastError(), hOut);
fflush(stderr); fflush(stderr);
fputs(prompt, stdout); if (prompt) fputs(prompt, stdout);
fflush(stdout); fflush(stdout);
char *cp = fgets(buffer, sizeof(buffer), stdin); 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)); cleanup_buffer(buffer, strlen(buffer));
return buffer; return buffer;
} }
ok = ReadConsole(hIn, buffer, sizeof(buffer), &count, NULL); ok = ReadConsole(hIn, buffer, sizeof(buffer), &count, NULL);
if (!ok) { if (!ok) {
fprintf(stderr, "Error: %lx (h = %p)\n", GetLastError(), hIn); if (prompt) fputc('\n', stdout);
fprintf(stderr, "Type: %08x\n", GetFileType(hIn)); // fflush(stdout);
fflush(stderr); // fprintf(stderr, "Error: %lx (h = %p)\n", GetLastError(), hIn);
// fprintf(stderr, "Type: %08x\n", GetFileType(hIn));
// fflush(stderr);
return NULL; return NULL;
} }
cleanup_buffer(buffer, count); cleanup_buffer(buffer, count);
@ -230,16 +242,17 @@ char *x_readline(const char *prompt) {
char *x_readline(const char *prompt) { char *x_readline(const char *prompt) {
static char buffer[1024]; static char buffer[1024];
fputs(prompt, stdout);
if (prompt) fputs(prompt, stdout);
fflush(stdout); fflush(stdout);
for(;;) { for(;;) {
int ok = read(STDIN_FILENO, buffer, sizeof(buffer)-1); int ok = read(STDIN_FILENO, buffer, sizeof(buffer)-1);
if (ok < 0) { if (ok < 0 && ok == EINTR) continue;
if (ok == EINTR) continue; if (ok <= 0) {
if (prompt) fputc('\n', stdout);
return NULL; return NULL;
} }
if (ok == 0) return NULL;
cleanup_buffer(buffer, ok); cleanup_buffer(buffer, ok);
return buffer; return buffer;