aboutsummaryrefslogtreecommitdiff
path: root/hashmap.c
diff options
context:
space:
mode:
Diffstat (limited to 'hashmap.c')
-rw-r--r--hashmap.c74
1 files changed, 74 insertions, 0 deletions
diff --git a/hashmap.c b/hashmap.c
new file mode 100644
index 0000000..3d9edd0
--- /dev/null
+++ b/hashmap.c
@@ -0,0 +1,74 @@
+#include <string.h>
+#include <stdlib.h>
+#include <err.h>
+#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