summaryrefslogtreecommitdiff
path: root/src/commands/echo.c
diff options
context:
space:
mode:
Diffstat (limited to 'src/commands/echo.c')
-rw-r--r--src/commands/echo.c60
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');
}