From 3895150d7636f906fa261df5c439e10851a3b54c Mon Sep 17 00:00:00 2001 From: bpc2003 Date: Fri, 7 Mar 2025 16:44:29 -0500 Subject: Added hashmaps, now need to add lists --- src/keytab.c | 89 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 89 insertions(+) (limited to 'src/keytab.c') diff --git a/src/keytab.c b/src/keytab.c index e69de29..8d929dc 100644 --- a/src/keytab.c +++ b/src/keytab.c @@ -0,0 +1,89 @@ +#include +#include +#include +#include + +#include "include/keytab.h" + +static int hash(char *key); + +int *getkeys(struct keytab *tab) +{ + int len = 2; + int *indexes = calloc(len, sizeof(int)); + for (int i = 0, j = 0; i < TABLEN; ++i) { + if (j >= len) { + indexes = realloc(indexes, ++len * sizeof(int)); + indexes[len - 1] = 0; + } + if (tab[i].key) + indexes[j++] = i; + } + return indexes; +} + +struct keytab getkey(struct keytab *tab, char *key) +{ + int idx = hash(key); + if (tab[idx].key == NULL) + return (struct keytab) { .key = NULL, .v = 0 }; + + while (strcmp(tab[idx].key, key) && idx < TABLEN) + idx++; + if (idx >= TABLEN) + return (struct keytab) { .key = NULL, .v = 0 }; + return tab[idx]; +} + +void setkey(struct keytab *tab, char *pair) +{ + char *tmp = calloc(strlen(pair) + 1, sizeof(char)); + strcpy(tmp, pair); + char *tok = strtok(pair, ":"); + if (!strcmp(tmp, tok)) { + fprintf(stderr, "Invalid key-value pair: %s\n", tmp); + free(tmp); + return; + } + free(tmp); + + char *key = calloc(strlen(tok) + 1, sizeof(char)); + strcpy(key, tok); + + tok = strtok(NULL, ":"); + union value v; + int flag; + if (isdigit(*tok)) { + flag = 1; + v.num = atof(tok); + } else if (!strcmp(tok, "true") || !strcmp(tok, "false")) { + flag = 2; + v.b = !strcmp(tok, "true"); + } else { + flag = 3; + v.str = calloc(strlen(tok) + 1, sizeof(char)); + strcpy(v.str, tok); + } + + int idx = hash(key); + while (tab[idx].key != NULL && strcmp(tab[idx].key, key) && idx < TABLEN) + idx++; + if (idx >= TABLEN) { + fprintf(stderr, "No more room in table\n"); + return; + } + if (!tab[idx].key) + tab[idx].key = key; + else + free(key); + tab[idx].v = v; + tab[idx].flag = flag; +} + +int hash(char *key) +{ + unsigned long h = 5381; + for (int i = 0; i < strlen(key); ++i) + h = ((h << 5) + h) + key[i]; + return h % TABLEN; +} -- cgit v1.2.3