summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLieuwe Rooijakkers <lieuwerooijakkers@gmail.com>2024-08-02 23:03:49 +0200
committerLieuwe Rooijakkers <lieuwerooijakkers@gmail.com>2024-08-02 23:04:16 +0200
commit2763d17085af7f8fe4fd5f89154b9934e15707f3 (patch)
tree65505ecc99ab16fb3a61ddcb5a685c1a04f667f0
parentf6bc3ed808a79ecab79fa10078775270db187e0c (diff)
kat: use read_file.h
-rw-r--r--src/kat.c63
1 files changed, 42 insertions, 21 deletions
diff --git a/src/kat.c b/src/kat.c
index 6ca8d28..aa0249c 100644
--- a/src/kat.c
+++ b/src/kat.c
@@ -3,8 +3,8 @@
#include <string.h>
#include <unistd.h>
-#include "util/map.h"
#include "util/versie.h"
+#include "io/read_file.h"
static void usage(FILE *f) {
fprintf(f,
@@ -39,33 +39,54 @@ static char** parse_options(int argc, char **argv) {
return argv + optind;
}
-static void process(const char *fname) {
- bool isdir;
-
- struct map *map = open_map(fname, &isdir);
- if (isdir) {
- fprintf(stderr, "kat: %s: is een mapje\n", fname);
- return;
- } else if (map == NULL) {
- exit(1);
- }
-
- fwrite(map->addr, 1, map->sb.st_size, stdout);
-
- close_map(map);
+static void process(struct filebuf *fb) {
+ fwrite(fb->buf, 1, fb->sz, stdout);
+ free_filebuf(fb);
}
+// TODO: be smarter, kat doesn't have to read the whole file in memory (for
+// unmappable files)
+
int entry_kat(int argc, char **argv) {
char **args = parse_options(argc, argv);
+
if (*args == NULL) {
- fprintf(stderr, "kat: Standaard invoer niet ondersteund in deze projectie-gebaseerde implementatie\n");
- return 1;
- } else {
- while (*args != NULL) {
- process(*args);
- args++;
+ struct filebuf *fb = stream_to_filebuf(stdin, 0);
+ if (fb == NULL) goto err_stdin;
+
+ process(fb);
+ return 0;
+ }
+
+ while (*args != NULL) {
+ struct filebuf *fb = NULL;
+
+ if (!strcmp(*args, "-")) {
+ fb = stream_to_filebuf(stdin, 0);
+ if (fb == NULL) goto err_stdin;
+ } else {
+ bool isdir = false;
+ fb = file_to_filebuf(*args, 0, &isdir);
+ if (isdir) goto err_isdir;
+ else if (fb == NULL) goto err_file;
}
+
+ process(fb);
+
+ args++;
}
return 0;
+
+err_stdin:
+ fprintf(stderr, "kat: fout bij lezen van standaard invoer\n");
+ return 1;
+
+err_file:
+ fprintf(stderr, "kat: fout bij lezen van bestand\n");
+ return 1;
+
+err_isdir:
+ fprintf(stderr, "kat: bestand '%s' is een mapje\n", *args);
+ return 1;
}