commit c905041a59e85fbddc993117a14ccb17e5fea95a
parent 514603cebfc39f08086f3c2ea6d73cbd1763fa69
Author: Jake Koroman <jake@jakekoroman.com>
Date: Tue, 13 Jan 2026 09:45:17 -0500
declare max_key_size in hash map impl.
Diffstat:
| M | jrk.h | | | 170 | +++++++++++++++++++++++++++++++++++++++++-------------------------------------- |
1 file changed, 88 insertions(+), 82 deletions(-)
diff --git a/jrk.h b/jrk.h
@@ -1,11 +1,15 @@
/*
* TODO:
* - remove strnlen/strncmp from hm impl. should probably be using
- * jrk_StringView's
+ * jrk_StringView's.
*
* - add a log interface to give user control of logging.
* disable completely, log to file, log format, etc.
*
+ * - add an arg parsing api.
+ *
+ * - add real random api. and remove the rand() wrappers.
+ *
* - look at at the jrk_sv_chop_delim_loop stuff. there must
* must be a better way of handling things.
*/
@@ -263,7 +267,7 @@ typedef void *(*jrk_array_realloc_function_t) (void*, u64, u64, void*);
#define jrk_array_foreach(type, it, arr) for (type *it = (arr)->items; it < (arr)->items + (arr)->size; ++it)
jrk_array_prototype(char);
-#define jrk_StringBuilder jrk_Array_char
+typedef jrk_Array_char jrk_StringBuilder;
#define jrk_sb_append_null(sb) jrk_array_char_push((sb), 0)
#define jrk_sb_append_cstr(sb, str) jrk_sb_appendf((sb), (str))
@@ -286,10 +290,9 @@ bool jrk_sb_read_entire_file(jrk_StringBuilder*, char*);
#define JRK_FNV1A_64_PRIME 0x100000001B3
u64 jrk_fnv1a_64(u8*, u64);
-#define JRK_HM_MAX_KEY_SIZE 16
-#define jrk_hm_prototype(type) \
+#define jrk_hm_prototype(type, max_key_size) \
typedef struct { \
- char key[JRK_HM_MAX_KEY_SIZE]; \
+ char key[(max_key_size)]; \
type val; \
} jrk_HashMapItem_##type; \
\
@@ -302,82 +305,84 @@ u64 jrk_fnv1a_64(u8*, u64);
bool jrk_hm_##type##_push(jrk_HashMap_##type *map, char *key, type val); \
bool jrk_hm_##type##_get(jrk_HashMap_##type *map, char *key, type *outval);
-#define jrk_hm_impl(type) \
- bool \
- jrk_hm_##type##_init(jrk_HashMap_##type *map, jrk_HashMapItem_##type *items, u64 items_cap) \
- { \
- if (!map) { \
- fprintf(stderr, "error: failed to init hashmap: map pointer is NULL\n"); \
- return false; \
- } \
- if (!items) { \
- fprintf(stderr, "error: failed to init hashmap: buf pointer is NULL\n"); \
- return false; \
- } \
- map->items = items; \
- map->capacity = items_cap; \
- return true; \
- } \
- \
- bool \
- jrk_hm_##type##_push(jrk_HashMap_##type *map, char *key, type val) \
- { \
- if (!key) { \
- fprintf(stderr, "error: failed to push key into hashmap: key pointer is NULL\n"); \
- return false; \
- } \
- if (!map) { \
- fprintf(stderr, "error: failed to push key '%s' into hashmap: map pointer is NULL\n", key); \
- return false; \
- } \
- u64 idx = jrk_fnv1a_64((u8 *) key, strnlen(key, JRK_HM_MAX_KEY_SIZE)) % map->capacity; \
- jrk_HashMapItem_##type *item = &map->items[idx]; \
- if (item->key[0] != 0 && 0 != strncmp(item->key, key, JRK_HM_MAX_KEY_SIZE)) \
- printf("%s collision with %s\n", key, item->key); \
- for (; item < &map->items[map->capacity] && item->key[0] != 0 && 0 != strncmp(item->key, key, JRK_HM_MAX_KEY_SIZE); ++item); \
- if (item == &map->items[map->capacity]) { \
- for (item = &map->items[0]; item < &map->items[idx] && item->key[0] != 0; ++item); \
- if (item == &map->items[idx]) { \
- fprintf(stderr, "error: no space found for key '%s': hashmap is full\n", key); \
- return false; \
- } \
- } \
- memcpy(item->key, key, strlen(key)); \
- item->val = val; \
- return true; \
- } \
- \
- bool \
- jrk_hm_##type##_get(jrk_HashMap_##type *map, char *key, type *outval) \
- { \
- if (!key) { \
- fprintf(stderr, "error: failed to get key from hashmap: key pointer is NULL\n"); \
- return false; \
- } \
- if (!map) { \
- fprintf(stderr, "error: failed to get key '%s' from hashmap: map pointer is NULL\n", key); \
- return false; \
- } \
- if (!outval) { \
- fprintf(stderr, "error: failed to get key '%s' from hashmap: outval pointer is NULL\n", key); \
- return false; \
- } \
- u64 idx = jrk_fnv1a_64((u8 *) key, strnlen(key, JRK_HM_MAX_KEY_SIZE)) % map->capacity; \
- jrk_HashMapItem_##type *item = &map->items[idx]; \
- if (0 == strncmp(item->key, key, JRK_HM_MAX_KEY_SIZE)) { \
- *outval = item->val; \
- return true; \
- } \
- for (; item < &map->items[map->capacity] && 0 != strncmp(item->key, key, JRK_HM_MAX_KEY_SIZE); ++item) \
- if (item->key[0] == 0) \
- return false; \
- if (item == &map->items[map->capacity]) { \
- for (item = &map->items[0]; item < &map->items[idx] && 0 != strncmp(item->key, key, JRK_HM_MAX_KEY_SIZE); ++item); \
- if (item == &map->items[idx]) \
- return false; \
- } \
- *outval = item->val; \
- return true; \
+#define jrk_hm_impl(type) \
+ bool \
+ jrk_hm_##type##_init(jrk_HashMap_##type *map, jrk_HashMapItem_##type *items, u64 items_cap) \
+ { \
+ if (!map) { \
+ fprintf(stderr, "error: failed to init hashmap: map pointer is NULL\n"); \
+ return false; \
+ } \
+ if (!items) { \
+ fprintf(stderr, "error: failed to init hashmap: buf pointer is NULL\n"); \
+ return false; \
+ } \
+ map->items = items; \
+ map->capacity = items_cap; \
+ return true; \
+ } \
+ \
+ bool \
+ jrk_hm_##type##_push(jrk_HashMap_##type *map, char *key, type val) \
+ { \
+ if (!key) { \
+ fprintf(stderr, "error: failed to push key into hashmap: key pointer is NULL\n"); \
+ return false; \
+ } \
+ if (!map) { \
+ fprintf(stderr, "error: failed to push key '%s' into hashmap: map pointer is NULL\n", key); \
+ return false; \
+ } \
+ u64 keylen = sizeof(map->items->key); \
+ u64 idx = jrk_fnv1a_64((u8 *) key, strnlen(key, keylen)) % map->capacity; \
+ jrk_HashMapItem_##type *item = &map->items[idx]; \
+ if (item->key[0] != 0 && 0 != strncmp(item->key, key, sizeof(map->items->key))) \
+ printf("%s collision with %s\n", key, item->key); \
+ for (; item < &map->items[map->capacity] && item->key[0] != 0 && 0 != strncmp(item->key, key, keylen); ++item); \
+ if (item == &map->items[map->capacity]) { \
+ for (item = &map->items[0]; item < &map->items[idx] && item->key[0] != 0; ++item); \
+ if (item == &map->items[idx]) { \
+ fprintf(stderr, "error: no space found for key '%s': hashmap is full\n", key); \
+ return false; \
+ } \
+ } \
+ memcpy(item->key, key, strlen(key)); \
+ item->val = val; \
+ return true; \
+ } \
+ \
+ bool \
+ jrk_hm_##type##_get(jrk_HashMap_##type *map, char *key, type *outval) \
+ { \
+ if (!key) { \
+ fprintf(stderr, "error: failed to get key from hashmap: key pointer is NULL\n"); \
+ return false; \
+ } \
+ if (!map) { \
+ fprintf(stderr, "error: failed to get key '%s' from hashmap: map pointer is NULL\n", key); \
+ return false; \
+ } \
+ if (!outval) { \
+ fprintf(stderr, "error: failed to get key '%s' from hashmap: outval pointer is NULL\n", key); \
+ return false; \
+ } \
+ u64 keylen = sizeof(map->items->key); \
+ u64 idx = jrk_fnv1a_64((u8 *) key, strnlen(key, keylen)) % map->capacity; \
+ jrk_HashMapItem_##type *item = &map->items[idx]; \
+ if (0 == strncmp(item->key, key, keylen)) { \
+ *outval = item->val; \
+ return true; \
+ } \
+ for (; item < &map->items[map->capacity] && 0 != strncmp(item->key, key, keylen); ++item) \
+ if (item->key[0] == 0) \
+ return false; \
+ if (item == &map->items[map->capacity]) { \
+ for (item = &map->items[0]; item < &map->items[idx] && 0 != strncmp(item->key, key, keylen); ++item); \
+ if (item == &map->items[idx]) \
+ return false; \
+ } \
+ *outval = item->val; \
+ return true; \
}
#ifdef JRK_IMPLEMENTATION
@@ -391,6 +396,7 @@ u64 jrk_fnv1a_64(u8*, u64);
#include <sys/stat.h>
#include <unistd.h>
+// NOTE: for jrk_StringBuilder
jrk_array_impl(char)
void *
@@ -518,7 +524,7 @@ jrk_sb_write_entire_file(jrk_StringBuilder *sb, char *filename)
bool result = true;
i32 fd = jrk_fd_open_write(filename);
if (fd < 0) return false;
- if(!jrk_sb_fd_write(sb, fd)) jrk_return_defer(false);
+ if (!jrk_sb_fd_write(sb, fd)) jrk_return_defer(false);
defer:
jrk_fd_close(fd);