diff options
Diffstat (limited to 'coreutils')
-rw-r--r-- | coreutils/echo.c | 96 |
1 files changed, 67 insertions, 29 deletions
diff --git a/coreutils/echo.c b/coreutils/echo.c index 8d25be7a5..a6b5152d8 100644 --- a/coreutils/echo.c +++ b/coreutils/echo.c @@ -28,47 +28,86 @@ extern int echo_main(int argc, char** argv) { - register char **ap; - char *p; - int c; int nflag = 0; int eflag = 0; + /* Skip argv[0]. */ + argc--; + argv++; - while ((c = getopt(argc, argv, "neE")) != EOF) { - switch (c) { - case 'n': - nflag = 1; - break; - case 'e': - eflag = 1; - break; - case 'E': - eflag = 0; - break; - default: - usage(echo_usage); + while (argc > 0 && *argv[0] == '-') + { + register char *temp; + register int index; + + /* + * If it appears that we are handling options, then make sure + * that all of the options specified are actually valid. + * Otherwise, the string should just be echoed. + */ + temp = argv[0] + 1; + + for (index = 0; temp[index]; index++) + { + if (strrchr("neE", temp[index]) == 0) + goto just_echo; + } + + if (!*temp) + goto just_echo; + + /* + * All of the options in temp are valid options to echo. + * Handle them. + */ + while (*temp) + { + if (*temp == 'n') + nflag = 1; + else if (*temp == 'e') + eflag = 1; + else if (*temp == 'E') + eflag = 0; + else + goto just_echo; + + temp++; } + argc--; + argv++; } - ap = &argv[optind]; - while ((p = *ap++) != NULL) { - while ((c = *p++) != '\0') { - if (c == '\\' && eflag) { - if (*p == 'c') - exit(0); - else - c = process_escape_sequence(&p); +just_echo: + while (argc > 0) { + char *arg = argv[0]; + register int c; + + while ((c = *arg++)) { + + /* Check for escape sequence. */ + if (c == '\\' && eflag && *arg) { + if (*arg == 'c') { + /* '\c' means cancel newline. */ + nflag = 1; + arg++; + continue; + } else { + c = process_escape_sequence(&arg); + } } + putchar(c); } - if (*ap) + argc--; + argv++; + if (argc > 0) putchar(' '); } - if (! nflag) + if (!nflag) putchar('\n'); fflush(stdout); - return( 0); + + return 0; } /*- @@ -90,6 +129,7 @@ echo_main(int argc, char** argv) * 3. <BSD Advertising Clause omitted per the July 22, 1999 licensing change * ftp://ftp.cs.berkeley.edu/pub/4bsd/README.Impt.License.Change> * + * California, Berkeley and its contributors. * 4. Neither the name of the University nor the names of its contributors * may be used to endorse or promote products derived from this software * without specific prior written permission. @@ -108,5 +148,3 @@ echo_main(int argc, char** argv) * * @(#)echo.c 8.1 (Berkeley) 5/31/93 */ - - |