ref: effc6788ebe0958f64b3218fbd341b4091ed016b
parent: f9daf27511bfa49a100fa45648c5098098d696b5
author: Rangi <remy.oukaour+rangi42@gmail.com>
date: Wed Oct 7 09:20:30 EDT 2020
Fix #586 segfault: Update the `charmaps` hashmap when an existing charmap is resized
--- a/include/hashmap.h
+++ b/include/hashmap.h
@@ -34,6 +34,16 @@
bool hash_AddElement(HashMap map, char const *key, void *element);
/**
+ * Replaces an element with an already-present key in a hashmap.
+ * @warning Inserting a NULL will make `hash_GetElement`'s return ambiguous!
+ * @param map The HashMap to replace the element in
+ * @param key The key with which the element will be stored and retrieved
+ * @param element The element to replace
+ * @return True if the element was found and replaced
+ */
+bool hash_ReplaceElement(HashMap const map, char const *key, void *element);
+
+/**
* Removes an element from a hashmap.
* @param map The HashMap to remove the element from
* @param key The key to search the element with
--- a/src/asm/charmap.c
+++ b/src/asm/charmap.c
@@ -173,6 +173,7 @@
if (currentCharmap->usedNodes == currentCharmap->capacity) {
currentCharmap->capacity *= 2;
currentCharmap = resizeCharmap(currentCharmap, currentCharmap->capacity);
+ hash_ReplaceElement(charmaps, currentCharmap->name, currentCharmap);
}
/* Switch to and init new node */
--- a/src/hashmap.c
+++ b/src/hashmap.c
@@ -64,6 +64,22 @@
return newEntry->next != NULL;
}
+bool hash_ReplaceElement(HashMap const map, char const *key, void *element)
+{
+ HashType hashedKey = hash(key);
+ struct HashMapEntry *ptr = map[(HalfHashType)hashedKey];
+
+ while (ptr) {
+ if (hashedKey >> HALF_HASH_NB_BITS == ptr->hash
+ && !strcmp(ptr->key, key)) {
+ ptr->content = element;
+ return true;
+ }
+ ptr = ptr->next;
+ }
+ return false;
+}
+
bool hash_RemoveElement(HashMap map, char const *key)
{
HashType hashedKey = hash(key);