#include #include #include #include #include #include #include "util/versie.h" static void usage(FILE *f) { fprintf(f, "Gebruik: rn [-hV] [BESTAND]...\n" "\n" "Nummereer elke regel van elk BESTAND.\n" "Als geen bestanden gegeven zijn, of het bestand is -, nummereer dan standaard invoer.\n" "\n" " -p Regelnummers per BESTAND.\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, bool *perFile) { int opt; while ((opt = getopt(argc, argv, "phV")) != -1) { switch (opt) { case 'p': *perFile = true; break; case 'h': usage(stdout); exit(0); case 'V': drukkedoos_print_versie(stdout); exit(0); case '?': usage(stderr); exit(1); } } return argv + optind; } static void process(const char *fname, FILE *file, bool perFile, size_t *n) { if (perFile) *n = 1; char *line = NULL; size_t linen = 0; ssize_t nread = 0; while ((errno = 0, nread = getline(&line, &linen, file)) != -1) { printf("%6lu %s", *n, line); *n += 1; } free(line); if (errno != 0) { printf("tak: fout bij lezen uit bestand '%s'\n", fname); exit(1); } } int entry_rn(int argc, char **argv) { bool perFile = false; char **args = parse_options(argc, argv, &perFile); size_t n = 1; if (*args == NULL) { process("stdin", stdin, perFile, &n); return 0; } while (*args != NULL) { if (!strcmp(*args, "-")) { process("stdin", stdin, perFile, &n); } else { FILE *file = fopen(*args, "r"); if (file == NULL) { fprintf(stderr, "rn: %s: kon bestand niet openen\n", *args); return 1; } process(*args, file, perFile, &n); fclose(file); } args++; } return 0; }