|
|
1.1 ! root 1: #include "stdio.h" ! 2: #include "cbt.h" ! 3: ! 4: /* like btbuild, but random access */ ! 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: btadd 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 btadd\n", ! 38: rec.mlen); ! 39: abort(); ! 40: } ! 41: get(rec.mlen, rec.mdata); ! 42: (void)bwrite(bf, key, rec); ! 43: bfirst(bf); ! 44: if(bseek(bf, key) != FOUND) { ! 45: key.mdata[key.mlen] = 0; ! 46: fprintf(stderr, "vanished:%s:\n", key.mdata); ! 47: abort(); ! 48: } ! 49: if(cflag) ! 50: bcheck(bf); ! 51: } ! 52: } ! 53: get(n, s) ! 54: char *s; ! 55: { int m; ! 56: for(m = 0; n > 0; n -= m) { ! 57: m = read(0, s, n); ! 58: if(m == 0) { ! 59: bclose(bf); ! 60: exit(0); ! 61: } ! 62: if(m < 0) { ! 63: fprintf(stderr, "io error in btadd\n"); ! 64: abort(); ! 65: } ! 66: s += m; ! 67: } ! 68: } ! 69: ! 70: mbuf new, old; ! 71: char newbuf[NDSZ], oldbuf[NDSZ]; ! 72: bcheck(bf) ! 73: bfile *bf; ! 74: { long i; ! 75: int j, k; ! 76: char *p; ! 77: bfirst(bf); ! 78: new.mdata = newbuf; ! 79: old.mdata = oldbuf; ! 80: for(i = 0;; i++) { ! 81: if(bread(bf, &new, (mbuf *)NULL) == EOF) ! 82: break; ! 83: if(i > 0) { ! 84: k = new.mlen; ! 85: if(old.mlen < new.mlen) ! 86: k = old.mlen; ! 87: for(j = 0; j < k; j++) ! 88: if(new.mdata[j] != old.mdata[j]) ! 89: break; ! 90: if(j != k) { ! 91: if(new.mdata[j] > old.mdata[j]) ! 92: continue; ! 93: bad: ! 94: fprintf(stderr, "disorder at key %ld\n", i); ! 95: key.mdata[key.mlen] = 0; ! 96: fprintf(stderr, "key is:%s:\n", key.mdata); ! 97: abort(); ! 98: } ! 99: if(old.mlen >= new.mlen) ! 100: goto bad; ! 101: } ! 102: p = old.mdata; ! 103: old = new; ! 104: new.mdata = p; ! 105: } ! 106: } ! 107: static struct D { struct D *a; char *b;} VER = {&VER,"\n81/8/25:btadd.c\n"}; ! 108: /*1100001100101101*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.