static char sccsid
[] = "@(#)ndbm.c 4.2 (Berkeley) %G%";
static datum
firsthash();
ndbmopen(file
, flags
, mode
)
if ((db
= (DBM
*)malloc(sizeof *db
)) == 0) {
if ((flags
& 03) == O_WRONLY
)
flags
= (flags
& ~03) | O_RDWR
;
strcpy(db
->db_pagbuf
, file
);
strcat(db
->db_pagbuf
, ".pag");
db
->db_pagf
= open(db
->db_pagbuf
, flags
, mode
);
strcpy(db
->db_pagbuf
, file
);
strcat(db
->db_pagbuf
, ".dir");
db
->db_dirf
= open(db
->db_pagbuf
, flags
, mode
);
fstat(db
->db_dirf
, &statb
);
db
->db_maxbno
= statb
.st_size
*BYTESIZ
-1;
db
->db_pagbno
= db
->db_dirbno
= -1;
(void) close(db
->db_pagf
);
(void) close(db
->db_dirf
);
(void) close(db
->db_pagf
);
for (db
->db_hmask
=0;; db
->db_hmask
=(db
->db_hmask
<<1)+1) {
db
->db_blkno
= hash
& db
->db_hmask
;
db
->db_bitno
= db
->db_blkno
+ db
->db_hmask
;
dbm_access(db
, dcalchash(key
));
item
= makdatum(db
->db_pagbuf
, i
);
if (cmpdatum(key
, item
) == 0) {
item
= makdatum(db
->db_pagbuf
, i
+1);
printf("items not in pairs\n");
dbm_access(db
, dcalchash(key
));
item
= makdatum(db
->db_pagbuf
, i
);
if (cmpdatum(key
, item
) == 0) {
delitem(db
->db_pagbuf
, i
);
delitem(db
->db_pagbuf
, i
);
(void) lseek(db
->db_pagf
, db
->db_blkno
*PBLKSIZ
, L_SET
);
(void) write(db
->db_pagf
, db
->db_pagbuf
, PBLKSIZ
);
db
->db_pagbno
= db
->db_blkno
;
dbmstore(db
, key
, dat
, replace
)
dbm_access(db
, dcalchash(key
));
item
= makdatum(db
->db_pagbuf
, i
);
if (cmpdatum(key
, item
) == 0) {
delitem(db
->db_pagbuf
, i
);
delitem(db
->db_pagbuf
, i
);
i
= additem(db
->db_pagbuf
, key
);
if (additem(db
->db_pagbuf
, dat
) < 0) {
delitem(db
->db_pagbuf
, i
);
(void) lseek(db
->db_pagf
, db
->db_blkno
*PBLKSIZ
, L_SET
);
(void) write(db
->db_pagf
, db
->db_pagbuf
, PBLKSIZ
);
db
->db_pagbno
= db
->db_blkno
;
if (key
.dsize
+dat
.dsize
+2*sizeof(short) >= PBLKSIZ
) {
item
= makdatum(db
->db_pagbuf
, i
);
if (dcalchash(item
) & (db
->db_hmask
+1)) {
delitem(db
->db_pagbuf
, i
);
item
= makdatum(db
->db_pagbuf
, i
);
printf("ndbm: split not paired\n");
delitem(db
->db_pagbuf
, i
);
(void) lseek(db
->db_pagf
, db
->db_blkno
*PBLKSIZ
, L_SET
);
(void) write(db
->db_pagf
, db
->db_pagbuf
, PBLKSIZ
);
db
->db_pagbno
= db
->db_blkno
;
(void) lseek(db
->db_pagf
, (db
->db_blkno
+db
->db_hmask
+1)*PBLKSIZ
, L_SET
);
(void) write(db
->db_pagf
, ovfbuf
, PBLKSIZ
);
return (firsthash(db
, 0L));
item
= makdatum(db
->db_pagbuf
, i
);
if (cmpdatum(key
, item
) <= 0)
if (f
|| cmpdatum(bitem
, item
) < 0) {
hash
= hashinc(db
, hash
);
return (firsthash(db
, hash
));
bitem
= makdatum(db
->db_pagbuf
, 0);
item
= makdatum(db
->db_pagbuf
, i
);
if (cmpdatum(bitem
, item
) < 0)
hash
= hashinc(db
, hash
);
for (db
->db_hmask
=0;; db
->db_hmask
=(db
->db_hmask
<<1)+1) {
db
->db_blkno
= hash
& db
->db_hmask
;
db
->db_bitno
= db
->db_blkno
+ db
->db_hmask
;
if (db
->db_blkno
!= db
->db_pagbno
) {
bzero(db
->db_pagbuf
, PBLKSIZ
);
(void) lseek(db
->db_pagf
, db
->db_blkno
*PBLKSIZ
, L_SET
);
(void) read(db
->db_pagf
, db
->db_pagbuf
, PBLKSIZ
);
db
->db_pagbno
= db
->db_blkno
;
if (db
->db_bitno
> db
->db_maxbno
)
n
= db
->db_bitno
% BYTESIZ
;
bn
= db
->db_bitno
/ BYTESIZ
;
if (b
!= db
->db_dirbno
) {
bzero(db
->db_dirbuf
, DBLKSIZ
);
(void) lseek(db
->db_dirf
, (long)b
*DBLKSIZ
, L_SET
);
(void) read(db
->db_dirf
, db
->db_dirbuf
, DBLKSIZ
);
if (db
->db_dirbuf
[i
] & (1<<n
))
if (db
->db_bitno
> db
->db_maxbno
) {
db
->db_maxbno
= db
->db_bitno
;
n
= db
->db_bitno
% BYTESIZ
;
bn
= db
->db_bitno
/ BYTESIZ
;
db
->db_dirbuf
[i
] |= 1<<n
;
(void) lseek(db
->db_dirf
, (long)b
*DBLKSIZ
, L_SET
);
(void) write(db
->db_dirf
, db
->db_dirbuf
, DBLKSIZ
);
item
.dsize
= t
- sp
[n
+1];
055,043,036,054,063,014,004,005,
010,064,077,000,035,027,025,071,
= { 61, 57, 53, 49, 45, 41, 37, 33,
29, 25, 21, 17, 13, 9, 5, 1,
06100151277L,06106161736L,06452611562L,05001724107L,
02614772546L,04120731531L,04665262210L,07347467531L,
06735253126L,06042345173L,03072226605L,01464164730L,
03247435524L,07652510057L,01546775256L,05714532133L,
06173260402L,07517101630L,02431460343L,01743245566L,
00261675137L,02433103631L,03421772437L,04447707466L,
04435620103L,03757017115L,03641531772L,06767633246L,
02673230344L,00260612216L,04133454451L,00615531516L,
06137717526L,02574116560L,02304023373L,07061702261L,
05153031405L,05322056705L,07401116734L,06552375715L,
06165233473L,05311063631L,01212221723L,01052267235L,
06000615237L,01075222665L,06330216006L,04402355630L,
01451177262L,02000133436L,06025467062L,07121076461L,
03123433522L,01010635225L,01716177066L,05161746527L,
01736635071L,06243505026L,03637211610L,01756474365L,
04723077174L,03642763134L,05750130273L,03655541561L,
for (i
=0; i
<item
.dsize
; i
++) {
for (j
=0; j
<BYTESIZ
; j
+=4) {
hashl
+= hltab
[hashi
&63];
for (i1
=n
+1; i1
<sp
[0]; i1
++)
sp
[i1
+1-1] = sp
[i1
+1] + i2
;
printf("ndbm: bad delitem\n");
i2
= (sp
[0]+2) * sizeof(short);
for (i2
=0; i2
<item
.dsize
; i2
++) {
for (i
=0; i
<sp
[0]; i
++) {
if (t
< (sp
[0]+1)*sizeof(short))
printf("ndbm: bad block\n");