summary refs log tree commit diff
diff options
context:
space:
mode:
authorHerbert Xu <herbert@gondor.apana.org.au>2014-10-27 16:23:33 +0800
committerHerbert Xu <herbert@gondor.apana.org.au>2014-10-27 16:23:33 +0800
commit7a784244625d5489c0fc779201c349555dc5f8bc (patch)
tree28950eb39fa8a2760db318713c6350064c945309
parent[BUILTIN] Optimise handling of backslash octals in printf (diff)
downloaddash-7a784244625d5489c0fc779201c349555dc5f8bc.tar.gz
dash-7a784244625d5489c0fc779201c349555dc5f8bc.zip
[BUILTIN] Simplify echo command
Signed-off-by: Herbert Xu <herbert@gondor.apana.org.au>
Diffstat (limited to '')
-rw-r--r--ChangeLog1
-rw-r--r--src/bltin/printf.c28
2 files changed, 9 insertions, 20 deletions
diff --git a/ChangeLog b/ChangeLog
index 60fd4b6..f015066 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -9,6 +9,7 @@
 	* Remove getintmax in printf.
 	* Use error instead of warnx for fatal errors in printf.
 	* Optimise handling of backslash octals in printf.
+	* Simplify echo command.
 
 2014-10-13  Eric Blake <eblake@redhat.com>
 
diff --git a/src/bltin/printf.c b/src/bltin/printf.c
index 6f39526..9673e10 100644
--- a/src/bltin/printf.c
+++ b/src/bltin/printf.c
@@ -442,33 +442,21 @@ check_conversion(const char *s, const char *ep)
 int
 echocmd(int argc, char **argv)
 {
-	int nonl = 0;
-	struct output *outs = out1;
-
-	if (!*++argv)
-		goto end;
-	if (equal(*argv, "-n")) {
-		nonl = ~nonl;
-		if (!*++argv)
-			goto end;
-	}
+	int nonl;
+
+	nonl = *++argv ? equal(*argv, "-n") : 0;
+	argv += nonl;
 
 	do {
 		int c;
 
-		nonl += print_escape_str("%s", NULL, NULL, *argv);
+		if (likely(*argv))
+			nonl += print_escape_str("%s", NULL, NULL, *argv++);
 		if (nonl > 0)
 			break;
 
-		c = ' ';
-		if (!*++argv) {
-end:
-			if (nonl) {
-				break;
-			}
-			c = '\n';
-		}
-		outc(c, outs);
+		c = *argv ? ' ' : '\n';
+		out1c(c);
 	} while (*argv);
 	return 0;
 }