#include "command.h" #include "lslib.h" #include 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; }