You cannot select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

41 lines
902 B
C

#include "cdb.h"
static int doit(struct cdb *c,uint32 *kpos) {
unsigned char buf[8];
uint32 eod,klen;
if (cdb_read(c,buf,4,0)) return -1;
uint32_unpack((char*)buf,&eod);
if (eod<8 || eod-8<*kpos) return 0;
c->kpos=*kpos+8;
if (c->kpos<*kpos) return -1; /* wraparound */
cdb_findstart(c);
c->hslots=1;
if (cdb_read(c,buf,8,*kpos) == -1) return -1;
uint32_unpack((char*)buf,&klen);
uint32_unpack((char*)buf+4,&c->dlen);
c->dpos=c->kpos+klen;
*kpos+=8+klen+c->dlen;
return 1;
}
int cdb_firstkey(struct cdb *c,uint32 *kpos) {
*kpos=2048;
return doit(c,kpos);
}
int cdb_nextkey(struct cdb *c,uint32 *kpos) {
return doit(c,kpos);
}
int cdb_successor(struct cdb *c,const unsigned char *key,size_t klen) {
int r;
uint32 kpos;
if (key) {
r=cdb_find(c,key,klen);
if (r<1) return r;
kpos=c->dpos+c->dlen;
} else
kpos=2048;
return doit(c,&kpos);
}