Archeus 0.0.0
A C library and game engine that focuses on documentation
Loading...
Searching...
No Matches
hashtable.c File Reference
#include "arc/std/hashtable.h"
#include "arc/std/errno.h"
#include <stdlib.h>
#include <stdio.h>

Go to the source code of this file.

Data Structures

struct  ARC_Hashtable
 

Functions

void CRC32 (void *key, size_t *keysize, uint32_t *hashval)
 
int8_t ARC_Default_Key_Compare (void *key1, size_t *key1size, void *key2, size_t *key2size)
 
void ARC_HashtableNode_Create (ARC_HashtableNode **node, void *key, size_t *keysize, void *data)
 
void ARC_HashtableNode_Destroy (ARC_HashtableNode *node, ARC_HashtableNode_DestroyExternal external, void *userdata)
 
void ARC_Hashtable_Create (ARC_Hashtable **htable, uint32_t bucketsize, ARC_Hashtable_Hash hash, ARC_Hashtable_KeyCompare compare)
 cteates ARC_Hashtable type
 
void ARC_Hashtable_Destroy (ARC_Hashtable *htable, ARC_HashtableNode_DestroyExternal external, void *userdata)
 destroys ARC_Hashtable type
 
void ARC_Hashtable_Add (ARC_Hashtable *htable, void *key, size_t keysize, void *data)
 adds value to hastable
 
void ARC_Hashtable_Get (ARC_Hashtable *htable, void *key, size_t keysize, void **data)
 gets value from hashtable by key
 
void ARC_Hashtable_Remove (ARC_Hashtable *htable, void *key, size_t keysize, ARC_HashtableNode_DestroyExternal external, void *userdata)
 removes value from hashtable
 

Function Documentation

◆ ARC_Default_Key_Compare()

int8_t ARC_Default_Key_Compare ( void * key1,
size_t * key1size,
void * key2,
size_t * key2size )

Definition at line 30 of file hashtable.c.

30 {
31 return key1 == key2;
32}

Referenced by ARC_Hashtable_Create().

◆ ARC_Hashtable_Add()

void ARC_Hashtable_Add ( ARC_Hashtable * htable,
void * key,
size_t keysize,
void * data )

adds value to hastable

Parameters
htableARC_Hashtable to add to
keykey for node that is being added
keysizesizeof key before it is passed into a void *
datadata for node that is being added

Definition at line 75 of file hashtable.c.

75 {
76 uint32_t size = 0;
77 htable->hash(key, &keysize, &size);
78
79 ARC_HashtableNode *bucket = htable->nodes[size % htable->size];
80 if(!bucket){
81 ARC_HashtableNode_Create(&bucket, key, &keysize, data);
82 htable->nodes[size % htable->size] = bucket;
83 return;
84 }
85
86 if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){
88 return;
89 }
90
91 while(bucket->node){
92 if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){
94 return;
95 }
96
97 bucket = bucket->node;
98 }
99
100 ARC_HashtableNode_Create(&(bucket->node), key, &keysize, data);
101}
int32_t arc_errno
Definition errno.c:5
#define ARC_ERRNO_EXISTS
Definition errno.h:9
void ARC_HashtableNode_Create(ARC_HashtableNode **node, void *key, size_t *keysize, void *data)
Definition hashtable.c:34
ARC_HashtableNode * node
Definition hashtable.h:25
ARC_Hashtable_Hash hash
Definition hashtable.c:10
ARC_HashtableNode ** nodes
Definition hashtable.c:9
uint32_t size
Definition hashtable.c:8
ARC_Hashtable_KeyCompare compare
Definition hashtable.c:11

References arc_errno, ARC_ERRNO_EXISTS, ARC_HashtableNode_Create(), ARC_Hashtable::compare, ARC_Hashtable::hash, ARC_HashtableNode::key, ARC_HashtableNode::keysize, ARC_HashtableNode::node, ARC_Hashtable::nodes, and ARC_Hashtable::size.

Referenced by ARC_Config_AddKey(), ARC_Config_AddKeyCString(), ARC_Config_CreateGroup(), and ARC_Config_LoadFromKey().

◆ ARC_Hashtable_Create()

void ARC_Hashtable_Create ( ARC_Hashtable ** htable,
uint32_t bucketsize,
ARC_Hashtable_Hash hash,
ARC_Hashtable_KeyCompare compare )

cteates ARC_Hashtable type

Parameters
htablewhere to store data
bucketsizenum of nodes to create in inital table
hashhashing function to be used, if set to NULL, CRC32 will be used
comparecomparison functon for checking keys, if set to NULL, addresses will be compared

Definition at line 56 of file hashtable.c.

56 {
57 *htable = (ARC_Hashtable *) malloc(sizeof(ARC_Hashtable));
58 (*htable)->size = bucketsize;
59 (*htable)->nodes = (ARC_HashtableNode **) calloc(bucketsize, sizeof(ARC_HashtableNode *));
60 (*htable)->hash = (hash)? hash : CRC32;
61 (*htable)->compare = (compare)? compare : ARC_Default_Key_Compare;
62}
int8_t ARC_Default_Key_Compare(void *key1, size_t *key1size, void *key2, size_t *key2size)
Definition hashtable.c:30
void CRC32(void *key, size_t *keysize, uint32_t *hashval)
Definition hashtable.c:14

References ARC_Default_Key_Compare(), CRC32(), and ARC_Hashtable::size.

Referenced by ARC_Config_Create(), and ARC_Config_CreateGroup().

◆ ARC_Hashtable_Destroy()

void ARC_Hashtable_Destroy ( ARC_Hashtable * htable,
ARC_HashtableNode_DestroyExternal external,
void * userdata )

destroys ARC_Hashtable type

Parameters
htablehtable that will be destroyed
externalfunction to allow external freeing of nodes, can be NULL
userdataany data the user wants access to in the callback

Definition at line 64 of file hashtable.c.

64 {
65 for(uint32_t i = 0; i < htable->size; i++){
66 if(htable->nodes[i]){
67 ARC_HashtableNode_Destroy(htable->nodes[i], external, userdata);
68 }
69 }
70
71 free(htable->nodes);
72 free(htable);
73}
void ARC_HashtableNode_Destroy(ARC_HashtableNode *node, ARC_HashtableNode_DestroyExternal external, void *userdata)
Definition hashtable.c:42

References ARC_HashtableNode_Destroy(), ARC_Hashtable::nodes, and ARC_Hashtable::size.

Referenced by ARC_Config_Destroy(), and ARC_Config_DestroyGroup().

◆ ARC_Hashtable_Get()

void ARC_Hashtable_Get ( ARC_Hashtable * htable,
void * key,
size_t keysize,
void ** data )

gets value from hashtable by key

Parameters
htabletable to get value from
keykey to get value from table
keysizesizeof key before it is passed into a void *
datadata retrieved from table

Definition at line 103 of file hashtable.c.

103 {
104 uint32_t size = 0;
105 htable->hash(key, &keysize, &size);
106
107 ARC_HashtableNode *bucket = htable->nodes[size % htable->size];
108 if(!bucket){
109 *data = NULL;
111 return;
112 }
113
114 if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){
115 *data = bucket->data;
116 return;
117 }
118
119 while(bucket->node){
120 if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){
121 *data = bucket->node->data;
122 return;
123 }
124
125 bucket = bucket->node;
126 }
127
129}
#define ARC_ERRNO_NULL
Definition errno.h:6

References arc_errno, ARC_ERRNO_NULL, ARC_Hashtable::compare, ARC_HashtableNode::data, ARC_Hashtable::hash, ARC_HashtableNode::key, ARC_HashtableNode::keysize, ARC_HashtableNode::node, ARC_Hashtable::nodes, and ARC_Hashtable::size.

Referenced by ARC_Config_Get(), ARC_Config_LoadFromKey(), and ARC_Config_SetGroup().

◆ ARC_Hashtable_Remove()

void ARC_Hashtable_Remove ( ARC_Hashtable * htable,
void * key,
size_t keysize,
ARC_HashtableNode_DestroyExternal external,
void * userdata )

removes value from hashtable

Parameters
htableARC_Hashtable to remove from
keykey of data to remove from hash table
keysizesizeof key before it is passed into a void *
externalfunction to allow external freeing of data, can be NULL
userdataany data the user wants access to in the callback

Definition at line 131 of file hashtable.c.

131 {
132 uint32_t size = 0;
133 htable->hash(key, &keysize, &size);
134
135 ARC_HashtableNode *bucket = htable->nodes[size % htable->size];
136 if(!bucket){
138 return;
139 }
140
141 if(!htable->compare(bucket->key, &bucket->keysize, key, &keysize)){
142 ARC_HashtableNode *temp = bucket;
143 htable->nodes[size % htable->size] = bucket->node;
144
145 if(external){
146 external(temp, userdata);
147 }
148
149 free(temp);
150 return;
151 }
152
153 while(bucket->node){
154 if(!htable->compare(bucket->node->key, &bucket->node->keysize, key, &keysize)){
155 ARC_HashtableNode *temp = bucket->node;
156 bucket->node = bucket->node->node;
157
158 if(external){
159 external(temp, userdata);
160 }
161
162 free(temp);
163 return;
164 }
165
166 bucket = bucket->node;
167 }
168
170}

References arc_errno, ARC_ERRNO_NULL, ARC_Hashtable::compare, ARC_Hashtable::hash, ARC_HashtableNode::key, ARC_HashtableNode::keysize, ARC_HashtableNode::node, ARC_Hashtable::nodes, and ARC_Hashtable::size.

Referenced by ARC_Config_UnloadFromKey().

◆ ARC_HashtableNode_Create()

void ARC_HashtableNode_Create ( ARC_HashtableNode ** node,
void * key,
size_t * keysize,
void * data )

Definition at line 34 of file hashtable.c.

34 {
35 *node = (ARC_HashtableNode *) malloc(sizeof(ARC_HashtableNode));
36 (*node)->key = key;
37 (*node)->keysize = *keysize;
38 (*node)->data = data;
39 (*node)->node = NULL;
40}

References ARC_HashtableNode::key.

Referenced by ARC_Hashtable_Add().

◆ ARC_HashtableNode_Destroy()

void ARC_HashtableNode_Destroy ( ARC_HashtableNode * node,
ARC_HashtableNode_DestroyExternal external,
void * userdata )

Definition at line 42 of file hashtable.c.

42 {
43 if(node == NULL){
44 return;
45 }
46
47 ARC_HashtableNode_Destroy(node->node, external, userdata);
48
49 if(external){
50 external(node, userdata);
51 }
52
53 free(node);
54}

References ARC_HashtableNode_Destroy(), and ARC_HashtableNode::node.

Referenced by ARC_Hashtable_Destroy(), and ARC_HashtableNode_Destroy().

◆ CRC32()

void CRC32 ( void * key,
size_t * keysize,
uint32_t * hashval )

Definition at line 14 of file hashtable.c.

14 {
15 *hashval = 0xffffffff;
16
17 for(size_t i = 0; i < *keysize; i++){
18 uint8_t value = *(((uint8_t *)key) + i);
19 for(uint8_t j = 0; j < 8; j++){
20 uint8_t flag = (uint8_t)((value ^ *hashval) & 1);
21 *hashval >>= 1;
22 if(flag){ *hashval ^= 0xEDB888320; }
23 value >>= 1;
24 }
25 }
26
27 *hashval = ~*hashval;
28}

Referenced by ARC_Hashtable_Create().