1 /* ISC license. */ 2 3 #ifndef CDB_H 4 #define CDB_H 5 6 #include <stdint.h> 7 #include <skalibs/gccattributes.h> 8 9 #define CDB_HASHSTART 5381 10 extern uint32_t cdb_hashadd (uint32_t, unsigned char) gccattr_const ; 11 extern uint32_t cdb_hash (char const *, unsigned int) gccattr_pure ; 12 13 typedef struct cdb cdb_t, *cdb_t_ref ; 14 struct cdb 15 { 16 char *map ; /* 0 if no map */ 17 int fd ; /* -1 if uninitted, negative if mapped, nonnegative if nomapped */ 18 uint32_t size ; /* initialized if map is nonzero */ 19 uint32_t loop ; /* number of hash slots searched under this key */ 20 uint32_t khash ; /* initialized if loop is nonzero */ 21 uint32_t kpos ; /* initialized if loop is nonzero */ 22 uint32_t hpos ; /* initialized if loop is nonzero */ 23 uint32_t hslots ; /* initialized if loop is nonzero */ 24 uint32_t dpos ; /* initialized if cdb_findnext() returns 1 */ 25 uint32_t dlen ; /* initialized if cdb_findnext() returns 1 */ 26 } ; 27 28 #define CDB_ZERO { .map = 0, .fd = -1, .size = 0, .loop = 0, .khash = 0, .kpos = 0, .hpos = 0, .hslots = 0, .dpos = 0, .dlen = 0 } 29 extern struct cdb const cdb_zero ; 30 31 extern void cdb_free (struct cdb *) ; 32 33 #define cdb_init(c, fd) (cdb_init_map(c, (fd), 1) ? 0 : -1) 34 extern int cdb_init_map (struct cdb *, int fd, int) ; 35 extern int cdb_mapfile (struct cdb *, char const *) ; 36 extern int cdb_read (struct cdb *, char *, unsigned int, uint32_t) ; 37 #define cdb_findstart(c) ((c)->loop = 0) 38 extern int cdb_findnext (struct cdb *, char const *, unsigned int) ; 39 #define cdb_find(c, s, len) (cdb_findstart(c), cdb_findnext(c, s, len)) 40 41 #define cdb_datapos(c) ((c)->dpos) 42 #define cdb_datalen(c) ((c)->dlen) 43 #define cdb_keypos(c) ((c)->kpos) 44 #define cdb_keylen(c) ((c)->dpos - (c)->kpos) 45 46 #define cdb_traverse_init(c, kpos) (*(kpos) = 2048) 47 #define cdb_firstkey(c, kpos) (cdb_traverse_init(c, kpos), cdb_nextkey(c, kpos)) 48 extern int cdb_nextkey (struct cdb *, uint32_t *) ; 49 extern int cdb_successor (struct cdb *, char const *, unsigned int) ; 50 51 #endif 52