/* vi: set sw=4 ts=4: * * echo.c - echo supporting -n and -e. * * Copyright 2007 Rob Landley * * See http://www.opengroup.org/onlinepubs/009695399/utilities/echo.html USE_ECHO(NEWTOY(echo, "^?en", TOYFLAG_BIN)) config ECHO bool "echo" default y help usage: echo [-ne] [args...] Write each argument to stdout, with one space between each, followed by a newline. -n No trailing newline. -e Process the following escape sequences: \\ backslash \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 */ #include "toys.h" void echo_main(void) { int i = 0; char *arg, *from = "\\abfnrtv", *to = "\\\a\b\f\n\r\t\v"; for (;;) { arg = toys.optargs[i]; if (!arg) break; if (i++) xputc(' '); // Handle -e if (toys.optflags&2) { int c, j = 0; for (;;) { c = arg[j++]; if (!c) break; if (c == '\\') { char *found; int d = arg[j++]; // handle \escapes if (d) { found = strchr(from, d); if (found) c = to[found-from]; else if (d == 'c') goto done; else if (d == '0') { c = 0; while (arg[j]>='0' && arg[j]<='7') c = (c*8)+arg[j++]-'0'; } } } xputc(c); } } else xprintf("%s", arg); } // Output "\n" if no -n if (!(toys.optflags&1)) xputc('\n'); done: xflush(); }