blob: 9b7b9222f5bcbfb0ace8713c3fd3018cefa48d46 [file] [log] [blame]
/* 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, with 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 values (1 to 3 digits)
\a Alert (beep/flash)
\b Backspace
\c Stop output here (avoids trailing newline)
\f Form feed
\n Newline
\r Carriage return
\t Horizontal tab
\v Vertical tab
\xHH Hexadecimal values (1 to 2 digits)
*/
#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');
}