diff options
Diffstat (limited to 'src/commands/cat.c')
-rw-r--r-- | src/commands/cat.c | 94 |
1 files changed, 38 insertions, 56 deletions
diff --git a/src/commands/cat.c b/src/commands/cat.c index bb050c0..6ed77e8 100644 --- a/src/commands/cat.c +++ b/src/commands/cat.c @@ -2,13 +2,13 @@ #include <ctype.h> -struct Flags { +static struct { bool number_lines; bool number_non_empty; bool change_non_print; bool change_tabs; bool end_lines_dollar; -}; +} flags; static bool printable(char c) { switch (c) { @@ -20,7 +20,7 @@ static bool printable(char c) { } } -static void help() { +static void help(void) { printf("Usage: cat [-nbvteA] [FILE]...\n\n"); printf("Print FILEs to stdout\n\n"); printf("\t-n Number output lines\n"); @@ -29,10 +29,9 @@ static void help() { printf("\t-t ...and tabs as ^I\n"); printf("\t-e ...and end lines with $\n"); printf("\t-A Same as -vte\n"); - exit(EXIT_SUCCESS); } -static void cat_file(FILE* file, struct Flags flags) { +static void cat_file(FILE* file) { char c; size_t read; @@ -78,74 +77,57 @@ static void cat_file(FILE* file, struct Flags flags) { } } +static int short_arg(char c, char* next) { + UNUSED(next); + switch (c) { + case 'n': + flags.number_lines = true; + break; + case 'b': + flags.number_non_empty = true; + break; + case 'v': + flags.change_non_print = true; + break; + case 't': + flags.change_non_print = true; + flags.change_tabs = true; + break; + case 'e': + flags.change_non_print = true; + flags.end_lines_dollar = true; + break; + case 'A': + flags.change_non_print = true; + flags.change_tabs = true; + flags.end_lines_dollar = true; + break; + default: + error("error: unkown flag -%c", c); + } + return ARG_UNUSED; +} + COMMAND(cat) { - struct Flags flags; flags.number_lines = false; flags.number_non_empty = false; flags.change_non_print = false; flags.change_tabs = false; flags.end_lines_dollar = false; - int start = 0; - - for (int i = 0; i < argc; i++) { - if (!prefix("-", argv[i])) { - continue; - } - - if (streql("-", argv[i])) { - break; - } - - if (streql("--help", argv[i])) { - help(); - } - - start++; - - size_t len = strlen(argv[i]); - for (size_t j = 1; j < len; j++) { - char c = argv[i][j]; - switch (c) { - case 'n': - flags.number_lines = true; - break; - case 'b': - flags.number_non_empty = true; - break; - case 'v': - flags.change_non_print = true; - break; - case 't': - flags.change_non_print = true; - flags.change_tabs = true; - break; - case 'e': - flags.change_non_print = true; - flags.end_lines_dollar = true; - break; - case 'A': - flags.change_non_print = true; - flags.change_tabs = true; - flags.end_lines_dollar = true; - break; - default: - error("error: unkown flag -%c", c); - } - } - } + int start = parse_args(argc, argv, help, short_arg, NULL); int arg_len = argc - start; if (arg_len < 1) { - cat_file(stdin, flags); + cat_file(stdin); return EXIT_SUCCESS; } for (int i = start; i < argc; i++) { FILE* in = get_file(argv[i], "r"); - cat_file(in, flags); + cat_file(in); if (in != stdin) fclose(in); } |