| Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 1 | /* vi: set sw=4 ts=4: |
| 2 | * |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 3 | * echo.c - echo supporting -n and -e. |
| Rob Landley | fece5cb | 2007-12-03 20:05:57 -0600 | [diff] [blame] | 4 | * |
| Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 5 | * Copyright 2007 Rob Landley <rob@landley.net> |
| 6 | * |
| Rob Landley | 5c67e35 | 2007-12-11 15:41:31 -0600 | [diff] [blame] | 7 | * See http://www.opengroup.org/onlinepubs/009695399/utilities/echo.html |
| Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 8 | |
| Rob Landley | b1487dc | 2008-06-26 22:48:43 -0500 | [diff] [blame] | 9 | USE_ECHO(NEWTOY(echo, "^?en", TOYFLAG_BIN)) |
| Rob Landley | 55928b1 | 2008-01-19 17:43:27 -0600 | [diff] [blame] | 10 | |
| Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 11 | config ECHO |
| 12 | bool "echo" |
| 13 | default y |
| 14 | help |
| 15 | usage: echo [-ne] [args...] |
| 16 | |
| 17 | Write each argument to stdout, with one space between each, followed |
| 18 | by a newline. |
| 19 | |
| 20 | -n No trailing newline. |
| Rob Landley | 1a221d9 | 2008-05-17 17:13:26 -0500 | [diff] [blame] | 21 | -e Process the following escape sequences: |
| 22 | \\ backslash |
| 23 | \a alert (beep/flash) |
| 24 | \b backspace |
| 25 | \c Stop output here (avoids trailing newline) |
| 26 | \f form feed |
| 27 | \n newline |
| 28 | \r carriage return |
| 29 | \t horizontal tab |
| 30 | \v vertical tab |
| Rob Landley | 2896480 | 2008-01-19 17:08:39 -0600 | [diff] [blame] | 31 | */ |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 32 | |
| 33 | #include "toys.h" |
| 34 | |
| Rob Landley | efda21c | 2007-11-29 18:14:37 -0600 | [diff] [blame] | 35 | void echo_main(void) |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 36 | { |
| 37 | int i = 0; |
| 38 | char *arg, *from = "\\abfnrtv", *to = "\\\a\b\f\n\r\t\v"; |
| Rob Landley | 2c22685 | 2007-11-15 18:30:30 -0600 | [diff] [blame] | 39 | |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 40 | for (;;) { |
| 41 | arg = toys.optargs[i]; |
| 42 | if (!arg) break; |
| 43 | if (i++) xputc(' '); |
| Rob Landley | 452ff9e | 2007-01-20 22:41:29 -0500 | [diff] [blame] | 44 | |
| 45 | // Handle -e |
| Rob Landley | 2c22685 | 2007-11-15 18:30:30 -0600 | [diff] [blame] | 46 | |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 47 | if (toys.optflags&2) { |
| 48 | int c, j = 0; |
| 49 | for (;;) { |
| 50 | c = arg[j++]; |
| 51 | if (!c) break; |
| 52 | if (c == '\\') { |
| 53 | char *found; |
| 54 | int d = arg[j++]; |
| 55 | |
| Rob Landley | 452ff9e | 2007-01-20 22:41:29 -0500 | [diff] [blame] | 56 | // handle \escapes |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 57 | |
| 58 | if (d) { |
| 59 | found = strchr(from, d); |
| 60 | if (found) c = to[found-from]; |
| 61 | else if (d == 'c') goto done; |
| 62 | else if (d == '0') { |
| 63 | c = 0; |
| 64 | while (arg[j]>='0' && arg[j]<='7') |
| 65 | c = (c*8)+arg[j++]-'0'; |
| 66 | } |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 67 | } |
| 68 | } |
| 69 | xputc(c); |
| 70 | } |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 71 | } else xprintf("%s", arg); |
| 72 | } |
| Rob Landley | 452ff9e | 2007-01-20 22:41:29 -0500 | [diff] [blame] | 73 | |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 74 | // Output "\n" if no -n |
| 75 | if (!(toys.optflags&1)) xputc('\n'); |
| 76 | done: |
| 77 | xflush(); |
| Rob Landley | 3ec53ce | 2007-01-20 21:32:47 -0500 | [diff] [blame] | 78 | } |