diff options
Diffstat (limited to 'command/echo.c')
-rw-r--r-- | command/echo.c | 107 |
1 files changed, 107 insertions, 0 deletions
diff --git a/command/echo.c b/command/echo.c new file mode 100644 index 0000000..a0ab78d --- /dev/null +++ b/command/echo.c @@ -0,0 +1,107 @@ +#include "command.h" +#include "lslib.h" + +#include <stdlib.h> + +static struct { + bool escape_codes; + bool newline; +} flags; + +static void print_with_escape_codes(const char* str) { + + size_t index = 0; + char n; + + while (true) { + char c = str[index]; + index++; + + if (c == '\0') break; + if (c != '\\') { + putchar(c); + continue; + } + + n = str[index]; + index++; + + switch (n) { + case '\\': + putchar('\\'); + break; + case 'b': + putchar('\b'); + break; + case 'c': + exit(EXIT_SUCCESS); + case 'n': + putchar('\n'); + break; + case 'r': + putchar('\r'); + break; + case 't': + putchar('\t'); + break; + case 'v': + putchar('\v'); + break; + default: + putchar(c); + putchar(n); + } + } +} + +static int short_arg(char c, char* next) { + UNUSED(next); + switch (c) { + case 'e': + flags.escape_codes = true; + break; + case 'E': + flags.escape_codes = false; + break; + case 'n': + flags.newline = false; + break; + default: + flags.newline = true; + flags.escape_codes = false; + return ARG_IGNORE; + }; + return ARG_UNUSED; +} + +COMMAND(echo) { + + int start, i; + + if (argc < 1) { + return EXIT_SUCCESS; + } + + flags.escape_codes = false; + flags.newline = true; + + start = parse_args(argc, argv, NULL, short_arg, NULL); + + for (i = start; i < argc; i++) { + if (flags.escape_codes) { + print_with_escape_codes(argv[i]); + } else { + printf("%s", argv[i]); + } + + if (i + 1 != argc) { + putchar(' '); + } + } + + if (flags.newline) { + putchar('\n'); + } + + return EXIT_SUCCESS; +} |