コード例 #1
0
ファイル: jk_map.c プロジェクト: devjin24/howtomcatworks
int map_put(jk_map_t *m,
            const char *name,
            const void *value,
            void **old)
{
    int rc = JK_FALSE;

    if(m && name && old) {
        unsigned i;
        for(i = 0 ; i < m->size ; i++) {
            if(0 == strcmp(m->names[i], name)) {
                break;
            }
        }

        if(i < m->size) {
            *old = (void *) m->values[i]; /* DIRTY */
            m->values[i] = value;
            rc = JK_TRUE;
        } else {
            map_realloc(m);

            if(m->size < m->capacity) {
                m->values[m->size] = value;
                m->names[m->size] = jk_pool_strdup(&m->p, name);
                m->size ++;
                rc = JK_TRUE;
            }
        }       
    }

    return rc;
}
コード例 #2
0
ファイル: hashtable.c プロジェクト: fprates/faclib
void fac_map_put(fac_map_t *map, const char *key, void *value)
{
    uintptr_t pos;
    struct s_map_entry *entry;
    unsigned int index;
    struct s_map_page *page;
    unsigned int hash = fac_hashcode(key);
    unsigned int base = (hash / MAP_PAGE_ENTRIES) * MAP_PAGE_ENTRIES;

    if (map->base == 0) {
        map->base = base;
        map->top = base;
        page = (struct s_map_page *)*(map->pages);
    } else {
        pos = (base - map->base) * map->pagesize;

        /*
         * não tenta realocar se há páginas
         * disponíveis na tabela.
         */
        if ((base < map->base) || (base > map->top)) {
            map_realloc(map, base);
            if (base == map->base)
                pos = 0;

            page = map_pages_init();
            pos += (uintptr_t)map->pages;
            *((uintptr_t *)pos) = (uintptr_t)page;
        } else {
            pos += (uintptr_t)map->pages;
            page = (struct s_map_page *)*((uintptr_t *)pos);

            if (page == NULL) {
                page = map_pages_init();
                *((uintptr_t *)pos) = (uintptr_t)page;
            }
        }
    }

    index = hash - base;
    entry = page->entries[index];
    if (entry == NULL) {
        page->entries[index] = map_entry(key, value);
        fac_list_add(map->keys, key);
        map->size++;
    } else {
        if (entry->key == NULL) {
            entry->key = key;
            entry->value = value;
            fac_list_add(map->keys, key);
            return;
        }

        /* se houver colisão */
        if (strcmp(entry->key, key) != 0) {
            if (entry->list == NULL)
                entry->list = fac_list_ini();
            fac_list_add(entry->list, map_entry(key, value));
            fac_list_add(map->keys, key);
        } else {
            entry->value = value;
        }
    }
}