echo: fix regression ("echo" with no arguments didn't print newline.
authorDenis Vlasenko <vda.linux@googlemail.com>
Tue, 10 Apr 2007 16:34:00 +0000 (16:34 -0000)
committerDenis Vlasenko <vda.linux@googlemail.com>
Tue, 10 Apr 2007 16:34:00 +0000 (16:34 -0000)
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

coreutils/echo.c

index 48624550813c101a4a6788970cb8becd1f75a97c..2ee5002ba7e04d1b04b8f1261f3d7ba969e03750 100644 (file)
@@ -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);
 }