#include #include #include #include #include #include "util/versie.h" #include "util/error.h" #include "util/debug.h" #include "util/map.h" static void usage(FILE *f) { fprintf(f, "Gebruik: hoofd [-nchV] [BESTAND]...\n" "\n" "Toon de eerste 10 regels van elk BESTAND naar standaard uitvoer\n" "\n" " -n AANTAL Aantal regels om weer te geven\n" " -c AANTAL Aantal karakters om weer te geven\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 *n, int *c) { int opt; while ((opt = getopt(argc, argv, "n:c:hV")) != -1) { switch (opt) { case 'c': *c = atoi(optarg); *n = -1; break; case 'n': *c = -1; *n = atoi(optarg); break; case 'h': usage(stdout); exit(0); case 'V': drukkedoos_print_versie(stdout, "hoofd"); exit(0); case '?': fprintf(stderr, "hoofd: Ongeldige optie: -%c\n", optopt); usage(stderr); exit(1); } } return argv + optind; } int entry_hoofd(int argc, char **argv) { int n = 10; int c = -1; char **args = parse_options(argc, argv, &n, &c); while (*args != NULL) { bool isdir; struct map *map = open_map(*args, &isdir); if (isdir) { fprintf(stderr, "hoofd: %s: is een mapje\n", *args); goto next; } else if (map == NULL) { fprintf(stderr, "hoofd: fout bij lezen bestand"); return 1; } size_t i; for (i = 0; i < (size_t)map->sb.st_size && (n > 0 || n == -1) && (c > 0 || c == -1); i++) { if (map->addr[i] == '\n') { if (n != -1) n--; } if (c != -1) c--; } fwrite(map->addr, 1, i, stdout); next: args++; } return 0; }