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.
|
|
|
#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(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(buf,&klen);
|
|
|
|
uint32_unpack(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,unsigned long int 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);
|
|
|
|
}
|