Skip to content

Commit 9641a9c

Browse files
committed
MOD: Fix hashtable get/delete bug
1 parent d98ac02 commit 9641a9c

File tree

1 file changed

+30
-19
lines changed

1 file changed

+30
-19
lines changed

src/hashtable.c

Lines changed: 30 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -92,13 +92,18 @@ void hashtable_destroy(hashtable *ht) {
9292
}
9393

9494
int hashtable_add(hashtable *ht, char *key, void *value) {
95-
int bucket;
95+
int bucket, key_size, current_key_size;
9696
entry *current;
9797

98+
key_size = strlen(key);
9899
bucket = hash_function(key, strlen(key)) % ht->nbucket;
99100
current = ht->buckets[bucket];
100101
while (current) {
101-
if (!strncasecmp(key, current->key, strlen(current->key))) return 0;
102+
current_key_size = strlen(current->key);
103+
if (key_size == current_key_size
104+
&& !strncmp(key, current->key, key_size)){
105+
return 0;
106+
}
102107
current = current->next;
103108
}
104109
entry *e = malloc(sizeof(*e));
@@ -110,39 +115,45 @@ int hashtable_add(hashtable *ht, char *key, void *value) {
110115
}
111116

112117
void *hashtable_get(hashtable *ht, char *key) {
113-
int bucket;
118+
int bucket, key_size, current_key_size;
114119
entry *current;
115120

116-
bucket = hash_function(key, strlen(key)) % ht->nbucket;
121+
key_size = strlen(key);
122+
bucket = hash_function(key, key_size) % ht->nbucket;
117123
current = ht->buckets[bucket];
118124
while(current) {
119-
if (!strncasecmp(key, current->key, strlen(current->key))) {
120-
return current->value;
125+
current_key_size = strlen(current->key);
126+
if (current_key_size == key_size
127+
&& !strncmp(key, current->key, key_size)) {
128+
return current->value;
121129
}
122130
current = current->next;
123131
}
124132
return NULL;
125133
}
126134

127135
int hashtable_del(hashtable *ht, char *key) {
128-
int bucket;
129-
entry *next, *prev;
136+
int bucket, key_size=strlen(key), current_key_size;
137+
entry *current, *prev;
130138

131-
bucket = hash_function(key, strlen(key)) % ht->nbucket;
132-
prev = next = ht->buckets[bucket];
133-
while (next) {
134-
if (!strncasecmp(key, next->key, strlen(next->key))) {
135-
prev->next = next->next;
136-
free(next->key);
137-
ht->free ? ht->free(next->value):free(next->value);
138-
free(next);
139-
if (prev == ht->buckets[bucket]) {
139+
bucket = hash_function(key, key_size) % ht->nbucket;
140+
prev = current = ht->buckets[bucket];
141+
142+
while (current) {
143+
current_key_size = strlen(current->key);
144+
if (key_size == current_key_size
145+
&& !strncmp(key, current->key, key_size)) {
146+
prev->next = current->next;
147+
if (current == ht->buckets[bucket]) {
140148
ht->buckets[bucket] = NULL;
141149
}
150+
free(current->key);
151+
ht->free ? ht->free(current->value):free(current->value);
152+
free(current);
142153
return 1;
143154
}
144-
prev = next;
145-
next = next->next;
155+
prev = current;
156+
current = current->next;
146157
}
147158
return 0;
148159
}

0 commit comments

Comments
 (0)