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; }
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; } } }