mod_export void addhashnode(HashTable ht, char *nam, void *nodeptr) { HashNode oldnode = addhashnode2(ht, nam, nodeptr); if (oldnode) ht->freenode(oldnode); }
static void resizehashtable(HashTable ht, int newsize) { struct hashnode **ha, *hn, *hp; int i; /* free all the hash nodes */ ha = ht->nodes; for (i = 0; i < ht->hsize; i++, ha++) { for (hn = *ha; hn;) { hp = hn->next; ht->freenode(hn); hn = hp; } } /* If new size desired is different from current size, * * we free it and allocate a new nodes array. */ if (ht->hsize != newsize) { zfree(ht->nodes, ht->hsize * sizeof(HashNode)); ht->nodes = (HashNode *) zshcalloc(newsize * sizeof(HashNode)); ht->hsize = newsize; } else { /* else we just re-zero the current nodes array */ memset(ht->nodes, 0, newsize * sizeof(HashNode)); } ht->ct = 0; }
void addhashnode(HashTable ht, char *nam, void *nodeptr) { unsigned hashval; HashNode hn, hp, hq; hn = (HashNode) nodeptr; hn->nam = nam; hashval = ht->hash(hn->nam) % ht->hsize; hp = ht->nodes[hashval]; /* check if this is the first node for this hash value */ if (!hp) { hn->next = NULL; ht->nodes[hashval] = hn; if (++ht->ct == ht->hsize * 2) expandhashtable(ht); return; } /* else check if the first node contains the same key */ if (!strcmp(hp->nam, hn->nam)) { hn->next = hp->next; ht->nodes[hashval] = hn; ht->freenode(hp); return; } /* else run through the list and check all the keys */ hq = hp; hp = hp->next; for (; hp; hq = hp, hp = hp->next) { if (!strcmp(hp->nam, hn->nam)) { hn->next = hp->next; hq->next = hn; ht->freenode(hp); return; } } /* else just add it at the front of the list */ hn->next = ht->nodes[hashval]; ht->nodes[hashval] = hn; if (++ht->ct == ht->hsize * 2) expandhashtable(ht); }