HashNode addhashnode2(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 && !ht->scan) expandhashtable(ht); return NULL; } /* else check if the first node contains the same key */ if (ht->cmpnodes(hp->nam, hn->nam) == 0) { ht->nodes[hashval] = hn; replacing: hn->next = hp->next; if(ht->scan) { if(ht->scan->sorted) { HashNode *tab = ht->scan->u.s.tab; int i; for(i = ht->scan->u.s.ct; i--; ) if(tab[i] == hp) tab[i] = hn; } else if(ht->scan->u.u == hp) ht->scan->u.u = hn; } return hp; } /* else run through the list and check all the keys */ hq = hp; hp = hp->next; for (; hp; hq = hp, hp = hp->next) { if (ht->cmpnodes(hp->nam, hn->nam) == 0) { hq->next = hn; goto replacing; } } /* 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 && !ht->scan) expandhashtable(ht); return NULL; }
mod_export HashNode removehashnode(HashTable ht, char *nam) { unsigned hashval; HashNode hp, hq; hashval = ht->hash(nam) % ht->hsize; hp = ht->nodes[hashval]; /* if no nodes at this hash value, return NULL */ if (!hp) return NULL; /* else check if the key in the first one matches */ if (ht->cmpnodes(hp->nam, nam) == 0) { ht->nodes[hashval] = hp->next; gotit: ht->ct--; if(ht->scan) { if(ht->scan->sorted) { HashNode *tab = ht->scan->u.s.tab; int i; for(i = ht->scan->u.s.ct; i--; ) if(tab[i] == hp) tab[i] = NULL; } else if(ht->scan->u.u == hp) ht->scan->u.u = hp->next; } return hp; } /* else run through the list and check the rest of the keys */ hq = hp; hp = hp->next; for (; hp; hq = hp, hp = hp->next) { if (ht->cmpnodes(hp->nam, nam) == 0) { hq->next = hp->next; goto gotit; } } /* else it is not in the list, so return NULL */ return NULL; }
mod_export HashNode gethashnode2(HashTable ht, char *nam) { unsigned hashval; HashNode hp; hashval = ht->hash(nam) % ht->hsize; for (hp = ht->nodes[hashval]; hp; hp = hp->next) { if (ht->cmpnodes(hp->nam, nam) == 0) return hp; } return NULL; }
mod_export HashNode gethashnode(HashTable ht, const char *nam) { unsigned hashval; HashNode hp; hashval = ht->hash(nam) % ht->hsize; for (hp = ht->nodes[hashval]; hp; hp = hp->next) { if (ht->cmpnodes(hp->nam, nam) == 0) { if (hp->flags & DISABLED) return NULL; else return hp; } } return NULL; }