[PATCH 1/6] shell: Move line editor output check
Sebastian Huber
sebastian.huber at embedded-brains.de
Wed Apr 6 07:17:27 UTC 2022
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(-)
diff --git a/cpukit/libmisc/shell/shell.c b/cpukit/libmisc/shell/shell.c
index a2ed909aae..aa1952e883 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) {
+ 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 */
--
2.34.1
More information about the devel
mailing list