Ruby
2.7.0p0(2019-12-25revision647ee6f091eafcce70ffb75ddf7e121e192ab217)
|
Go to the documentation of this file.
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))
63 static int fitpair
proto((
char *,
int));
67 static int chkpage
proto((
char *));
69 static void splpage
proto((
char *,
char *,
long));
79 #include <sys/types.h>
108 #if !defined(__sun) && !defined(_WIN32) && !defined(__CYGWIN__) && !defined(errno)
115 static int getdbit
proto((
DBM *,
long));
116 static int setdbit
proto((
DBM *,
long));
117 static int getpage
proto((
DBM *,
long));
119 static 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
131 static 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
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)
171 db =
sdbm_prep(dirname, pagname, flags, mode);
172 free((
char *) dirname);
177 fd_set_cloexec(
int fd)
200 sdbm_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;
371 makroom(
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);
498 getpage(
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));
540 getdbit(
register DBM *db,
register long int dbit)
554 debug((
"dir read: %ld\n", dirb));
561 setdbit(
register DBM *db,
register long int dbit)
575 debug((
"dir read: %ld\n", dirb));
595 getnext(
register DBM *db)
616 if (!chkpage(db->
pagbuf)) {
638 #define exhash(item) sdbm_hash((item).dptr, (item).dsize)
643 static int seepair
proto((
char *,
int,
char *,
int));
666 fitpair(
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;
740 getnkey(
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;
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) {
845 splpage(
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) + 65587
L *
n;
int sdbm_delete(register DBM *db, datum key)
DBM * sdbm_open(register char *file, register int flags, register int mode)
long sdbm_hash(register char *str, register int len)
size_t strlen(const char *)
void sdbm_close(register DBM *db)
#define PUT_SHORT(p, i, s)
datum sdbm_nextkey(register DBM *db)
int memcmp(const void *s1, const void *s2, size_t len)
DBM * sdbm_prep(char *dirname, char *pagname, int flags, int mode)
char str[HTML_ESCAPE_MAX_LEN+1]
datum sdbm_firstkey(register DBM *db)
datum sdbm_fetch(register DBM *db, datum key)
int sdbm_store(register DBM *db, datum key, datum val, int flags)