diff options
author | Denis Vlasenko <vda.linux@googlemail.com> | 2007-04-10 20:34:00 +0400 |
---|---|---|
committer | Denis Vlasenko <vda.linux@googlemail.com> | 2007-04-10 20:34:00 +0400 |
commit | a9d7d24e1f524bb7528aa881265fe8f826023751 (patch) | |
tree | 4bc59ebc7d362ce5d9f4f733e7ba633be8534f72 /coreutils/echo.c | |
parent | 99912ca733dd960f5589227fd999c86e73c8e894 (diff) |
echo: fix regression ("echo" with no arguments didn't print newline.
echo: use fputs if no options are given. Code growth ~15 bytes.
Old:
# time ./busybox find $bigdir -exec echo {} \; >/dev/null
real 0m2.038s
user 0m0.761s
sys 0m0.953s
New:
# time ./busybox find $bigdir -exec echo {} \; >/dev/null
real 0m1.781s
user 0m0.781s
sys 0m0.939s
For comparison: without NOFORK:
# time find $bigdir -exec echo {} \; >/dev/null
real 1m51.129s
user 0m38.442s
sys 1m3.350s
Diffstat (limited to 'coreutils/echo.c')
-rw-r--r-- | coreutils/echo.c | 19 |
1 files changed, 11 insertions, 8 deletions
diff --git a/coreutils/echo.c b/coreutils/echo.c index 486245508..2ee5002ba 100644 --- a/coreutils/echo.c +++ b/coreutils/echo.c @@ -29,7 +29,10 @@ int bb_echo(char **argv) { const char *arg; #if !ENABLE_FEATURE_FANCY_ECHO -#define eflag '\\' + enum { + eflag = '\\', + nflag = 1, /* 1 -- print '\n' */ + }; ++argv; #else const char *p; @@ -39,7 +42,7 @@ int bb_echo(char **argv) while (1) { arg = *++argv; if (!arg) - goto ret; + goto newline_ret; if (*arg != '-') break; @@ -68,10 +71,13 @@ int bb_echo(char **argv) just_echo: #endif while (1) { - /* arg is already = *argv and isn't NULL */ + /* arg is already == *argv and isn't NULL */ int c; - while ((c = *arg++)) { + if (!eflag) { + /* optimization for very common case */ + fputs(arg, stdout); + } else while ((c = *arg++)) { if (c == eflag) { /* Check for escape seq. */ if (*arg == 'c') { /* '\c' means cancel newline and @@ -101,13 +107,10 @@ int bb_echo(char **argv) putchar(' '); } -#ifdef CONFIG_FEATURE_FANCY_ECHO + newline_ret: if (nflag) { putchar('\n'); } -#else - putchar('\n'); -#endif ret: return fflush(stdout); } |