|
|
1.1 root 1: #include "stdio.h"
2: #include "cbt.h"
3: extern char *malloc();
4: extern bfile *bopen();
5: extern mbuf bkey();
6: extern long lseek();
7:
8: char *onearg();
9: mbuf key, value;
10: bfile *it;
11: #define OPEN 1
12: #define CLOSE 2
13: #define SEEK 3
14: #define FIRST 4
15: #define NEXT 5
16: #define WRITE 6
17: #define BT 7
18: #define LEV 8
19: #define NODE 9
20: #define KEY 10
21: #define FLUSH 11
22: #define COMMIT 12
23: #define SHELL 13
24: #define DELETE 14
25: #define START 15
26: #define CHECK 16
27: struct cmd
28: { int cmt, cln;
29: char *ccm;
30: } cmnd[] =
31: { {OPEN, 4, "open"},
32: {CLOSE, 5, "close"},
33: {SHELL, 1, "!"},
34: {DELETE, 6, "delete"},
35: {SEEK, 4, "seek"},
36: {FIRST, 5, "first"},
37: {NEXT, 4, "next"},
38: {NEXT, 4, "read"},
39: {WRITE, 5, "write"},
40: {CHECK, 5, "check"},
41: {BT, 2, "bt"},
42: {LEV, 3, "lev"},
43: {NODE, 4, "node"},
44: {KEY, 3, "key"},
45: {FLUSH, 5, "flush"},
46: {COMMIT, 6, "commit"},
47: {START, 5, "start"},
48: {START, 7, "trstart"},
49: {0, 0, 0}
50: };
51: char line[128];
52: char ndbuf[512];
53: main()
54: {
55: int n;
56: char *s, *p;
57: key.mdata = malloc(200);
58: value.mdata = malloc(200);
59: for(;;) {
60: for(n = 0; n < sizeof(line); n++)
61: line[n] = 0;
62: (void) fgets(line, sizeof(line), stdin);
63: if(feof(stdin)) break;
64: switch(cmtp(line)) {
65: default:
66: printf("?\n");
67: break;
68: case CLOSE:
69: bclose(it);
70: break;
71: case SHELL:
72: (void) system(line);
73: printf("!\n");
74: break;
75: case START:
76: /* printf("%d\n", trstart()); */
77: break;
78: case COMMIT:
79: /* btcommit(); */
80: break;
81: case FLUSH:
82: bflush(it);
83: break;
84: case OPEN:
85: s = onearg(line);
86: it = bopen(s, 2);
87: if(it == NULL || errno)
88: { perror(s);
89: }
90: break;
91: case DELETE:
92: s = onearg(line);
93: if(s[strlen(s)-1] == '\n')
94: s[strlen(s)-1] = 0;
95: todatum(s, &key);
96: printf("%d\n", bdelete(it, key));
97: break;
98: case SEEK:
99: s = onearg(line);
100: if(s[strlen(s)-1] == '\n')
101: s[strlen(s)-1] = 0;
102: todatum(s, &key);
103: printf("%d\n", bseek(it, key));
104: break;
105: case FIRST:
106: printf("%d\n", bfirst(it));
107: break;
108: case NEXT:
109: printf("%d - ", bread(it, &key, &value));
110: prbuf(value);
111: printf(" | ");
112: prbuf(key);
113: putchar('\n');
114: break;
115: case WRITE:
116: twoarg(line, &s, &p);
117: todatum(s, &key);
118: todatum(p, &value);
119: printf("%d\n", bwrite(it, key, value));
120: break;
121: case BT:
122: prbt(it);
123: break;
124: case LEV:
125: (void) sscanf(line, "%d", &n);
126: if(n < 0 || n > it->height)
127: { printf("out of range\n");
128: break;
129: }
130: tprnode(it->path[n]);
131: break;
132: case NODE:
133: (void) sscanf(line, "%d", &n);
134: (void) lseek(it->tfd, (long)n*NDSZ, 0);
135: (void) read(it->tfd, ndbuf, NDSZ);
136: tprnode((hdr *)ndbuf);
137: break;
138: case CHECK:
139: (void) sscanf(line, "%d", &n);
140: (void) lseek(it->tfd, (long)n * NDSZ, 0);
141: (void) read(it->tfd, ndbuf, NDSZ);
142: checknode((hdr *)ndbuf);
143: break;
144: case KEY:
145: printf("%d ", breclen(it));
146: prbuf(bkey(it));
147: putchar('\n');
148: break;
149: }
150: }
151: exit(0);
152: }
153: cmtp(s) char *s;
154: { struct cmd *p;
155: int i;
156: for(p=cmnd; p->cln != 0; p++)
157: if(strncmp(s, p->ccm, p->cln) == 0)
158: { for(i=0; i<p->cln; i++)
159: line[i] =' ';
160: return(p->cmt);
161: }
162: return(-1);
163: }
164: char *onearg(s) char *s;
165: { char *p, *q;
166: for(p=s; *p == ' '; p++);
167: for(q=p; *q && *q!='\n'; q++);
168: *q = 0;
169: return(p);
170: }
171: todatum(s, k) char *s; mbuf *k;
172: { int i;
173: k->mlen = strlen(s);
174: if(s[k->mlen - 1] == '\n')
175: k->mlen--;
176: for(i=0; i<k->mlen; i++)
177: k->mdata[i] = s[i];
178: }
179: twoarg(a, b, c) char *a, **b, **c;
180: { char *p, *q;
181: for(; *a==' '; a++);
182: for(p=a; *p && *p!='\t'; p++);
183: *p++ = 0;
184: for(q=p; *q && *q!='\n'; q++);
185: *q = 0;
186: *b = a;
187: *c = p;
188: }
189: prbuf(a) mbuf a;
190: { int i;
191: printf("%d:", a.mlen);
192: for(i=0; i<a.mlen; i++)
193: putchar(a.mdata[i]);
194: }
195: prbt(a) bfile *a;
196: { int i;
197: printf("ht %d adv %d rdw %d flags ", a->height, a->advnc,
198: a->rdwrt);
199: for(i = 0; i <= MXHT; i++)
200: printf(" %d", a->flag[i]);
201: putchar('\n');
202: printf("nodes ");
203: for(i = 0; i <= MXHT; i++)
204: printf(" %d", a->loc[i]);
205: putchar('\n');
206: printf("rdkey #%d:", a->rdptr.rnum);
207: printf(":\n");
208: }
209: tprnode(a) hdr *a;
210: { int i;
211: dkey *q;
212: prhdr(a);
213: q = (dkey *)(a+1);
214: for(i = 0; i < a->kcnt; i++) {
215: if(a->hlev == 0)
216: prlfa(lfadr(a, i));
217: else prnda(ndadr(a, i));
218: prkey(q);
219: q = (dkey *)((char *)q + q->dlen);
220: }
221: if(a->hlev)
222: prnda(ndadr(a, i));
223: putchar('\n');
224: }
225: checknode(a)
226: hdr *a;
227: { int i;
228: char *p;
229: for(i = 0, p = (char *)(a + 1); i < a->kcnt; i++)
230: p += *p;
231: i = p - (char *)a + nfree(a) + sizeof(trailer);
232: if(a->hlev)
233: i += (a->kcnt + 1) * sizeof(ndaddr);
234: else if(!treeonly(it))
235: i += a->kcnt * sizeof(lfaddr);
236: if(i == NDSZ) {
237: printf("ok\n");
238: return;
239: }
240: printf("nfree should be %d not %d\n", NDSZ - i + nfree(a),
241: nfree(a));
242: }
243: prhdr(a) hdr *a;
244: {
245: printf("stamp %ld kcnt %d type %d lev %d free %d\n",
246: a->hstamp, a->kcnt, a->htype, a->hlev, nfree(a));
247: }
248: prlfa(a) lfaddr *a;
249: {
250: if(treeonly(it))
251: printf("\t");
252: else
253: printf("%ld %u\t", a->lloc, a->llen);
254: }
255: prnda(a) ndaddr *a;
256: {
257: printf("%u\t", *a);
258: }
259: prkey(b) dkey *b;
260: { int i;
261: for(i = 0; i < b->dcom; i++)
262: putchar(' ');
263: for(i = 0; i < b->dlen - DKEYSZ; i++)
264: putchar(b->dkey[i]);
265: putchar('\n');
266: }
267: static struct D { struct D *a; char *b;} VER = {&VER,"\n82/10/9:bttest.c\n"};
268: /*0111000111010001*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.