27 #define SEEK_SET L_SET
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))
79 #include <sys/types.h>
108 #if !defined(__sun) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(errno)
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
132 000000000000L, 000000000001L, 000000000003L,
133 000000000007L, 000000000017L, 000000000037L,
134 000000000077L, 000000000177L, 000000000377L,
135 000000000777L, 000000001777L, 000000003777L,
136 000000007777L, 000000017777L, 000000037777L,
137 000000077777L, 000000177777L, 000000377777L,
138 000000777777L, 000001777777L, 000003777777L,
139 000007777777L, 000017777777L, 000037777777L,
140 000077777777L, 000177777777L, 000377777777L,
141 000777777777L, 001777777777L, 003777777777L,
142 007777777777L, 017777777777L
151 register char *dirname;
152 register char *pagname;
155 if (file ==
NULL || !*file)
156 return errno = EINVAL, (
DBM *)
NULL;
163 return errno = ENOMEM, (
DBM *)
NULL;
169 pagname = strcat(pagname,
PAGFEXT);
171 db =
sdbm_prep(dirname, pagname, flags, mode);
172 free((
char *) dirname);
182 flags =
fcntl(fd, F_GETFD);
187 if (!(flags & FD_CLOEXEC)) {
189 ret =
fcntl(fd, F_SETFD, flags);
206 return errno = ENOMEM, (
DBM *)
NULL;
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;
234 if ((db->
dirf = open(dirname, flags, mode)) == -1)
goto err;
244 db->
dirbno = (!dstat.st_size) ? 0 : -1;
292 return errno = EINVAL, -1;
294 return errno =
EPERM, -1;
304 return ioerr(db), -1;
309 return ioerr(db), -1;
319 return errno = EINVAL, -1;
321 return errno =
EPERM, -1;
327 if (need < 0 || need >
PAIRMAX)
328 return errno = EINVAL, -1;
346 return ioerr(db), -1;
355 return ioerr(db), -1;
362 return ioerr(db), -1;
375 #if defined _WIN32 && !defined __CYGWIN__
392 debug((
"newp: %ld\n", newp));
402 #if defined _WIN32 && !defined __CYGWIN__
409 while (
OFF_PAG(newp) > oldtail) {
419 if (hash & (db->
hmask + 1)) {
444 ((hash & (db->
hmask + 1)) ? 2 : 1);
457 (
void) (write(2,
"sdbm: cannot insert after SPLTMAX attempts.\n", 44) < 0);
506 while (dbit < db->maxbno &&
getdbit(db, dbit))
507 dbit = 2 * dbit + ((hash & ((long) 1 << hbit++)) ? 2 : 1);
509 debug((
"dbit: %d...", dbit));
512 db->
hmask = masks[hbit];
514 pagb = hash & db->
hmask;
534 debug((
"pag read: %d\n", pagb));
554 debug((
"dir read: %d\n", dirb));
575 debug((
"dir read: %d\n", dirb));
638 #define exhash(item) sdbm_hash((item).dptr, (item).dsize)
671 register short *ino = (
short *) pag;
674 free = off - (n + 1) * (
int)
sizeof(short);
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;
733 register short *ino = (
short *) pag;
744 register short *ino = (
short *) pag;
763 register short *ino = (
short *) pag;
781 register ptrdiff_t zoo = dst -
src;
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;
833 register short *ino = (
short *) pag;
835 for (i = 1; i <
n; i += 2) {
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;
static int makroom(register DBM *db, long int hash, int need)
long sdbm_hash(register char *str, register int len)
size_t strlen(const char *)
static datum getnext(register DBM *db)
RUBY_EXTERN void * memmove(void *, const void *, size_t)
static int chkpage(char *pag)
static int duppair(char *pag, datum key)
static datum getpair(char *pag, datum key)
static int getpage(register DBM *db, register long int hash)
void sdbm_close(register DBM *db)
memset(y->frac+ix+1, 0,(y->Prec-(ix+1))*sizeof(BDIGIT))
DBM * sdbm_open(register char *file, register int flags, register int mode)
static int seepair(char *pag, register int n, register char *key, register int siz)
datum sdbm_firstkey(register DBM *db)
DBM * sdbm_prep(char *dirname, char *pagname, int flags, int mode)
static void putpair(char *pag, datum key, datum val)
int memcmp(const void *s1, const void *s2, size_t len)
static int fitpair(char *pag, int need)
static int delpair(char *pag, datum key)
#define PUT_SHORT(p, i, s)
static int getdbit(register DBM *db, register long int dbit)
int sdbm_store(register DBM *db, datum key, datum val, int flags)
static void splpage(char *pag, char *new, long int sbit)
datum sdbm_nextkey(register DBM *db)
static datum getnkey(char *pag, int num)
int sdbm_delete(register DBM *db, datum key)
datum sdbm_fetch(register DBM *db, datum key)
static int setdbit(register DBM *db, register long int dbit)
static int fd_set_cloexec(int fd)