static int __cdbb_findnext(struct cdbb *a, const char *needle, struct nentry *n, int ignorecase) { uint32 kp, dp, ks, vs; unsigned char *k, *v; if (cdb_nextkey(a->r, &a->kfindpos) != 1) return -1; kp = cdb_keypos(a->r); ks = cdb_keylen(a->r); k = alloca(ks); cdb_read(a->r, k, ks, kp); dp = cdb_datapos(a->r); vs = cdb_datalen(a->r); /* in some cases we do not need to read e.g. when deleting * or filtering but for simplicity we just do it anyways */ v = alloca(vs); cdb_read(a->r, v, vs, dp); /* search value */ if (ignorecase) { if (strcasestr((char *)v, needle) == NULL) return 0; } else { if (strstr((char *)v, needle) == NULL) return 0; } array_catb(&n->k, (char *)k, ks); array_catb(&n->e, (char *)v, vs); return 1; }
int cdb_successor (struct cdb *c, char const *key, unsigned int klen) { uint32 kpos ; if (key) { register int r = cdb_find(c, key, klen) ; if (r < 1) return r ; kpos = c->dpos + c->dlen ; } else cdb_traverse_init(c, &kpos) ; return cdb_nextkey(c, &kpos) ; }
int cdbb_copy(struct cdbb *a) { uint32 kfindpos, ks, vs; int num = 0; if (!cdb_firstkey(a->r, &kfindpos)) return 0; do { ks = cdb_keylen(a->r); vs = cdb_datalen(a->r); num += __cdbb_copy(a, ks, vs); } while (cdb_nextkey(a->r, &kfindpos) == 1); return num; }