Currently echocmd uses print_escape_str to do everything apart
from printing the spaces/newlines separating its arguments.  This
patch moves the actual printing into print_escape_str as well
using the format parameter.

Signed-off-by: Herbert Xu <herb...@gondor.apana.org.au>

diff --git a/src/bltin/printf.c b/src/bltin/printf.c
index eaf14b6..7785735 100644
--- a/src/bltin/printf.c
+++ b/src/bltin/printf.c
@@ -103,6 +103,8 @@ static int print_escape_str(const char *f, int *param, int 
*array, char *s)
        len = q - p;
        total = len - 1;
 
+       q[-1] = (!!((f[1] - 's') | done) - 1) & f[2];
+       total += !!q[-1];
        if (f[1] == 's')
                goto easy;
 
@@ -455,21 +457,22 @@ check_conversion(const char *s, const char *ep)
 int
 echocmd(int argc, char **argv)
 {
+       const char *lastfmt = snlfmt;
        int nonl;
 
-       nonl = *++argv ? equal(*argv, "-n") : 0;
-       argv += nonl;
+       if (*++argv && equal(*argv, "-n")) {
+               argv++;
+               lastfmt = "%s";
+       }
 
        do {
-               int c;
+               const char *fmt = "%s ";
+               char *s = *argv;
 
-               if (likely(*argv))
-                       nonl += print_escape_str("%s", NULL, NULL, *argv++);
-               if (likely((nonl + !*argv) > 1))
-                       break;
+               if (!s || !*++argv)
+                       fmt = lastfmt;
 
-               c = *argv ? ' ' : '\n';
-               out1c(c);
-       } while (*argv);
+               nonl = print_escape_str(fmt, NULL, NULL, s ?: nullstr);
+       } while (!nonl && *argv);
        return 0;
 }
-- 
Email: Herbert Xu <herb...@gondor.apana.org.au>
Home Page: http://gondor.apana.org.au/~herbert/
PGP Key: http://gondor.apana.org.au/~herbert/pubkey.txt
--
To unsubscribe from this list: send the line "unsubscribe dash" in
the body of a message to majord...@vger.kernel.org
More majordomo info at  http://vger.kernel.org/majordomo-info.html

Reply via email to