Lines Matching defs:cdbr
1 /* $NetBSD: cdbr.c,v 1.2 2017/01/10 23:06:06 christos Exp $ */
39 __RCSID("$NetBSD: cdbr.c,v 1.2 2017/01/10 23:06:06 christos Exp $");
53 #include <sys/cdbr.h>
59 #define free(ptr) kmem_free(ptr, sizeof(struct cdbr))
63 #include <cdbr.h>
89 struct cdbr {
121 struct cdbr *
127 struct cdbr *cdbr;
151 cdbr = cdbr_open_mem(base, size, flags, cdbr_unmap, NULL);
152 if (cdbr == NULL)
154 return cdbr;
158 struct cdbr *
162 struct cdbr *cdbr;
169 cdbr = malloc(sizeof(*cdbr));
170 cdbr->unmap = unmap;
171 cdbr->cookie = cookie;
173 cdbr->data_size = le32dec(buf + 24);
174 cdbr->entries = le32dec(buf + 28);
175 cdbr->entries_index = le32dec(buf + 32);
176 cdbr->seed = le32dec(buf + 36);
178 if (cdbr->data_size < 0x100)
179 cdbr->offset_size = 1;
180 else if (cdbr->data_size < 0x10000)
181 cdbr->offset_size = 2;
183 cdbr->offset_size = 4;
185 if (cdbr->entries_index < 0x100)
186 cdbr->index_size = 1;
187 else if (cdbr->entries_index < 0x10000)
188 cdbr->index_size = 2;
190 cdbr->index_size = 4;
192 cdbr->mmap_base = base;
193 cdbr->mmap_size = size;
195 cdbr->hash_base = cdbr->mmap_base + 40;
196 cdbr->offset_base = cdbr->hash_base + cdbr->entries_index * cdbr->index_size;
197 if (cdbr->entries_index * cdbr->index_size % cdbr->offset_size)
198 cdbr->offset_base += cdbr->offset_size -
199 cdbr->entries_index * cdbr->index_size % cdbr->offset_size;
200 cdbr->data_base = cdbr->offset_base + (cdbr->entries + 1) * cdbr->offset_size;
202 if (cdbr->hash_base < cdbr->mmap_base ||
203 cdbr->offset_base < cdbr->mmap_base ||
204 cdbr->data_base < cdbr->mmap_base ||
205 cdbr->data_base + cdbr->data_size < cdbr->mmap_base ||
206 cdbr->data_base + cdbr->data_size >
207 cdbr->mmap_base + cdbr->mmap_size) {
209 free(cdbr);
213 if (cdbr->entries) {
214 fast_divide32_prepare(cdbr->entries, &cdbr->entries_m,
215 &cdbr->entries_s1, &cdbr->entries_s2);
217 if (cdbr->entries_index) {
218 fast_divide32_prepare(cdbr->entries_index,
219 &cdbr->entries_index_m,
220 &cdbr->entries_index_s1, &cdbr->entries_index_s2);
223 return cdbr;
240 cdbr_entries(struct cdbr *cdbr)
243 return cdbr->entries;
247 cdbr_get(struct cdbr *cdbr, uint32_t idx, const void **data, size_t *data_len)
251 if (idx >= cdbr->entries) {
256 start = get_uintX(cdbr->offset_base, idx, cdbr->offset_size);
257 end = get_uintX(cdbr->offset_base, idx + 1, cdbr->offset_size);
264 if (end > cdbr->data_size) {
269 *data = cdbr->data_base + start;
276 cdbr_find(struct cdbr *cdbr, const void *key, size_t key_len,
281 if (cdbr->entries_index == 0) {
286 mi_vector_hash(key, key_len, cdbr->seed, hashes);
288 hashes[0] = fast_remainder32(hashes[0], cdbr->entries_index,
289 cdbr->entries_index_m, cdbr->entries_index_s1,
290 cdbr->entries_index_s2);
291 hashes[1] = fast_remainder32(hashes[1], cdbr->entries_index,
292 cdbr->entries_index_m, cdbr->entries_index_s1,
293 cdbr->entries_index_s2);
294 hashes[2] = fast_remainder32(hashes[2], cdbr->entries_index,
295 cdbr->entries_index_m, cdbr->entries_index_s1,
296 cdbr->entries_index_s2);
298 idx = get_uintX(cdbr->hash_base, hashes[0], cdbr->index_size);
299 idx += get_uintX(cdbr->hash_base, hashes[1], cdbr->index_size);
300 idx += get_uintX(cdbr->hash_base, hashes[2], cdbr->index_size);
302 return cdbr_get(cdbr, fast_remainder32(idx, cdbr->entries,
303 cdbr->entries_m, cdbr->entries_s1, cdbr->entries_s2), data,
308 cdbr_close(struct cdbr *cdbr)
310 if (cdbr->unmap)
311 (*cdbr->unmap)(cdbr->cookie, cdbr->mmap_base, cdbr->mmap_size);
312 free(cdbr);