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(;;) {
cp = x_readline("] ");
if (!cp) {
fputs("\n", stdout);
if (++control_d_count < 2)
continue;
fputs("quit\n", stdout);

View File

@ -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);

View File

@ -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;