/* * Inserts element into the map. * * @author Lukasz Koprowski <*****@*****.**> */ int map_put(snode * root, char * key, int value) { if(key[0] == '\0') return SUCCESS; snode * node = malloc(sizeof(snode)); if(node == NULL){ error(ERR_NOT_ENOUGH_MEMORY); } node -> key = get_hashcode(key); node -> value = value; node -> left = NULL; node -> right = NULL; snode * fnode = map_find(root, node -> key); if (fnode -> key == EMPTY_KEY) { fnode -> key = node -> key; fnode -> value = node -> value; free(node); } else if (fnode -> key > node -> key) { fnode -> right = node; } else { fnode -> left = node; } return SUCCESS; }
static HashEntry* hashmap_lookup(HashTable* table, void const* key, size_t ksize, int (*equals)(void const* data, void const* key)) { const uint32_t hash = get_hashcode(key, ksize); const size_t slot = get_index(hash); HashEntry* entry = table->slots[slot]; while (entry) { if (equals(entry->data, key)) { break; } entry = entry->next; } if (entry == NULL) { // create a new entry entry = DbgAllocLocked(sizeof(HashEntry), 1); entry->data = NULL; entry->slot = slot; entry->prev = NULL; entry->next = table->slots[slot]; if (entry->next != NULL) { entry->next->prev = entry; } table->slots[slot] = entry; } return entry; }
/* * Finds value of an element in the map. * * @author Lukasz Koprowski <*****@*****.**> * @return Either value assigned to the key, or an EMPTY_KEY. */ int map_get(snode * root, char * key) { long long int hash = get_hashcode(key); snode * fnode = map_find(root, hash); if(fnode != NULL && fnode -> key == hash){ return fnode -> value; } else { return ERROR; } }