diff --git a/07/solution.c b/07/solution.c index 24bda90..3265729 100644 --- a/07/solution.c +++ b/07/solution.c @@ -1,41 +1,20 @@ #include #include #include -#include #include #include #include -#include - -uint32_t fnv1a_32(const char *buf, size_t len) -{ - uint32_t h = 0x811c9dc5U; - for (; len > 0; len--) - h = 0x01000193U * (h ^ *buf++); - - return h; -} typedef struct entry { - uint32_t id; size_t size; size_t n_entries; size_t n_alloc; + size_t visit; struct entry **entries; struct entry *parent; } entry; -entry *findent(entry *e, const char *name, size_t nlen) { - uint32_t id = fnv1a_32(name, nlen); - for (size_t i = 0; i < e->n_entries; i++) { - if (e->entries[i]->id == id) - return e->entries[i]; - } - - return NULL; -} - -entry *addent(entry *parent, const char *name, size_t nlen) { +entry *addent(entry *parent) { if (parent->n_entries >= parent->n_alloc) { parent->n_alloc += 5; if (parent->n_entries) @@ -46,7 +25,6 @@ entry *addent(entry *parent, const char *name, size_t nlen) { parent->n_entries++; entry *e = parent->entries[parent->n_entries - 1] = calloc(1, sizeof(entry)); - e->id = fnv1a_32(name, nlen); e->parent = parent; return e; @@ -71,8 +49,7 @@ int main(int argc, char **argv) { while (l != in + s.st_size) { char *nl = strchr(l, '\n'); if (l[0] == 'd') { - l += 4; - addent(current, l, nl - l); + addent(current); } else if (l[0] == '$') { if (l[2] == 'c') { if (l[5] == '/') @@ -81,10 +58,8 @@ int main(int argc, char **argv) { if (current->parent != root) current->parent->size += current->size; current = current->parent; - } else { - l += 5; - current = findent(current, l, nl - l); - } + } else + current = current->entries[current->visit++]; } } else { size_t sz = 0;