|
|
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.