summaryrefslogtreecommitdiff
path: root/src/kat.c
diff options
context:
space:
mode:
authorTom Smeding <tom@tomsmeding.com>2024-07-14 09:48:55 +0200
committerTom Smeding <tom@tomsmeding.com>2024-07-14 09:48:55 +0200
commit723828d1d473b70f77fa7878f855c2956ddcacc4 (patch)
tree5fc0e1b7b9e73679732a528d321ab9411b26ccd5 /src/kat.c
parent7700192c257bff62a324cd9b12237d17f1238e59 (diff)
Gebruik option parsing in kat en tak
Diffstat (limited to 'src/kat.c')
-rw-r--r--src/kat.c75
1 files changed, 54 insertions, 21 deletions
diff --git a/src/kat.c b/src/kat.c
index 7efa7e1..399e466 100644
--- a/src/kat.c
+++ b/src/kat.c
@@ -1,35 +1,68 @@
-#include <fcntl.h>
-#include <stdio.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
-#include <sys/mman.h>
-#include <sys/stat.h>
#include <unistd.h>
#include "util/map.h"
+#include "util/versie.h"
-int entry_kat(int argc, char **argv) {
- if (argc == 2 && strcmp(argv[1], "-h") == 0) {
- fprintf(stderr, "Gebruik: kat [BESTAND]...\n"
- "\n"
- "Schakel BESTAND(en) aaneen naar standaard uitvoer.\n");
- return 0;
- }
+static void usage(FILE *f) {
+ fprintf(f,
+ "Gebruik: kat [-hV] <bestand...>\n"
+ "\n"
+ "Schakel bestanden aaneen naar standaard uitvoer.\n"
+ "\n"
+ " -h Toon deze hulptekst\n"
+ " -V Toon versienummer\n");
+}
- for (int i = 1; i < argc; i++) {
- const char *fname = argv[i];
- struct map *map = open_map(fname);
- if (map == NULL) {
- return 1;
+// 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, "kat");
+ exit(0);
+
+ case '?':
+ usage(stderr);
+ exit(1);
}
+ }
+
+ return argv + optind;
+}
+
+static void process(const char *fname) {
+ struct map *map = open_map(fname);
+ if (map == NULL) {
+ exit(1);
+ }
- if (map->sb.st_size >= 0) {
- for (size_t i = 0; i < (size_t)map->sb.st_size; i++) {
- putchar(map->addr[i]);
- }
+ if (map->sb.st_size >= 0) {
+ for (size_t i = 0; i < (size_t)map->sb.st_size; i++) {
+ putchar(map->addr[i]);
}
+ }
- close_map(map);
+ close_map(map);
+}
+
+int entry_kat(int argc, char **argv) {
+ char **args = parse_options(argc, argv);
+ if (*args == NULL) {
+ fprintf(stderr, "kat: Standaard invoer niet ondersteund in deze projectie-gebaseerde implementatie\n");
+ return 1;
+ } else {
+ while (*args != NULL) {
+ process(*args);
+ args++;
+ }
}
return 0;