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