diff options
Diffstat (limited to 'src/commands/echo.c')
-rw-r--r-- | src/commands/echo.c | 60 |
1 files changed, 30 insertions, 30 deletions
diff --git a/src/commands/echo.c b/src/commands/echo.c index a13947c..8b39531 100644 --- a/src/commands/echo.c +++ b/src/commands/echo.c @@ -1,5 +1,10 @@ #include "../command.h" +static struct { + bool escape_codes; + bool newline; +} flags; + static void print_with_escape_codes(const char* str) { size_t index = 0; @@ -44,44 +49,39 @@ static void print_with_escape_codes(const char* str) { } } +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) { if (argc < 1) { return EXIT_SUCCESS; } - bool escape_codes = false; - bool newline = true; - - int start = 0; + flags.escape_codes = false; + flags.newline = true; - if (prefix("-", argv[0])) { - - start = 1; - - for (size_t i = 0; i < strlen(argv[0] + 1); i++) { - char c = argv[0][i + 1]; - switch (c) { - case 'e': - escape_codes = true; - break; - case 'E': - escape_codes = false; - break; - case 'n': - newline = false; - break; - default: - escape_codes = false; - newline = true; - start = 0; - break; - } - } - } + int start = parse_args(argc, argv, NULL, short_arg, NULL); for (int i = start; i < argc; i++) { - if (escape_codes) { + if (flags.escape_codes) { print_with_escape_codes(argv[i]); } else { printf("%s", argv[i]); @@ -92,7 +92,7 @@ COMMAND(echo) { } } - if (newline) { + if (flags.newline) { putchar('\n'); } |