|
|
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 rflag;
11:
12: main(argc, argv)
13: char **argv;
14: { int n;
15: if(argv[1][0] == '-') {
16: rflag++;
17: argc--;
18: argv++;
19: }
20: if(argc != 2) {
21: fprintf(stderr, "usage: btlook bfile < recs\n");
22: exit(1);
23: }
24: if((bf = bopen(argv[1], 0)) == NULL) {
25: perror(argv[1]);
26: exit(1);
27: }
28: for(;;) {
29: if(rflag)
30: getrkey();
31: else
32: getakey();
33: if(bseek(bf, key) != 1) {
34: fprintf(stderr, "not found:%s:\n",key.mdata);
35: continue;
36: }
37: if(bread(bf, 0, &rec) != 0) {
38: fprintf(stderr, "vanished:%s:\n", key.mdata);
39: abort();
40: }
41: if(rec.mlen >= sizeof(recbuf)) {
42: fprintf(stderr, "rec len %ud: recompile btlook\n",
43: rec.mlen);
44: abort();
45: }
46: rec.mdata[rec.mlen] = 0;
47: if(rflag) {
48: put(2, &key.mlen);
49: put(key.mlen, key.mdata);
50: put(2, &rec.mlen);
51: put(rec.mlen, rec.mdata);
52: } else
53: printf("%s %s\n", key.mdata, rec.mdata);
54: }
55: }
56:
57: get(n, s)
58: char *s;
59: { int m;
60: for(m = 0; n > 0; n -= m) {
61: m = read(0, s, n);
62: if(m == 0) {
63: bclose(bf);
64: exit(0);
65: }
66: if(m < 0) {
67: fprintf(stderr, "btlook: io error\n");
68: abort();
69: }
70: s += m;
71: }
72: }
73:
74: put(n, s)
75: char *s;
76: {
77: if(fwrite(s, 1, n, stdout) != n) {
78: fprintf(stderr, "btlook: io error\n");
79: abort();
80: }
81: }
82:
83: getrkey()
84: {
85: get(2, (char *)&key.mlen);
86: if(key.mlen >= sizeof(keybuf)) {
87: fprintf(stderr, "key too long\n");
88: exit(1);
89: }
90: get(key.mlen, key.mdata);
91: key.mdata[key.mlen] = 0;
92: get(2, (char *)&rec.mlen);
93: if(rec.mlen >= sizeof(recbuf)) {
94: fprintf(stderr, "rec len %ud: recompile btlook\n", rec.mlen);
95: abort();
96: }
97: get(rec.mlen, rec.mdata);
98: }
99:
100: getakey()
101: {
102: int c;
103: char *s;
104: for(s=key.mdata;;s++) {
105: c = getchar();
106: switch(c) {
107: case EOF:
108: exit(0);
109: case '\t':
110: for(;;) {
111: switch(getchar()) {
112: case EOF:
113: exit(0);
114: case '\n':
115: goto out;
116: }
117: }
118: case '\n':
119: goto out;
120: default:
121: *s = c;
122: }
123: }
124: out:
125: *s = 0;
126: key.mlen = s - key.mdata;
127: if(key.mlen >= sizeof(keybuf)) {
128: fprintf(stderr, "key too long:%s:\n", key.mdata);
129: abort();
130: }
131: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.