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