Changeset 3dd3ff in git
- Timestamp:
- Dec 18, 2007, 10:53:26 AM (16 years ago)
- Branches:
- (u'spielwiese', 'fe61d9c35bf7c61f2b6cbf1b56e25e2f08d536cc')
- Children:
- e370800a0a8b1c4cd76b09ae41b60d567914849f
- Parents:
- df1a7e121deb1550a93745377f0fdfc3addcea24
- File:
-
- 1 edited
Legend:
- Unmodified
- Added
- Removed
-
Singular/ndbm.cc
rdf1a7e r3dd3ff 5 5 //**************************************************************************/ 6 6 // 7 // $Id: ndbm.cc,v 1.1 6 2005-07-27 09:59:27Singular Exp $7 // $Id: ndbm.cc,v 1.17 2007-12-18 09:53:26 Singular Exp $ 8 8 // 9 9 //**************************************************************************/ … … 66 66 extern int errno; 67 67 68 DBM * 69 dbm_open(char *file, int flags, int mode) 68 DBM * dbm_open(char *file, int flags, int mode) 70 69 { 71 70 struct stat statb; 72 71 register DBM *db; 73 72 74 if ((db = (DBM *)malloc(sizeof *db)) == 0) { 73 if ((db = (DBM *)malloc(sizeof *db)) == 0) 74 { 75 75 errno = ENOMEM; 76 76 return ((DBM *)0); … … 104 104 } 105 105 106 void 107 dbm_close(DBM *db) 106 void dbm_close(DBM *db) 108 107 { 109 108 (void) close(db->dbm_dirf); … … 112 111 } 113 112 114 long 115 dbm_forder(register DBM *db, datum key) 113 long dbm_forder(register DBM *db, datum key) 116 114 { 117 115 long hash; 118 116 119 117 hash = dcalchash(key); 120 for (db->dbm_hmask=0;; db->dbm_hmask=(db->dbm_hmask<<1)+1) { 118 for (db->dbm_hmask=0;; db->dbm_hmask=(db->dbm_hmask<<1)+1) 119 { 121 120 db->dbm_blkno = hash & db->dbm_hmask; 122 121 db->dbm_bitno = db->dbm_blkno + db->dbm_hmask; … … 127 126 } 128 127 129 datum 130 dbm_fetch(register DBM *db, datum key) 128 datum dbm_fetch(register DBM *db, datum key) 131 129 { 132 130 register int i; … … 136 134 goto err; 137 135 dbm_access(db, dcalchash(key)); 138 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) { 136 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) 137 { 139 138 item = makdatum(db->dbm_pagbuf, i+1); 140 139 if (item.dptr != NULL) … … 154 153 if (dbm_error(db)) 155 154 return (-1); 156 if (dbm_rdonly(db)) { 155 if (dbm_rdonly(db)) 156 { 157 157 errno = EPERM; 158 158 return (-1); … … 165 165 db->dbm_pagbno = db->dbm_blkno; 166 166 (void) lseek(db->dbm_pagf, db->dbm_blkno*PBLKSIZ, L_SET); 167 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) { 167 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) 168 { 168 169 err: 169 170 db->dbm_flags |= _DBM_IOERR; … … 182 183 if (dbm_error(db)) 183 184 return (-1); 184 if (dbm_rdonly(db)) { 185 if (dbm_rdonly(db)) 186 { 185 187 errno = EPERM; 186 188 return (-1); … … 188 190 loop: 189 191 dbm_access(db, dcalchash(key)); 190 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) { 192 if ((i = finddatum(db->dbm_pagbuf, key)) >= 0) 193 { 191 194 if (!replace) 192 195 return (1); 193 if (!delitem(db->dbm_pagbuf, i)) { 196 if (!delitem(db->dbm_pagbuf, i)) 197 { 194 198 db->dbm_flags |= _DBM_IOERR; 195 199 return (-1); … … 200 204 db->dbm_pagbno = db->dbm_blkno; 201 205 (void) lseek(db->dbm_pagf, db->dbm_blkno*PBLKSIZ, L_SET); 202 if ( (ret=write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ)) != PBLKSIZ) { 206 if ( (ret=write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ)) != PBLKSIZ) 207 { 203 208 db->dbm_flags |= _DBM_IOERR; 204 209 return (-1); … … 207 212 208 213 split: 209 if (key.dsize+dat.dsize+3*sizeof(short) >= PBLKSIZ) { 214 if (key.dsize+dat.dsize+3*sizeof(short) >= PBLKSIZ) 215 { 210 216 db->dbm_flags |= _DBM_IOERR; 211 217 errno = ENOSPC; … … 217 223 if (item.dptr == NULL) 218 224 break; 219 if (dcalchash(item) & (db->dbm_hmask+1)) { 225 if (dcalchash(item) & (db->dbm_hmask+1)) 226 { 220 227 item1 = makdatum(db->dbm_pagbuf, i+1); 221 228 if (item1.dptr == NULL) { … … 225 232 } 226 233 if (!additem(ovfbuf, item, item1) || 227 !delitem(db->dbm_pagbuf, i)) { 234 !delitem(db->dbm_pagbuf, i)) 235 { 228 236 db->dbm_flags |= _DBM_IOERR; 229 237 return (-1); … … 235 243 db->dbm_pagbno = db->dbm_blkno; 236 244 (void) lseek(db->dbm_pagf, db->dbm_blkno*PBLKSIZ, L_SET); 237 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) { 245 if (write(db->dbm_pagf, db->dbm_pagbuf, PBLKSIZ) != PBLKSIZ) 246 { 238 247 db->dbm_flags |= _DBM_IOERR; 239 248 return (-1); 240 249 } 241 250 (void) lseek(db->dbm_pagf, (db->dbm_blkno+db->dbm_hmask+1)*PBLKSIZ, L_SET); 242 if (write(db->dbm_pagf, ovfbuf, PBLKSIZ) != PBLKSIZ) { 251 if (write(db->dbm_pagf, ovfbuf, PBLKSIZ) != PBLKSIZ) 252 { 243 253 db->dbm_flags |= _DBM_IOERR; 244 254 return (-1); … … 248 258 } 249 259 250 datum 251 dbm_firstkey(DBM *db) 260 datum dbm_firstkey(DBM *db) 252 261 { 253 262 … … 257 266 } 258 267 259 datum 260 dbm_nextkey(register DBM *db) 268 datum dbm_nextkey(register DBM *db) 261 269 { 262 270 struct stat statb; … … 266 274 goto err; 267 275 statb.st_size /= PBLKSIZ; 268 for (;;) { 269 if (db->dbm_blkptr != db->dbm_pagbno) { 276 for (;;) 277 { 278 if (db->dbm_blkptr != db->dbm_pagbno) 279 { 270 280 db->dbm_pagbno = db->dbm_blkptr; 271 281 (void) lseek(db->dbm_pagf, db->dbm_blkptr*PBLKSIZ, L_SET); … … 277 287 #endif 278 288 } 279 if (((short *)db->dbm_pagbuf)[0] != 0) { 289 if (((short *)db->dbm_pagbuf)[0] != 0) 290 { 280 291 item = makdatum(db->dbm_pagbuf, db->dbm_keyptr); 281 if (item.dptr != NULL) { 292 if (item.dptr != NULL) 293 { 282 294 db->dbm_keyptr += 2; 283 295 return (item); … … 294 306 } 295 307 296 static void 297 dbm_access(register DBM *db, long hash) 298 { 299 for (db->dbm_hmask=0;; db->dbm_hmask=(db->dbm_hmask<<1)+1){308 static void dbm_access(register DBM *db, long hash) 309 { 310 for (db->dbm_hmask=0;; db->dbm_hmask=(db->dbm_hmask<<1)+1) 311 { 300 312 db->dbm_blkno = hash & db->dbm_hmask; 301 313 db->dbm_bitno = db->dbm_blkno + db->dbm_hmask; … … 303 315 break; 304 316 } 305 if (db->dbm_blkno != db->dbm_pagbno) { 317 if (db->dbm_blkno != db->dbm_pagbno) 318 { 306 319 db->dbm_pagbno = db->dbm_blkno; 307 320 (void) lseek(db->dbm_pagf, db->dbm_blkno*PBLKSIZ, L_SET); … … 315 328 } 316 329 317 static 318 int getbit(register DBM *db) 330 static int getbit(register DBM *db) 319 331 { 320 332 long bn; … … 328 340 i = bn % DBLKSIZ; 329 341 b = bn / DBLKSIZ; 330 if (b != db->dbm_dirbno) { 342 if (b != db->dbm_dirbno) 343 { 331 344 db->dbm_dirbno = b; 332 345 (void) lseek(db->dbm_dirf, (long)b*DBLKSIZ, L_SET); … … 337 350 } 338 351 339 static void 340 setbit(register DBM *db) 352 static void setbit(register DBM *db) 341 353 { 342 354 long bn; … … 349 361 i = bn % DBLKSIZ; 350 362 b = bn / DBLKSIZ; 351 if (b != db->dbm_dirbno) { 363 if (b != db->dbm_dirbno) 364 { 352 365 db->dbm_dirbno = b; 353 366 (void) lseek(db->dbm_dirf, (long)b*DBLKSIZ, L_SET); … … 362 375 } 363 376 364 static datum 365 makdatum(char buf[PBLKSIZ], int n) 377 static datum makdatum(char buf[PBLKSIZ], int n) 366 378 { 367 379 register short *sp; … … 384 396 } 385 397 386 static 387 int finddatum(char buf[PBLKSIZ], datum item) 398 static int finddatum(char buf[PBLKSIZ], datum item) 388 399 { 389 400 register short *sp; … … 392 403 sp = (short *)buf; 393 404 n = PBLKSIZ; 394 for (i=0, j=sp[0]; i<j; i+=2, n = sp[i]) { 405 for (i=0, j=sp[0]; i<j; i+=2, n = sp[i]) 406 { 395 407 n -= sp[i+1]; 396 408 if (n != item.dsize) … … 432 444 }; 433 445 434 static long 435 hashinc(register DBM *db, long hash) 446 static long hashinc(register DBM *db, long hash) 436 447 { 437 448 long bit; … … 439 450 hash &= db->dbm_hmask; 440 451 bit = db->dbm_hmask+1; 441 for (;;) { 452 for (;;) 453 { 442 454 bit >>= 1; 443 455 if (bit == 0) … … 449 461 } 450 462 451 static long 452 dcalchash(datum item) 463 static long dcalchash(datum item) 453 464 { 454 465 register int s, c, j; … … 459 470 hashl = 0; 460 471 hashi = 0; 461 for (cp = item.dptr, s=item.dsize; --s >= 0; ) { 472 for (cp = item.dptr, s=item.dsize; --s >= 0; ) 473 { 462 474 c = *cp++; 463 for (j=0; j<BYTESIZ; j+=4) { 475 for (j=0; j<BYTESIZ; j+=4) 476 { 464 477 hashi += hitab[c&017]; 465 478 hashl += hltab[hashi&63]; … … 473 486 * Delete pairs of items (n & n+1). 474 487 */ 475 static 476 int delitem(char buf[PBLKSIZ], int n) 488 static int delitem(char buf[PBLKSIZ], int n) 477 489 { 478 490 register short *sp, *sp1; … … 492 504 i1 = sp[n]; 493 505 i1 -= sp[n+2]; 494 if (i1 > 0) { 506 if (i1 > 0) 507 { 495 508 i2 = sp[i2]; 496 509 bcopy(&buf[i2], &buf[i2 + i1], sp[n+2] - i2); … … 505 518 * Add pairs of items (item & item1). 506 519 */ 507 static 508 int additem(char buf[PBLKSIZ], datum item, datum item1) 520 static int additem(char buf[PBLKSIZ], datum item, datum item1) 509 521 { 510 522 register short *sp; … … 528 540 529 541 #ifdef DEBUG 530 static 531 chkblk(char buf[PBLKSIZ]) 542 static chkblk(char buf[PBLKSIZ]) 532 543 { 533 544 register short *sp; … … 536 547 sp = (short *)buf; 537 548 t = PBLKSIZ; 538 for (i=0; i<sp[0]; i++) { 549 for (i=0; i<sp[0]; i++) 550 { 539 551 if (sp[i+1] > t) 540 552 return (-1);
Note: See TracChangeset
for help on using the changeset viewer.