aboutsummaryrefslogtreecommitdiffstats
path: root/lib
diff options
context:
space:
mode:
authorGravatar Andrew D. France 2025-07-23 04:31:13 -0500
committerGravatar Andrew D. France 2025-07-23 04:31:13 -0500
commit4ac55835610f41c412d4abb1d8a113dcfe3140dd (patch)
tree2507acdf5cad8bc65e32c037bdf436f1500c1b74 /lib
parentbuild: Remove broken submodule configuration (diff)
Revert to old hashmap: fixed gitmodule index
Diffstat (limited to '')
m---------lib/hashmap0
-rw-r--r--lib/hashmap/hashmap.c69
-rw-r--r--lib/hashmap/hashmap.h38
3 files changed, 107 insertions, 0 deletions
diff --git a/lib/hashmap b/lib/hashmap
deleted file mode 160000
-Subproject 1c139923fe08f36143ecc0ba37cd674684f87f9
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++;
+}
diff --git a/lib/hashmap/hashmap.h b/lib/hashmap/hashmap.h
new file mode 100644
index 0000000..d5775c5
--- /dev/null
+++ b/lib/hashmap/hashmap.h
@@ -0,0 +1,38 @@
+/*
+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.
+*/
+
+#ifndef HASHMAP_H
+#define HASHMAP_H
+
+typedef struct pair {
+ char *key;
+ char *val;
+ struct pair *next;
+} map_pair_t;
+
+typedef struct {
+ map_pair_t **list;
+ unsigned int cap;
+ unsigned int len;
+} hashmap_t;
+
+hashmap_t *hm_new_hashmap();
+unsigned int hm_hashcode(hashmap_t *this, char *key);
+char *hm_get(hashmap_t *this, char *key);
+void hm_set(hashmap_t *this, char *key, char *val);
+
+#endif // HASHMAP_H