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 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, 017777777777L
148 sdbm_open(
register char *file,
register int flags,
register int mode)
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;
167 dirname = strcat(strcpy(dirname, file),
DIRFEXT);
168 pagname = strcpy(dirname +
strlen(dirname) + 1, file);
169 pagname = strcat(pagname,
PAGFEXT);
171 db =
sdbm_prep(dirname, pagname, flags, mode);
172 free((
char *) dirname);
200 sdbm_prep(
char *dirname,
char *pagname,
int flags,
int mode)
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;
257 (void) close(db->
pagf);
259 (void) close(db->
dirf);
270 (void) close(db->
dirf);
271 (void) close(db->
pagf);
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;
392 debug((
"newp: %ld\n", newp));
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: %ld...", dbit));
512 db->
hmask = masks[hbit];
514 pagb = hash & db->
hmask;
534 debug((
"pag read: %ld\n", pagb));
554 debug((
"dir read: %ld\n", dirb));
575 debug((
"dir read: %ld\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;
780 register char *src = pag +
GET_SHORT(ino,i + 1);
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;
829 seepair(
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) {
853 register short *ino = (
short *) cur;
856 (void) memset(pag, 0,
PBLKSIZ);
857 (void) memset(
new, 0,
PBLKSIZ);
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)
static unsigned int hash(str, len) register const char *str
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)
RUBY_EXTERN void * memmove(void *, const void *, size_t)
void sdbm_close(register DBM *db)
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)
register unsigned int len
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 int fitpair proto((char *, int))
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)