|
|
1.1 ! root 1: #include "stdio.h" ! 2: #include "cbt.h" ! 3: ! 4: /* read keys from stdin, and delete the records from argv[1] */ ! 5: char keybuf[NDSZ]; ! 6: char recbuf[32767]; ! 7: mbuf key = { keybuf, 0}; ! 8: mbuf rec = { recbuf, 0}; ! 9: bfile *bf; ! 10: int cflag; ! 11: ! 12: main(argc, argv) ! 13: char **argv; ! 14: { int n; ! 15: if(argv[1][0] == '-') { ! 16: cflag++; ! 17: argc--; ! 18: argv++; ! 19: } ! 20: if(argc != 2) { ! 21: fprintf(stderr, "usage: btdelete bfile < recs\n"); ! 22: exit(1); ! 23: } ! 24: if((bf = bopen(argv[1], 2)) == NULL) { ! 25: perror(argv[1]); ! 26: exit(1); ! 27: } ! 28: for(;;) { ! 29: get(2, (char *)&key.mlen); ! 30: if(key.mlen > MAXKLEN) { ! 31: fprintf(stderr, "key too long\n"); ! 32: exit(1); ! 33: } ! 34: get(key.mlen, key.mdata); ! 35: get(2, (char *)&rec.mlen); ! 36: if(rec.mlen > sizeof(recbuf)) { ! 37: fprintf(stderr, "rec len %ud: recompile btdelete\n", ! 38: rec.mlen); ! 39: abort(); ! 40: } ! 41: get(rec.mlen, rec.mdata); ! 42: (void)bdelete(bf, key); ! 43: if(cflag) ! 44: bcheck(bf); ! 45: } ! 46: } ! 47: get(n, s) ! 48: char *s; ! 49: { int m; ! 50: for(m = 0; n > 0; n -= m) { ! 51: m = read(0, s, n); ! 52: if(m == 0) { ! 53: bclose(bf); ! 54: exit(0); ! 55: } ! 56: if(m < 0) { ! 57: fprintf(stderr, "io error in btdelete\n"); ! 58: abort(); ! 59: } ! 60: s += m; ! 61: } ! 62: } ! 63: ! 64: mbuf new, old; ! 65: char newbuf[NDSZ], oldbuf[NDSZ]; ! 66: bcheck(bf) ! 67: bfile *bf; ! 68: { long i; ! 69: int j, k; ! 70: char *p; ! 71: bfirst(bf); ! 72: new.mdata = newbuf; ! 73: old.mdata = oldbuf; ! 74: for(i = 0;; i++) { ! 75: if(bread(bf, &new, (mbuf *)NULL) == EOF) ! 76: break; ! 77: if(i > 0) { ! 78: k = new.mlen; ! 79: if(old.mlen < new.mlen) ! 80: k = old.mlen; ! 81: for(j = 0; j < k; j++) ! 82: if(new.mdata[j] != old.mdata[j]) ! 83: break; ! 84: if(j != k) { ! 85: if(new.mdata[j] > old.mdata[j]) ! 86: continue; ! 87: bad: ! 88: fprintf(stderr, "disorder at key %ld\n", i); ! 89: key.mdata[key.mlen] = 0; ! 90: fprintf(stderr, "key is:%s:\n", key.mdata); ! 91: abort(); ! 92: } ! 93: if(old.mlen >= new.mlen) ! 94: goto bad; ! 95: } ! 96: p = old.mdata; ! 97: old = new; ! 98: new.mdata = p; ! 99: } ! 100: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.