#include #include #include #include #include "util/versie.h" static void usage(FILE *f) { fprintf(f, "Gebruik: omd [-hV] \n" "\n" "Draai alle regels om\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, "omd: Ongeldige optie: -%c\n", optopt); usage(stderr); exit(1); } } return argv + optind; } static void reverse_in_place(char *buf, size_t len) { // TODO: kijk of dit sneller kan met SIMD for (size_t i = 0, j = len - 1; i < len / 2; i++, j--) { char c = buf[i]; buf[i] = buf[j]; buf[j] = c; } } static void process(const char *fname, FILE *f) { char *line = NULL; size_t linen = 0; ssize_t nread = 0; while ((errno = 0, nread = getline(&line, &linen, f)) != -1) { if (line[nread - 1] == '\n') nread--; reverse_in_place(line, nread); printf("%s", line); } free(line); if (errno != 0) { printf("omd: fout bij lezen uit bestand '%s'\n", fname); exit(1); } } int entry_omd(int argc, char **argv) { char **args = parse_options(argc, argv); if (*args == NULL) { process(NULL, stdin); } else { while (*args != NULL) { FILE *f = fopen(*args, "r"); if (!f) { fprintf(stderr, "omd: Kon bestand '%s' niet openen\n", *args); return 1; } process(*args, f); fclose(f); args++; } } return 0; }