Lines Matching defs:cdbw
1 /* $NetBSD: cdbw.c,v 1.9 2023/08/08 10:34:08 riastradh Exp $ */
39 __RCSID("$NetBSD: cdbw.c,v 1.9 2023/08/08 10:34:08 riastradh Exp $");
47 #include <cdbw.h>
139 struct cdbw {
154 struct cdbw *
157 struct cdbw *cdbw;
160 cdbw = calloc(sizeof(*cdbw), 1);
161 if (cdbw == NULL)
164 cdbw->hash_size = 1024;
165 cdbw->hash = calloc(cdbw->hash_size, sizeof(*cdbw->hash));
166 if (cdbw->hash == NULL) {
167 free(cdbw);
171 for (i = 0; i < cdbw->hash_size; ++i)
172 SLIST_INIT(cdbw->hash + i);
174 return cdbw;
178 cdbw_put(struct cdbw *cdbw, const void *key, size_t keylen,
184 rv = cdbw_put_data(cdbw, data, datalen, &idx);
187 rv = cdbw_put_key(cdbw, key, keylen, idx);
189 --cdbw->data_counter;
190 free(cdbw->data_ptr[cdbw->data_counter]);
191 cdbw->data_size -= datalen;
198 cdbw_put_data(struct cdbw *cdbw, const void *data, size_t datalen,
202 if (cdbw->data_counter == max_data_counter)
205 if (cdbw->data_size + datalen < cdbw->data_size ||
206 cdbw->data_size + datalen > 0xffffffffU)
209 if (cdbw->data_allocated == cdbw->data_counter) {
214 if (cdbw->data_allocated == 0)
217 new_allocated = cdbw->data_allocated * 2;
219 new_data_ptr = realloc(cdbw->data_ptr,
220 sizeof(*cdbw->data_ptr) * new_allocated);
223 cdbw->data_ptr = new_data_ptr;
225 new_data_len = realloc(cdbw->data_len,
226 sizeof(*cdbw->data_len) * new_allocated);
229 cdbw->data_len = new_data_len;
231 cdbw->data_allocated = new_allocated;
234 cdbw->data_ptr[cdbw->data_counter] = malloc(datalen);
235 if (cdbw->data_ptr[cdbw->data_counter] == NULL)
237 memcpy(cdbw->data_ptr[cdbw->data_counter], data, datalen);
238 cdbw->data_len[cdbw->data_counter] = datalen;
239 cdbw->data_size += datalen;
240 *idx = cdbw->data_counter++;
245 cdbw_put_key(struct cdbw *cdbw, const void *key, size_t keylen, uint32_t idx)
252 if (idx >= cdbw->data_counter ||
253 cdbw->key_counter == max_data_counter)
258 head = cdbw->hash + (hashes[0] & (cdbw->hash_size - 1));
287 ++cdbw->key_counter;
289 if (cdbw->key_counter <= cdbw->hash_size)
293 new_hash_size = cdbw->hash_size * 2;
298 head = &cdbw->hash[hashes[0] & (cdbw->hash_size - 1)];
302 for (i = 0; i < cdbw->hash_size; ++i) {
303 head = cdbw->hash + i;
312 free(cdbw->hash);
313 cdbw->hash_size = new_hash_size;
314 cdbw->hash = new_head;
320 cdbw_close(struct cdbw *cdbw)
326 for (i = 0; i < cdbw->hash_size; ++i) {
327 head = cdbw->hash + i;
335 for (i = 0; i < cdbw->data_counter; ++i)
336 free(cdbw->data_ptr[i]);
337 free(cdbw->data_ptr);
338 free(cdbw->data_len);
339 free(cdbw->hash);
340 free(cdbw);
422 build_graph(struct cdbw *cdbw, struct state *state)
439 for (i = 0; i < cdbw->hash_size; ++i) {
440 head = &cdbw->hash[i];
544 print_hash(struct cdbw *cdbw, struct state *state, int fd, const char *descr)
554 le32enc(buf + 24, cdbw->data_size);
555 le32enc(buf + 28, cdbw->data_counter);
566 size2 = compute_size(cdbw->data_size);
574 for (data_size = 0, i = 0; i < cdbw->data_counter; ++i) {
578 data_size += cdbw->data_len[i];
584 for (i = 0; i < cdbw->data_counter; ++i) {
585 COND_FLUSH_BUFFER(cdbw->data_len[i]);
586 if (cdbw->data_len[i] < sizeof(buf)) {
587 memcpy(buf + cur_pos, cdbw->data_ptr[i],
588 cdbw->data_len[i]);
589 cur_pos += cdbw->data_len[i];
591 ret = write(fd, cdbw->data_ptr[i], cdbw->data_len[i]);
592 if (ret == -1 || (size_t)ret != cdbw->data_len[i])
605 cdbw_output(struct cdbw *cdbw, int fd, const char *descr,
611 if (cdbw->data_counter == 0 || cdbw->key_counter == 0) {
614 print_hash(cdbw, &state, fd, descr);
628 state.keys = cdbw->key_counter;
629 state.data_entries = cdbw->data_counter;
654 } while (build_graph(cdbw, &state));
657 rv = print_hash(cdbw, &state, fd, descr);