1/* 2 * sdbm - ndbm work-alike hashed database library 3 * based on Per-Ake Larson's Dynamic Hashing algorithms. BIT 18 (1978). 4 * author: oz@nexus.yorku.ca 5 * status: public domain. 6 */ 7 8#ifndef VISUAL_CC 9 #include <unistd.h> 10#endif 11#define DBLKSIZ 4096 12#define PBLKSIZ 1024 13#define PAIRMAX 1008 /* arbitrary on PBLKSIZ-N */ 14#define SPLTMAX 10 /* maximum allowed splits */ 15 /* for a single insertion */ 16#define DIRFEXT ".dir" 17#define PAGFEXT ".pag" 18 19typedef struct { 20 int dirf; /* directory file descriptor */ 21 int pagf; /* page file descriptor */ 22 int flags; /* status/error flags, see below */ 23 long maxbno; /* size of dirfile in bits */ 24 long curbit; /* current bit number */ 25 long hmask; /* current hash mask */ 26 long blkptr; /* current block for nextkey */ 27 int keyptr; /* current key for nextkey */ 28 long blkno; /* current page to read/write */ 29 long pagbno; /* current page in pagbuf */ 30 char pagbuf[PBLKSIZ]; /* page file block buffer */ 31 long dirbno; /* current block in dirbuf */ 32 char dirbuf[DBLKSIZ]; /* directory file block buffer */ 33} DBM; 34 35#define SDBM_RDONLY 0x1 /* data base open read-only */ 36#define SDBM_IOERR 0x2 /* data base I/O error */ 37 38/* 39 * utility macros 40 */ 41#define sdbm_rdonly(db) ((db)->flags & SDBM_RDONLY) 42#define sdbm_error(db) ((db)->flags & SDBM_IOERR) 43 44#define sdbm_clearerr(db) ((db)->flags &= ~SDBM_IOERR) /* ouch */ 45 46#define sdbm_dirfno(db) ((db)->dirf) 47#define sdbm_pagfno(db) ((db)->pagf) 48 49#ifdef VISUAL_CC 50typedef struct { 51 char *dptr; 52 int dsize; 53} datum; 54#else 55typedef struct { 56 char *dptr; 57 size_t dsize; 58} datum; 59#endif 60 61 62extern datum nullitem; 63 64#ifdef __STDC__ 65#define proto(p) p 66#else 67#define proto(p) () 68#endif 69 70/* 71 * flags to sdbm_store 72 */ 73#define SDBM_INSERT 0 74#define SDBM_REPLACE 1 75 76/* 77 * ndbm interface 78 */ 79extern DBM *sdbm_open proto((char *, int, int)); 80extern void sdbm_close proto((DBM *)); 81extern datum sdbm_fetch proto((DBM *, datum)); 82extern int sdbm_delete proto((DBM *, datum)); 83extern int sdbm_store proto((DBM *, datum, datum, int)); 84extern datum sdbm_firstkey proto((DBM *)); 85extern datum sdbm_nextkey proto((DBM *)); 86 87/* 88 * other 89 */ 90 91extern DBM *sdbm_prep proto((char *, char *, int, int)); 92#ifdef VISUAL_CC 93extern long sdbm_hash proto((char *, int)); 94#else 95extern long sdbm_hash proto((char *, size_t)); 96#endif 97