#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);
}