aboutsummaryrefslogtreecommitdiffstats
path: root/lib/hashmap/hashmap.c
diff options
context:
space:
mode:
authorGravatar BanceDev 2024-09-09 16:17:08 -0400
committerGravatar BanceDev 2024-09-09 16:17:08 -0400
commit521316d09b39a410d7e797efa176371e31a3a57e (patch)
treebb0c6bb5a9df1280fceb483983e2328ee87c0da0 /lib/hashmap/hashmap.c
parentbugfix to inline backspace and delete on multiline buffer (diff)
add aliasing to init.lua
Diffstat (limited to 'lib/hashmap/hashmap.c')
-rw-r--r--lib/hashmap/hashmap.c69
1 files changed, 69 insertions, 0 deletions
diff --git a/lib/hashmap/hashmap.c b/lib/hashmap/hashmap.c
new file mode 100644
index 0000000..cfc112c
--- /dev/null
+++ b/lib/hashmap/hashmap.c
@@ -0,0 +1,69 @@
+/*
+Copyright (c) 2024, Lance Borden
+All rights reserved.
+
+This software is licensed under the BSD 3-Clause License.
+You may obtain a copy of the license at:
+https://opensource.org/licenses/BSD-3-Clause
+
+Redistribution and use in source and binary forms, with or without
+modification, are permitted under the conditions stated in the BSD 3-Clause
+License.
+
+THIS SOFTWARE IS PROVIDED "AS IS" WITHOUT ANY WARRANTIES,
+EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE
+IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE.
+*/
+
+#include "hashmap.h"
+#include <stdio.h>
+#include <stdlib.h>
+#include <string.h>
+
+hashmap_t *hm_new_hashmap() {
+ hashmap_t *this = malloc(sizeof(hashmap_t));
+ this->cap = 8;
+ this->len = 0;
+ // null all pointers in list
+ this->list = calloc((this->cap), sizeof(map_pair_t *));
+ return this;
+}
+
+unsigned int hm_hashcode(hashmap_t *this, char *key) {
+ unsigned int code;
+ for (code = 0; *key != '\0'; key++) {
+ code = *key + 31 * code;
+ }
+
+ return code % (this->cap);
+}
+
+char *hm_get(hashmap_t *this, char *key) {
+ map_pair_t *current;
+ for (current = this->list[hm_hashcode(this, key)]; current;
+ current = current->next) {
+ if (strcmp(current->key, key) == 0) {
+ return current->val;
+ }
+ }
+ // the key is not found
+ return NULL;
+}
+
+void hm_set(hashmap_t *this, char *key, char *val) {
+ unsigned int idx = hm_hashcode(this, key);
+ map_pair_t *current;
+ for (current = this->list[idx]; current; current = current->next) {
+ if (strcmp(current->key, key) == 0) {
+ current->val = val;
+ return;
+ }
+ }
+
+ map_pair_t *p = malloc(sizeof(map_pair_t));
+ p->key = key;
+ p->val = val;
+ p->next = this->list[idx];
+ this->list[idx] = p;
+ this->len++;
+}