/* echo.c - echo supporting -n and -e. * * Copyright 2007 Rob Landley * * See http://opengroup.org/onlinepubs/9699919799/utilities/echo.html * * Deviations from posix: we parse command line options, as Linux has * consistently done since 1992. Posix defaults -e to on, we require -e. * We also honor -- to _stop_ option parsing (bash doesn't, we go with * consistency over compatibility here). USE_ECHO(NEWTOY(echo, "^?Een[-eE]", TOYFLAG_BIN|TOYFLAG_MAYFORK|TOYFLAG_LINEBUF)) config ECHO bool "echo" default y help usage: echo [-neE] [ARG...] Write each argument to stdout, one space between each, followed by a newline. -n No trailing newline -E Print escape sequences literally (default) -e Process the following escape sequences: \\ Backslash \0NNN Octal (1-3 digit) \xHH Hex (1-2 digit) \a Alert (beep/flash) \b Backspace \c Stop here (no \n) \f Form feed \n Newline \r Carriage return \t Horizontal tab \v Vertical tab */ #define FOR_echo #include "toys.h" void echo_main(void) { int i = 0; char *arg, *c, out[8]; while ((arg = toys.optargs[i])) { if (i++) putchar(' '); // Should we output arg verbatim? if (!FLAG(e)) { xprintf("%s", arg); continue; } // Handle -e for (c = arg; *c; ) { unsigned u; if (*c == '\\' && c[1] == 'c') return; if ((u = unescape2(&c, 1))<128) putchar(u); else printf("%.*s", (int)wcrtomb(out, u, 0), out); } } // Output "\n" if no -n if (!FLAG(n)) putchar('\n'); }