diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/kat.c | 63 |
1 files changed, 42 insertions, 21 deletions
@@ -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; } |