All of lore.kernel.org
 help / color / mirror / Atom feed
* [PATCH 1/1] cmd: change suppress newline in echo command
@ 2021-01-20 16:43 Heinrich Schuchardt
  2021-01-21  3:26 ` Simon Glass
  0 siblings, 1 reply; 2+ messages in thread
From: Heinrich Schuchardt @ 2021-01-20 16:43 UTC (permalink / raw)
  To: u-boot

By default the echo command emits its arguments followed by a line feed.

If any of the arguments contains the sub-string "\c", the line feed is
suppressed.

This does not match shells used in Linux and BSD where the first argument
has to be -n to suppress the line feed.

The hush shell interferes with the parsing of backslashes. E.g. in the
following command line quadruple backslashes are required for suppressing
the line feed:

for i in 1 2 3; do for j in 4 5; do echo \\\\c ${i}${j}; done; echo; done;

To avoid unexpected behavior the patch changes echo to use -n as first
argument to suppress the line feed.

Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
---
 cmd/echo.c | 49 ++++++++++++++++++-------------------------------
 1 file changed, 18 insertions(+), 31 deletions(-)

diff --git a/cmd/echo.c b/cmd/echo.c
index d02a4cfd58..fda844ee9d 100644
--- a/cmd/echo.c
+++ b/cmd/echo.c
@@ -10,47 +10,34 @@
 static int do_echo(struct cmd_tbl *cmdtp, int flag, int argc,
 		   char *const argv[])
 {
-	int i;
-	int putnl = 1;
-
-	for (i = 1; i < argc; i++) {
-		char *p = argv[i];
-		char *nls; /* new-line suppression */
+	int i = 1;
+	bool space = false;
+	bool newline = true;
+
+	if (argc > 1) {
+		if (!strcmp(argv[1], "-n")) {
+			newline = false;
+			++i;
+		}
+	}

-		if (i > 1)
+	for (; i < argc; ++i) {
+		if (space) {
 			putc(' ');
-
-		nls = strstr(p, "\\c");
-		if (nls) {
-			char *prenls = p;
-
-			putnl = 0;
-			/*
-			 * be paranoid and guess that someone might
-			 * say \c more than once
-			 */
-			while (nls) {
-				*nls = '\0';
-				puts(prenls);
-				*nls = '\\';
-				prenls = nls + 2;
-				nls = strstr(prenls, "\\c");
-			}
-			puts(prenls);
-		} else {
-			puts(p);
 		}
+		puts(argv[i]);
+		space = true;
 	}

-	if (putnl)
+	if (newline)
 		putc('\n');

 	return 0;
 }

 U_BOOT_CMD(
-	echo,	CONFIG_SYS_MAXARGS,	1,	do_echo,
+	echo, CONFIG_SYS_MAXARGS, 1, do_echo,
 	"echo args to console",
-	"[args..]\n"
-	"    - echo args to console; \\c suppresses newline"
+	"[-n] [args..]\n"
+	"    - echo args to console; -n suppresses newline"
 );
--
2.29.2

^ permalink raw reply related	[flat|nested] 2+ messages in thread

* [PATCH 1/1] cmd: change suppress newline in echo command
  2021-01-20 16:43 [PATCH 1/1] cmd: change suppress newline in echo command Heinrich Schuchardt
@ 2021-01-21  3:26 ` Simon Glass
  0 siblings, 0 replies; 2+ messages in thread
From: Simon Glass @ 2021-01-21  3:26 UTC (permalink / raw)
  To: u-boot

Hi Heinrich,

On Wed, 20 Jan 2021 at 09:43, Heinrich Schuchardt <xypron.glpk@gmx.de> wrote:
>
> By default the echo command emits its arguments followed by a line feed.
>
> If any of the arguments contains the sub-string "\c", the line feed is
> suppressed.
>
> This does not match shells used in Linux and BSD where the first argument
> has to be -n to suppress the line feed.
>
> The hush shell interferes with the parsing of backslashes. E.g. in the
> following command line quadruple backslashes are required for suppressing
> the line feed:
>
> for i in 1 2 3; do for j in 4 5; do echo \\\\c ${i}${j}; done; echo; done;
>
> To avoid unexpected behavior the patch changes echo to use -n as first
> argument to suppress the line feed.
>
> Signed-off-by: Heinrich Schuchardt <xypron.glpk@gmx.de>
> ---
>  cmd/echo.c | 49 ++++++++++++++++++-------------------------------
>  1 file changed, 18 insertions(+), 31 deletions(-)

Reviewed-by: Simon Glass <sjg@chromium.org>

This could be a good oppty to add a test for the echo command.

^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2021-01-21  3:26 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2021-01-20 16:43 [PATCH 1/1] cmd: change suppress newline in echo command Heinrich Schuchardt
2021-01-21  3:26 ` Simon Glass

This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.