summaryrefslogtreecommitdiff
path: root/src/commands/cat.c
diff options
context:
space:
mode:
authorTyler Murphy <tylerm@tylerm.dev>2023-05-06 00:39:44 -0400
committerTyler Murphy <tylerm@tylerm.dev>2023-05-06 00:39:44 -0400
commitd8f2c10b7108fff6b7e437291093a1cadc15ab9f (patch)
tree3fc50a19d6fbb9c94a8fe147cd2a6c4ba7f59b8d /src/commands/cat.c
parentansii c (diff)
downloadlazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.tar.gz
lazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.tar.bz2
lazysphere-d8f2c10b7108fff6b7e437291093a1cadc15ab9f.zip
refactor
Diffstat (limited to 'src/commands/cat.c')
-rw-r--r--src/commands/cat.c140
1 files changed, 0 insertions, 140 deletions
diff --git a/src/commands/cat.c b/src/commands/cat.c
deleted file mode 100644
index 0495fe3..0000000
--- a/src/commands/cat.c
+++ /dev/null
@@ -1,140 +0,0 @@
-#include "../command.h"
-
-#include <ctype.h>
-
-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) {
- case '\n': return true;
- case '\r': return true;
- case '\b': return true;
- case '\t': return true;
- default: return isprint(c) == 0;
- }
-}
-
-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");
- printf("\t-b Number nonempty lines\n");
- printf("\t-v Show nonprinting characters as ^x or M-x\n");
- printf("\t-t ...and tabs as ^I\n");
- printf("\t-e ...and end lines with $\n");
- printf("\t-A Same as -vte\n");
-}
-
-static void cat_file(FILE* file) {
- char c;
- size_t read;
-
- size_t line = 1;
- bool empty = true;
- bool newline = true;
-
- while ((read = fread(&c, 1, 1, file)) != 0) {
- if (c == '\n') {
- if (empty && flags.number_lines) {
- printf("\t%ld ", line);
- }
- if (flags.end_lines_dollar) {
- printf("$");
- }
- line++;
- newline = true;
- empty = true;
- goto print;
- } else {
- empty = false;
- }
-
- if (!newline) {
- goto print;
- }
-
- if (!empty && (flags.number_non_empty || flags.number_lines)) {
- printf("\t%ld ", line);
- newline = false;
- }
- print:
- if (!flags.change_non_print || printable(c)) {
- if (flags.change_tabs && c == '\t') {
- fwrite("^I", 1, 2, stdout);
- } else {
- fwrite(&c, 1, 1, stdout);
- }
- } else {
- c |= '@';
- fwrite(&c, 1, 1, stdout);
- }
- }
-}
-
-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:
- return ARG_INVALID;
- }
- return ARG_UNUSED;
-}
-
-COMMAND(cat) {
-
- int start;
- int arg_len;
- int i;
-
- flags.number_lines = false;
- flags.number_non_empty = false;
- flags.change_non_print = false;
- flags.change_tabs = false;
- flags.end_lines_dollar = false;
-
- start = parse_args(argc, argv, help, short_arg, NULL);
-
- arg_len = argc - start;
-
- if (arg_len < 1) {
- cat_file(stdin);
- return EXIT_SUCCESS;
- }
-
- for (i = start; i < argc; i++) {
- FILE* in = get_file(argv[i], "r");
- cat_file(in);
- if (in != stdin)
- fclose(in);
- }
-
- return EXIT_SUCCESS;
-}