struct svalue * get_map_lvalue(struct mapping *m, struct svalue *k, int c) { short h, h16; struct apair *p; h16 = hashsvalue(k); h = h16 & (m->size-1); for(p = m->pairs[h]; p; p = p->next) { if (p->hashval == h16 && equal_svalue(k, &p->arg)) break; } if (!p) { if (c) { m->pairs[h] = p = newpair(m->pairs[h], k, &const0, h16); if (++m->card > m->mcard) { /* We need to extend the hash table */ rehash_map(m); } } else { /* Return address of a dummy location, with 0. */ return &const0; } } return &p->val; }
struct svalue * get_map_lvalue(struct mapping *m, struct svalue *k, int c) { unsigned int hash, h; struct apair *p; hash = hashsvalue(k); h = hash % m->size; for (p = m->pairs[h]; p; p = p->next) { if (p->hashval == hash && equal_svalue(k, &p->arg)) break; } if (!p) { if (c) { if (m->card >= MAX_MAPPING_SIZE) { error("Too large mapping.\n"); return &const0; } m->pairs[h] = p = newpair(m->pairs[h], k, &const0, hash); if (++m->card > m->mcard) { /* We need to extend the hash table */ rehash_map(m); } } else { /* Return address of a dummy location, with 0. */ return &const0; } } return &p->val; }