projects
/
apps
/
madmutt.git
/ blobdiff
commit
grep
author
committer
pickaxe
?
search:
re
summary
|
shortlog
|
log
|
commit
|
commitdiff
|
tree
raw
|
inline
| side by side
simplify hashes.
[apps/madmutt.git]
/
lib-lib
/
hash.c
diff --git
a/lib-lib/hash.c
b/lib-lib/hash.c
index
5520389
..
2bfc65a
100644
(file)
--- a/
lib-lib/hash.c
+++ b/
lib-lib/hash.c
@@
-39,39
+39,40
@@
int hash_string(const unsigned char *s, int n)
return (h % n);
}
return (h % n);
}
-HASH *hash_create(int nelem)
+HASH *hash_create(int nelem
, int allow_dup
)
{
HASH *table = p_new(HASH, 1);
{
HASH *table = p_new(HASH, 1);
- if (nelem == 0)
- nelem = 2;
-
- table->nelem = nelem;
+ table->dupes = allow_dup;
+ table->nelem = MIN(nelem, 2);
table->curnelem = 0;
table->curnelem = 0;
- table->table = p_new(struct hash_elem *, nelem);
+ table->table = p_new(struct hash_elem *, table->nelem);
+
return table;
}
return table;
}
-
HASH *
hash_resize(HASH *ptr, int nelem)
+
void
hash_resize(HASH *ptr, int nelem)
{
HASH *table;
struct hash_elem *elem, *tmp;
int i;
{
HASH *table;
struct hash_elem *elem, *tmp;
int i;
- table = hash_create (nelem);
+ /* XXX hack: we know the has was correct, no dupe checks is fater */
+ table = hash_create(nelem, 1);
for (i = 0; i < ptr->nelem; i++) {
for (elem = ptr->table[i]; elem;) {
tmp = elem;
elem = elem->next;
for (i = 0; i < ptr->nelem; i++) {
for (elem = ptr->table[i]; elem;) {
tmp = elem;
elem = elem->next;
- hash_insert(table, tmp->key, tmp->data
, 1
);
+ hash_insert(table, tmp->key, tmp->data);
p_delete(&tmp);
}
}
p_delete(&tmp);
}
}
- p_delete(&ptr->table);
- p_delete(&ptr);
- return table;
+ p_delete(&ptr->table);
+ ptr->nelem = table->nelem;
+ ptr->table = table->table;
+ p_delete(&table);
}
/* table hash table to update
}
/* table hash table to update
@@
-79,7
+80,7
@@
HASH *hash_resize(HASH *ptr, int nelem)
* data data to associate with `key'
* allow_dup if nonzero, duplicate keys are allowed in the table
*/
* data data to associate with `key'
* allow_dup if nonzero, duplicate keys are allowed in the table
*/
-int hash_insert(HASH *table, const char *key, void *data
, int allow_dup
)
+int hash_insert(HASH *table, const char *key, void *data)
{
struct hash_elem *ptr;
int h;
{
struct hash_elem *ptr;
int h;
@@
-89,16
+90,16
@@
int hash_insert(HASH *table, const char *key, void *data, int allow_dup)
ptr->key = key;
ptr->data = data;
ptr->key = key;
ptr->data = data;
- if (
allow_dup
) {
+ if (
table->dupes
) {
ptr->next = table->table[h];
table->table[h] = ptr;
table->curnelem++;
} else {
ptr->next = table->table[h];
table->table[h] = ptr;
table->curnelem++;
} else {
- struct hash_elem *tmp, *last;
- int r;
+ struct hash_elem **e;
+
+ for (e = &table->table[h]; *e; e = &(*e)->next) {
+ int r = m_strcmp((*e)->key, key);
- for (tmp = table->table[h], last = NULL; tmp; last = tmp, tmp = tmp->next) {
- r = m_strcmp(tmp->key, key);
if (r == 0) {
p_delete(&ptr);
return (-1);
if (r == 0) {
p_delete(&ptr);
return (-1);
@@
-106,12
+107,8
@@
int hash_insert(HASH *table, const char *key, void *data, int allow_dup)
if (r > 0)
break;
}
if (r > 0)
break;
}
- if (last) {
- last->next = ptr;
- } else {
- table->table[h] = ptr;
- }
- ptr->next = tmp;
+ ptr->next = *e;
+ *e = ptr;
table->curnelem++;
}
return h;
table->curnelem++;
}
return h;