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
This commit is contained in:
parent
99912ca733
commit
a9d7d24e1f
@ -29,7 +29,10 @@ int bb_echo(char **argv)
|
|||||||
{
|
{
|
||||||
const char *arg;
|
const char *arg;
|
||||||
#if !ENABLE_FEATURE_FANCY_ECHO
|
#if !ENABLE_FEATURE_FANCY_ECHO
|
||||||
#define eflag '\\'
|
enum {
|
||||||
|
eflag = '\\',
|
||||||
|
nflag = 1, /* 1 -- print '\n' */
|
||||||
|
};
|
||||||
++argv;
|
++argv;
|
||||||
#else
|
#else
|
||||||
const char *p;
|
const char *p;
|
||||||
@ -39,7 +42,7 @@ int bb_echo(char **argv)
|
|||||||
while (1) {
|
while (1) {
|
||||||
arg = *++argv;
|
arg = *++argv;
|
||||||
if (!arg)
|
if (!arg)
|
||||||
goto ret;
|
goto newline_ret;
|
||||||
if (*arg != '-')
|
if (*arg != '-')
|
||||||
break;
|
break;
|
||||||
|
|
||||||
@ -68,10 +71,13 @@ int bb_echo(char **argv)
|
|||||||
just_echo:
|
just_echo:
|
||||||
#endif
|
#endif
|
||||||
while (1) {
|
while (1) {
|
||||||
/* arg is already = *argv and isn't NULL */
|
/* arg is already == *argv and isn't NULL */
|
||||||
int c;
|
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 (c == eflag) { /* Check for escape seq. */
|
||||||
if (*arg == 'c') {
|
if (*arg == 'c') {
|
||||||
/* '\c' means cancel newline and
|
/* '\c' means cancel newline and
|
||||||
@ -101,13 +107,10 @@ int bb_echo(char **argv)
|
|||||||
putchar(' ');
|
putchar(' ');
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef CONFIG_FEATURE_FANCY_ECHO
|
newline_ret:
|
||||||
if (nflag) {
|
if (nflag) {
|
||||||
putchar('\n');
|
putchar('\n');
|
||||||
}
|
}
|
||||||
#else
|
|
||||||
putchar('\n');
|
|
||||||
#endif
|
|
||||||
ret:
|
ret:
|
||||||
return fflush(stdout);
|
return fflush(stdout);
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user