28#define memset(s,c,n) bzero((s), (n))
29#define memcpy(s1,s2,n) bcopy((s2), (s1), (n))
30#define memcmp(s1,s2,n) bcmp((s1),(s2),(n))
49#define debug(x) printf x
55#define GET_SHORT(p, i) (((unsigned)((unsigned char *)(p))[(i)*2] << 8) + (((unsigned char *)(p))[(i)*2 + 1]))
56#define PUT_SHORT(p, i, s) (((unsigned char *)(p))[(i)*2] = (unsigned char)((s) >> 8), ((unsigned char *)(p))[(i)*2 + 1] = (unsigned char)(s))
58#define GET_SHORT(p, i) ((p)[(i)])
59#define PUT_SHORT(p, i, s) ((p)[(i)] = (s))
63static int fitpair
proto((
char *,
int));
67static int chkpage
proto((
char *));
69static void splpage
proto((
char *,
char *,
long));
108#if !defined(__sun) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(errno)
115static int getdbit
proto((
DBM *,
long));
116static int setdbit
proto((
DBM *,
long));
117static int getpage
proto((
DBM *,
long));
119static int makroom
proto((
DBM *,
long,
int));
124#define bad(x) ((x).dptr == NULL || (x).dsize < 0)
125#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
126#define ioerr(db) ((db)->flags |= DBM_IOERR)
128#define OFF_PAG(off) (long) (off) * PBLKSIZ
129#define OFF_DIR(off) (long) (off) * DBLKSIZ
131static long masks[] = {
132 000000000000
L, 000000000001
L, 000000000003
L,
133 000000000007
L, 000000000017
L, 000000000037
L,
134 000000000077
L, 000000000177
L, 000000000377
L,
135 000000000777
L, 000000001777
L, 000000003777
L,
136 000000007777
L, 000000017777
L, 000000037777
L,
137 000000077777
L, 000000177777
L, 000000377777
L,
138 000000777777
L, 000001777777
L, 000003777777
L,
139 000007777777
L, 000017777777
L, 000037777777
L,
140 000077777777
L, 000177777777
L, 000377777777
L,
141 000777777777
L, 001777777777
L, 003777777777
L,
142 007777777777
L, 017777777777
L
148sdbm_open(
register char *file,
register int flags,
register int mode)
151 register char *dirname;
152 register char *pagname;
155 if (file ==
NULL || !*file)
171 db =
sdbm_prep(dirname, pagname, flags, mode);
172 free((
char *) dirname);
177fd_set_cloexec(
int fd)
200sdbm_prep(
char *dirname,
char *pagname,
int flags,
int mode)
219 if (flags & O_WRONLY)
220 flags = (flags & ~O_WRONLY) | O_RDWR;
221 if (flags & O_RDONLY)
232 if ((db->
pagf = open(pagname, flags, mode)) == -1)
goto err;
233 if (fd_set_cloexec(db->
pagf) == -1)
goto err;
234 if ((db->
dirf = open(dirname, flags, mode)) == -1)
goto err;
235 if (fd_set_cloexec(db->
dirf) == -1)
goto err;
304 return ioerr(db), -1;
309 return ioerr(db), -1;
327 if (need < 0 || need >
PAIRMAX)
344 if (!fitpair(db->
pagbuf, need))
345 if (!makroom(db, hash, need))
346 return ioerr(db), -1;
355 return ioerr(db), -1;
362 return ioerr(db), -1;
371makroom(
register DBM *db,
long int hash,
int need)
392 debug((
"newp: %ld\n", newp));
409 while (
OFF_PAG(newp) > oldtail) {
419 if (hash & (db->
hmask + 1)) {
430 if (!setdbit(db, db->
curbit))
435 if (fitpair(pag, need))
444 ((hash & (db->
hmask + 1)) ? 2 : 1);
457 (
void) (
write(2,
"sdbm: cannot insert after SPLTMAX attempts.\n", 44) < 0);
498getpage(
register DBM *db,
register long int hash)
506 while (dbit < db->maxbno && getdbit(db, dbit))
507 dbit = 2 * dbit + ((hash & ((
long) 1 << hbit++)) ? 2 : 1);
509 debug((
"dbit: %ld...", dbit));
512 db->
hmask = masks[hbit];
514 pagb = hash & db->
hmask;
529 if (!chkpage(db->
pagbuf)) {
534 debug((
"pag read: %ld\n", pagb));
540getdbit(
register DBM *db,
register long int dbit)
554 debug((
"dir read: %ld\n", dirb));
561setdbit(
register DBM *db,
register long int dbit)
575 debug((
"dir read: %ld\n", dirb));
595getnext(
register DBM *db)
616 if (!chkpage(db->
pagbuf)) {
638#define exhash(item) sdbm_hash((item).dptr, (item).dsize)
643static int seepair
proto((
char *,
int,
char *,
int));
666fitpair(
char *pag,
int need)
671 register short *ino = (
short *) pag;
675 need += 2 * (
int)
sizeof(
short);
677 debug((
"free %d need %d\n",
free, need));
687 register short *ino = (
short *) pag;
716 register short *ino = (
short *) pag;
721 if ((
i = seepair(pag,
n,
key.dptr,
key.dsize)) == 0)
733 register short *ino = (
short *) pag;
740getnkey(
char *pag,
int num)
744 register short *ino = (
short *) pag;
763 register short *ino = (
short *) pag;
768 if ((
i = seepair(pag,
n,
key.dptr,
key.dsize)) == 0)
789#define MOVB *--dst = *--src
792 register int loop = (m + 8 - 1) >> 3;
794 switch (m & (8 - 1)) {
797 case 6: MOVB;
case 5: MOVB;
798 case 4: MOVB;
case 3: MOVB;
799 case 2: MOVB;
case 1: MOVB;
829seepair(
char *pag,
register int n,
register char *
key,
register int siz)
833 register short *ino = (
short *) pag;
835 for (
i = 1;
i <
n;
i += 2) {
845splpage(
char *pag,
char *
new,
long int sbit)
853 register short *ino = (
short *) cur;
860 for (ino++;
n > 0; ino += 2) {
874 debug((
"%d split %d/%d\n", ((
short *) cur)[0] / 2,
875 ((
short *)
new)[0] / 2,
876 ((
short *) pag)[0] / 2));
890 register short *ino = (
short *) pag;
897 for (ino++;
n > 0; ino += 2) {
928 register unsigned long n = 0;
932#define HASHC n = *str++ + 65599 * n
935 register int loop = (
len + 8 - 1) >> 3;
937 switch(
len & (8 - 1)) {
939 HASHC;
case 7: HASHC;
940 case 6: HASHC;
case 5: HASHC;
941 case 4: HASHC;
case 3: HASHC;
942 case 2: HASHC;
case 1: HASHC;
949 n = ((*
str++) & 255) + 65587L *
n;
DBM * sdbm_prep(char *dirname, char *pagname, int flags, int mode)
#define PUT_SHORT(p, i, s)
int sdbm_store(register DBM *db, datum key, datum val, int flags)
int sdbm_delete(register DBM *db, datum key)
void sdbm_close(register DBM *db)
datum sdbm_firstkey(register DBM *db)
DBM * sdbm_open(register char *file, register int flags, register int mode)
datum sdbm_nextkey(register DBM *db)
long sdbm_hash(register char *str, register int len)
datum sdbm_fetch(register DBM *db, datum key)
char str[HTML_ESCAPE_MAX_LEN+1]