Lines Matching defs:symtab
1 /* $NetBSD: symtab.c,v 1.7 2025/01/26 16:25:38 christos Exp $ */
24 #include <isc/symtab.h>
56 isc_symtab_t *symtab;
63 symtab = isc_mem_get(mctx, sizeof(*symtab));
65 symtab->mctx = NULL;
66 isc_mem_attach(mctx, &symtab->mctx);
67 symtab->table = isc_mem_cget(mctx, size, sizeof(eltlist_t));
69 INIT_LIST(symtab->table[i]);
71 symtab->size = size;
72 symtab->count = 0;
73 symtab->maxload = size * 3 / 4;
74 symtab->undefine_action = undefine_action;
75 symtab->undefine_arg = undefine_arg;
76 symtab->case_sensitive = case_sensitive;
77 symtab->magic = SYMTAB_MAGIC;
79 *symtabp = symtab;
86 isc_symtab_t *symtab;
91 symtab = *symtabp;
93 REQUIRE(VALID_SYMTAB(symtab));
95 for (i = 0; i < symtab->size; i++) {
96 for (elt = HEAD(symtab->table[i]); elt != NULL; elt = nelt) {
98 if (symtab->undefine_action != NULL) {
99 (symtab->undefine_action)(elt->key, elt->type,
101 symtab->undefine_arg);
103 isc_mem_put(symtab->mctx, elt, sizeof(*elt));
106 isc_mem_cput(symtab->mctx, symtab->table, symtab->size,
108 symtab->magic = 0;
109 isc_mem_putanddetach(&symtab->mctx, symtab, sizeof(*symtab));
152 isc_symtab_lookup(isc_symtab_t *symtab, const char *key, unsigned int type,
157 REQUIRE(VALID_SYMTAB(symtab));
160 FIND(symtab, key, type, bucket, elt);
172 grow_table(isc_symtab_t *symtab) {
176 REQUIRE(symtab != NULL);
178 newsize = symtab->size * 2;
182 newtable = isc_mem_cget(symtab->mctx, newsize, sizeof(eltlist_t));
188 for (i = 0; i < symtab->size; i++) {
191 for (elt = HEAD(symtab->table[i]); elt != NULL; elt = nelt) {
196 UNLINK(symtab->table[i], elt, link);
197 hv = hash(elt->key, symtab->case_sensitive);
202 isc_mem_cput(symtab->mctx, symtab->table, symtab->size,
205 symtab->table = newtable;
206 symtab->size = newsize;
207 symtab->maxload = newmax;
211 isc_symtab_define(isc_symtab_t *symtab, const char *key, unsigned int type,
216 REQUIRE(VALID_SYMTAB(symtab));
220 FIND(symtab, key, type, bucket, elt);
227 UNLINK(symtab->table[bucket], elt, link);
228 if (symtab->undefine_action != NULL) {
229 (symtab->undefine_action)(elt->key, elt->type,
231 symtab->undefine_arg);
234 elt = isc_mem_get(symtab->mctx, sizeof(*elt));
236 symtab->count++;
253 PREPEND(symtab->table[bucket], elt, link);
255 if (symtab->count > symtab->maxload) {
256 grow_table(symtab);
263 isc_symtab_undefine(isc_symtab_t *symtab, const char *key, unsigned int type) {
267 REQUIRE(VALID_SYMTAB(symtab));
270 FIND(symtab, key, type, bucket, elt);
276 if (symtab->undefine_action != NULL) {
277 (symtab->undefine_action)(elt->key, elt->type, elt->value,
278 symtab->undefine_arg);
280 UNLINK(symtab->table[bucket], elt, link);
281 isc_mem_put(symtab->mctx, elt, sizeof(*elt));
282 symtab->count--;
288 isc_symtab_count(isc_symtab_t *symtab) {
289 REQUIRE(VALID_SYMTAB(symtab));
290 return symtab->count;