summaryrefslogtreecommitdiff
path: root/src/libstddjb/cdb_nextkey.c
blob: 51e927f64636e1d3e12eb769d5d3b2282dfe0399 (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
/* ISC license. */

#include <stdint.h>
#include <skalibs/uint32.h>
#include <skalibs/cdb.h>

int cdb_nextkey (struct cdb *c, uint32_t *kpos)
{
  char buf[8] ;
  uint32_t eod, klen ;
  if (cdb_read(c, buf, 4, 0) < 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) < 0) return -1 ;
  uint32_unpack(buf, &klen) ;
  uint32_unpack(buf + 4, &c->dlen) ;
  c->dpos = c->kpos + klen ;
  *kpos += 8 + klen + c->dlen ;
  return 1 ;
}