1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162 |
- /* echo.c - echo supporting -n and -e.
- *
- * Copyright 2007 Rob Landley <rob@landley.net>
- *
- * 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');
- }
|