1 //========================================================================
5 // Copyright 2001-2002 Glyph & Cog, LLC
7 //========================================================================
11 #ifdef USE_GCC_PRAGMAS
12 #pragma implementation
19 //------------------------------------------------------------------------
32 //------------------------------------------------------------------------
34 GHash::GHash(GBool deleteKeysA) {
37 deleteKeys = deleteKeysA;
39 tab = (GHashBucket **)gmalloc(size * sizeof(GHashBucket *));
40 for (h = 0; h < size; ++h) {
50 for (h = 0; h < size; ++h) {
63 void GHash::add(GString *key, void *val) {
68 // expand the table if necessary
73 tab = (GHashBucket **)gmalloc(size * sizeof(GHashBucket *));
74 for (h = 0; h < size; ++h) {
77 for (i = 0; i < oldSize; ++i) {
80 oldTab[i] = oldTab[i]->next;
99 void *GHash::lookup(GString *key) {
103 if (!(p = find(key, &h))) {
109 void *GHash::lookup(char *key) {
113 if (!(p = find(key, &h))) {
119 void *GHash::remove(GString *key) {
125 if (!(p = find(key, &h))) {
142 void *GHash::remove(char *key) {
148 if (!(p = find(key, &h))) {
165 void GHash::startIter(GHashIter **iter) {
166 *iter = new GHashIter;
171 GBool GHash::getNext(GHashIter **iter, GString **key, void **val) {
176 (*iter)->p = (*iter)->p->next;
178 while (!(*iter)->p) {
179 if (++(*iter)->h == size) {
184 (*iter)->p = tab[(*iter)->h];
186 *key = (*iter)->p->key;
187 *val = (*iter)->p->val;
191 void GHash::killIter(GHashIter **iter) {
196 GHashBucket *GHash::find(GString *key, int *h) {
200 for (p = tab[*h]; p; p = p->next) {
201 if (!p->key->cmp(key)) {
208 GHashBucket *GHash::find(char *key, int *h) {
212 for (p = tab[*h]; p; p = p->next) {
213 if (!p->key->cmp(key)) {
220 int GHash::hash(GString *key) {
226 for (p = key->getCString(), i = 0; i < key->getLength(); ++p, ++i) {
227 h = 17 * h + (int)(*p & 0xff);
229 return (int)(h % size);
232 int GHash::hash(char *key) {
237 for (p = key; *p; ++p) {
238 h = 17 * h + (int)(*p & 0xff);
240 return (int)(h % size);