From 5cb23bf245ef1461fa080c2d8aeee8972720f3e5 Mon Sep 17 00:00:00 2001 From: Mia Herkt Date: Wed, 7 Dec 2022 23:51:13 +0100 Subject: [PATCH] 07: C: Use mmap instead of fgets --- 07/solution.c | 26 ++++++++++++++++++++------ 1 file changed, 20 insertions(+), 6 deletions(-) diff --git a/07/solution.c b/07/solution.c index 5e0027a..534340a 100644 --- a/07/solution.c +++ b/07/solution.c @@ -2,6 +2,9 @@ #include #include #include +#include +#include +#include uint32_t fnv1a_32(const char *buf, size_t len) { @@ -22,7 +25,7 @@ typedef struct entry { } entry; entry *findent(entry *e, const char *name) { - uint32_t id = fnv1a_32(name, strlen(name)); + uint32_t id = fnv1a_32(name, strchr(name, '\n') - name); for (size_t i = 0; i < e->n_entries; i++) { if (e->entries[i]->id == id) return e->entries[i]; @@ -42,19 +45,29 @@ entry *addent(entry *parent, const char *name) { parent->n_entries++; entry *e = parent->entries[parent->n_entries - 1] = calloc(1, sizeof(entry)); - e->id = fnv1a_32(name, strlen(name)); + e->id = fnv1a_32(name, strchr(name, '\n') - name); e->parent = parent; return e; } int main(int argc, char **argv) { - char l[64]; + if (argc < 2) return 1; + entry *root = calloc(1, sizeof(entry)); entry *current = root; size_t S = 0, G = 0, required = 0; - while (fgets(l, 64, stdin)) { + struct stat s; + if (stat(argv[1], &s) == -1) return 1; + int fd = open(argv[1], O_RDONLY); + if (fd == -1) return 1; + + char *in = mmap(NULL, s.st_size, PROT_READ, MAP_SHARED, fd, 0); + if (in == MAP_FAILED) return 1; + char *l = in; + + while (l - in < s.st_size) { if (l[0] == '$') { if (l[2] == 'c') { if (l[5] == '/') @@ -73,11 +86,12 @@ int main(int argc, char **argv) { f->size += sz; f->size += sz; } + l = strchr(l, '\n') + 1; } current = root; - if (argc == 3) - required = strtoul(argv[2], NULL, 10) - (strtoul(argv[1], NULL, 10) - root->size); + if (argc == 4) + required = strtoul(argv[3], NULL, 10) - (strtoul(argv[2], NULL, 10) - root->size); else required = 30000000UL - (70000000UL - root->size); do {