From cd70ca266bb212d6a32d2dd808c7708bb7be6f1f Mon Sep 17 00:00:00 2001 From: Danny van Kooten Date: Thu, 12 Mar 2020 09:30:29 +0100 Subject: move files to src/ subdir --- src/hashmap.c | 74 +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 74 insertions(+) create mode 100644 src/hashmap.c (limited to 'src/hashmap.c') diff --git a/src/hashmap.c b/src/hashmap.c new file mode 100644 index 0000000..3d9edd0 --- /dev/null +++ b/src/hashmap.c @@ -0,0 +1,74 @@ +#include +#include +#include +#include "hashmap.h" + +struct node { + char *key; + void *value; + struct node *next; +}; + +struct hashmap *hashmap_new() { + struct hashmap *hm = malloc(sizeof *hm); + if (!hm) err(EXIT_FAILURE, "out of memory"); + for (int i=0; i < 26; i++) { + hm->buckets[i] = NULL; + } + + return hm; +} + +void hashmap_insert(struct hashmap *hm, char *key, void *value) { + int pos = (key[0] - 'a') % 26; + struct node *head = hm->buckets[pos]; + struct node *node = head; + + while (node) { + if (strcmp(node->key, key) == 0) { + node->value = value; + return; + } + node = node->next; + } + + node = malloc(sizeof *node); + node->key = key; + node->value = value; + node->next = head; + hm->buckets[pos] = node; +} + +void *hashmap_get(struct hashmap *hm, char *key) { + int pos = (key[0] - 'a') % 26; + struct node *node = hm->buckets[pos]; + while (node) { + if (strcmp(node->key, key) == 0) { + return node->value; + } + + node = node->next; + } + + return NULL; +} + +void hashmap_remove(char *key) { + +} + +void hashmap_free(struct hashmap *hm) { + struct node *node; + struct node *next; + + for (int i=0; i < 26; i++) { + node = hm->buckets[i]; + while (node) { + next = node->next; + free(node); + node = next; + } + } + + free(hm); +} \ No newline at end of file -- cgit v1.2.3