#include #include #include #include #include "util/versie.h" #include "io/read_file.h" static void usage(FILE *f) { fprintf(f, "Gebruik: kat [-hV] \n" "\n" "Schakel bestanden aaneen naar standaard uitvoer.\n" "\n" " -h Toon deze hulptekst\n" " -V Toon versienummer\n"); } // Returns pointer to argument array containing the file names static char** parse_options(int argc, char **argv) { int opt; while ((opt = getopt(argc, argv, "hV")) != -1) { switch (opt) { case 'h': usage(stdout); exit(0); case 'V': drukkedoos_print_versie(stdout); exit(0); case '?': fprintf(stderr, "kat: Ongeldige optie: -%c\n", optopt); usage(stderr); exit(1); } } return argv + optind; } 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) { 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; }