From 9320c7ecaaf88f7276d5d19d9e195729c68acfa2 Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Tue, 5 Apr 2022 16:00:53 +0200 Subject: shell: Move line editor output check Move call to isatty() to caller of rtems_shell_line_editor(). This avoids a dependency on isatty() in rtems_shell_line_editor(). --- cpukit/libmisc/shell/shell.c | 82 ++++++++++++++++++++------------------------ 1 file changed, 38 insertions(+), 44 deletions(-) (limited to 'cpukit/libmisc/shell/shell.c') diff --git a/cpukit/libmisc/shell/shell.c b/cpukit/libmisc/shell/shell.c index a2ed909aae..2ce5e5a69d 100644 --- a/cpukit/libmisc/shell/shell.c +++ b/cpukit/libmisc/shell/shell.c @@ -313,32 +313,21 @@ static int rtems_shell_line_editor( int c; int col; int last_col; - int output; char line[size]; char new_line[size]; int up; int cmd = -1; int inserting = 1; int in_fileno = fileno(in); - int out_fileno; - - _Assert(out != NULL); - out_fileno = fileno(out); - - /* - * Only this task can use this file descriptor because calling - * fileno will block if another thread call made a call on this - * descriptor. - */ - output = (out && isatty(in_fileno)); col = last_col = 0; tcdrain(in_fileno); - if (out) - tcdrain(out_fileno); + if (out != NULL) { + tcdrain(fileno(out)); + } - if (output && prompt) + if (out != NULL && prompt != NULL) fprintf(out, "\r%s", prompt); line[0] = 0; @@ -346,7 +335,7 @@ static int rtems_shell_line_editor( for (;;) { - if (output) + if (out != NULL) fflush(out); extended_key = rtems_shell_getchar(in); @@ -368,15 +357,14 @@ static int rtems_shell_line_editor( switch (c) { case RTEMS_SHELL_KEYS_END: - if (output) + if (out != NULL) fprintf(out, "%s", line + col); col = (int) strlen (line); break; case RTEMS_SHELL_KEYS_HOME: - if (output) { - if (prompt) - fprintf(out,"\r%s", prompt); + if (out != NULL && prompt != NULL) { + fprintf(out,"\r%s", prompt); } col = 0; break; @@ -407,7 +395,7 @@ static int rtems_shell_line_editor( int end; int bs; rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%s ", prompt, line); end = (int) strlen (line); for (bs = 0; bs < ((end - col) + 1); bs++) @@ -426,9 +414,8 @@ static int rtems_shell_line_editor( switch (c) { case 1: /*Control-a*/ - if (output) { - if (prompt) - fprintf(out,"\r%s", prompt); + if (out != NULL && prompt != NULL) { + fprintf(out,"\r%s", prompt); } col = 0; break; @@ -437,7 +424,7 @@ static int rtems_shell_line_editor( if (col > 0) { col--; - if (output) + if (out != NULL) fputc('\b', out); } break; @@ -446,7 +433,7 @@ static int rtems_shell_line_editor( if (strlen(line)) { if (col < strlen(line)) { rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { int bs; fprintf(out,"%s \b", line + col); for (bs = 0; bs < ((int) strlen (line) - col); bs++) @@ -458,26 +445,26 @@ static int rtems_shell_line_editor( /* Fall through */ case EOF: - if (output) + if (out != NULL) fputc('\n', out); return -2; case 5: /*Control-e*/ - if (output) + if (out != NULL) fprintf(out, "%s", line + col); col = (int) strlen (line); break; case 6: /* Control-F */ if ((col < size) && (line[col] != '\0')) { - if (output) + if (out != NULL) fputc(line[col], out); col++; } break; case 7: /* Control-G */ - if (output) { + if (out != NULL) { /* * The (int) cast is needed because the width specifier (%*) * must be an int, but strlen() returns a size_t. Without @@ -492,7 +479,7 @@ static int rtems_shell_line_editor( case 11: /*Control-k*/ if (line[col]) { - if (output) { + if (out != NULL) { int end = strlen(line); int bs; fprintf(out,"%*c", end - col, ' '); @@ -504,7 +491,7 @@ static int rtems_shell_line_editor( break; case '\f': - if (output) { + if (out != NULL) { int end; int bs; fputc('\f',out); @@ -522,7 +509,7 @@ static int rtems_shell_line_editor( int bs; col--; rtems_shell_move_left(line + col, 1); - if (output) { + if (out != NULL) { fprintf(out,"\b%s \b", line + col); for (bs = 0; bs < ((int) strlen (line) - col); bs++) fputc('\b', out); @@ -536,7 +523,7 @@ static int rtems_shell_line_editor( /* * Process the command. */ - if (output) + if (out != NULL) fprintf(out,"\n"); /* @@ -564,7 +551,7 @@ static int rtems_shell_line_editor( case 16: /* Control-P */ if ((cmd >= (count - 1)) || (strlen(cmds[cmd + 1]) == 0)) { - if (output) + if (out != NULL) fputc('\x7', out); break; } @@ -584,7 +571,7 @@ static int rtems_shell_line_editor( cmd++; } else { if (cmd < 0) { - if (output) + if (out != NULL) fprintf(out, "\x7"); break; } @@ -602,7 +589,7 @@ static int rtems_shell_line_editor( col = strlen (line); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%*c", prompt, clen, ' '); fprintf(out,"\r%s%s", prompt, line); } @@ -615,17 +602,17 @@ static int rtems_shell_line_editor( char tmp; if (col == strlen(line)) { col--; - if (output) + if (out != NULL) fprintf(out,"\b"); } tmp = line[col]; line[col] = line[col - 1]; line[col - 1] = tmp; - if (output) + if (out != NULL) fprintf(out,"\b%c%c", line[col - 1], line[col]); col++; } else { - if (output) + if (out != NULL) fputc('\x7', out); } break; @@ -639,7 +626,7 @@ static int rtems_shell_line_editor( int bs; rtems_shell_move_left(line, col); - if (output) { + if (out != NULL) { fprintf(out,"\r%s%*c", prompt, clen, ' '); fprintf(out,"\r%s%s", prompt, line); @@ -658,7 +645,7 @@ static int rtems_shell_line_editor( int ch, bs; for (ch = end + 1; ch > col; ch--) line[ch] = line[ch - 1]; - if (output) { + if (out != NULL) { fprintf(out, "%s", line + col); for (bs = 0; bs < (end - col + 1); bs++) fputc('\b', out); @@ -667,7 +654,7 @@ static int rtems_shell_line_editor( line[col++] = c; if (col > end) line[col] = '\0'; - if (output) + if (out != NULL) fputc(c, out); } break; @@ -869,6 +856,7 @@ bool rtems_shell_main_loop( int line = 0; FILE *stdinToClose = NULL; FILE *stdoutToClose = NULL; + FILE *line_editor_output; rtems_shell_init_environment(); @@ -974,6 +962,12 @@ bool rtems_shell_main_loop( setvbuf(stdin, NULL, _IONBF, 0); setvbuf(stdout, NULL, _IONBF, 0); + if (isatty(fileno(stdin))) { + line_editor_output = stdout; + } else { + line_editor_output = NULL; + } + /* * Allocate the command line buffers. */ @@ -1044,7 +1038,7 @@ bool rtems_shell_main_loop( /* getcmd section */ cmd = rtems_shell_line_editor(cmds, cmd_count, RTEMS_SHELL_CMD_SIZE, prompt, - stdin, stdout); + stdin, line_editor_output); if (cmd == -1) continue; /* empty line */ -- cgit v1.2.3