Пример #1
0
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;
}
Пример #2
0
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;
}