#include #include #include #include #include #include "util/versie.h" #include "io/read_file.h" #include "util/loop_files.h" static void usage(FILE *f) { fprintf(f, "Gebruik: tak [-hV] \n" "\n" "Schakel bestanden aaneen naar standaard uitvoer omgekeerd.\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, "tak: Ongeldige optie: -%c\n", optopt); usage(stderr); exit(1); } } return argv + optind; } static int process(struct filebuf *fb, char*, bool) { char *lstart, *lend; lend = &fb->buf[fb->sz - 1]; while (lend > fb->buf) { if (*lend == '\n') { lend--; } lstart = lend; while (*lstart != '\n' && lstart != fb->buf) { lstart--; } if (lstart != fb->buf) { lstart++; } fwrite(lstart, 1, lend - lstart + 2, stdout); lend = lstart-1; } free_filebuf(fb); return 0; } int entry_tak(int argc, char **argv) { char **args = parse_options(argc, argv); return loop_files(args, process); }