|
|
1.1 root 1: #include "cbt.h"
2: #include "pr.h"
3:
4: bfile *curbf;
5: extern bfile *newtran();
6: extern char *malloc(), *strcpy();
7: extern long lseek();
8:
9: bfile *bopen(s, typ) char *s; /* typ is 0 or 2 */
10: { bfile *p;
11: int n, i;
12:
13: p = alloc(bfile);
14: if(p == NULL)
15: goto nomem;
16: n = strlen(s);
17: p->fname = malloc((unsigned)n + 3);
18: if(p->fname == NULL)
19: goto nomem;
20: (void) strcpy(p->fname, s);
21: strcpy(p->fname + n, ".T");
22: if((p->tfd = open(p->fname, typ)) == -1) {
23: free(p->fname);
24: free((char *)p);
25: return(NULL);
26: }
27: p->rdwrt = typ;
28: p->fatal = p->advnc = 0;
29: p->altname = NULL;
30: for(i = 0; i <= MXHT; i++) {
31: p->path[i] = NULL;
32: p->flag[i] = 0;
33: p->loc[i] = 0;
34: }
35: p->path[0] = (hdr *)malloc(NDSZ);
36: if(p->path[0] == NULL)
37: goto nomem;
38: curbf = p;
39: if(ndrd(0, (ndaddr)0) == EOF)
40: return(NULL);
41: strcpy(p->fname + n, ".F");
42: if(!treeonly(p) && (p->dfd = open(p->fname, typ)) == -1) {
43: (void) close(p->tfd);
44: free(p->fname);
45: free((char *) p->path[0]);
46: free((char *)p);
47: return(NULL);
48: }
49: else if(treeonly(p))
50: p->dfd = -1;
51: p->fname[n] = 0;
52: if(shared(p))
53: return(newtran(p));
54: else if(tranid == 0)
55: tranid = getlpid();
56: p->height = p->path[0]->hlev;
57: for(n = 1; n <= p->height; n++)
58: if((p->path[n] = (hdr *)malloc(NDSZ)) == NULL)
59: goto nomem;
60: if(p->height > 0)
61: mvgbt((char *)p->path[p->height], (char *)p->path[0], NDSZ);
62: (void) bfirst(p);
63: return(p);
64: nomem:
65: errno = BNOMEM;
66: return(NULL);
67: }
68:
69: bseek(bf, key) bfile *bf; mbuf key;
70: { private m;
71: int i;
72: if(bf == NULL)
73: return(EOF);
74: if(notran(bf))
75: return(EOF);
76: if(!readonly(bf))
77: for(i = 0; i < bf->height; i++)
78: if(mustwrite(bf, i))
79: if(fixpath(bf) == EOF)
80: return(EOF);
81: bf->rdptr.rnum = desce(bf, key, &m);
82: if(bf->rdptr.rnum == EOF)
83: return(EOF);
84: bf->advnc = 0;
85: bf->rdptr.rptr = m.d;
86: if(m.match == EOF) {
87: if(advance() == EOF)
88: return(EOF);
89: if(bf->rdptr.rptr != NULL)
90: m.match = NOTFOUND;
91: }
92: if(m.match != EOF)
93: mvgbt(bf->rdptr.rpref, key.mdata, bf->rdptr.rptr->dcom);
94: /* maybe use rptr instead of m.d */
95: return(m.match);
96: }
97:
98: bfirst(bf) bfile *bf;
99: { mbuf key;
100: key.mlen = 0;
101: return(bseek(bf, key));
102: }
103:
104: bclose(bf) bfile *bf;
105: { int i;
106: if(bf == NULL)
107: return;
108: if(shared(bf)) {
109: if(intran())
110: trabort();
111: rmtran(bf);
112: }
113: else
114: bflush(bf);
115: btbufdone(bf->tfd);
116: free(bf->fname);
117: for(i = 0; i <= MXHT; i++)
118: if(bf->path[i] != NULL)
119: free((char *)bf->path[i]);
120: if(bf->tfd != -1)
121: (void) close(bf->tfd);
122: if(bf->dfd != -1)
123: (void) close(bf->dfd);
124: free((char *)bf);
125: }
126:
127: bflush(bf) bfile *bf;
128: { int i;
129: if(bf == NULL)
130: return(0);
131: if(!bf->rdwrt) {
132: errno = BNOWRITE;
133: return(EOF);
134: }
135: curbf = bf;
136: if(shared(bf))
137: if(intran()) {
138: trabort();
139: return(EOF);
140: }
141: else return(0);
142: for(i = 0; i <= bf->height; i++) {
143: if(!mustwrite(bf, i))
144: continue;
145: if(readonly(bf) || i == bf->height)
146: if(ndwrt(bf->path[i], bf->loc[i]) == EOF)
147: return(EOF);
148: else
149: if(fixpath(bf) == EOF)
150: return(EOF);
151: bf->flag[i] = 0;
152: }
153: return(0);
154: }
155:
156: breclen(bf) bfile *bf;
157: {
158: if(bf == NULL)
159: return(EOF);
160: if(notran(bf))
161: return(EOF);
162: if(bf->advnc)
163: if(advance() == EOF)
164: return(EOF);
165: if(bf->rdptr.rnum >= bf->path[0]->kcnt)
166: return(EOF);
167: if(treeonly(bf))
168: return(0);
169: return(lfadr(bf->path[0], bf->rdptr.rnum)->llen);
170: }
171:
172: mbuf bkey(bf) bfile *bf;
173: { mbuf x;
174: dkey *d;
175: if(bf == NULL)
176: goto eof;
177: if(notran(bf))
178: goto eof;
179: if(bf->advnc)
180: if(advance() == EOF)
181: goto eof;
182: if(bf->rdptr.rnum >= bf->path[0]->kcnt)
183: goto eof;
184: d = bf->rdptr.rptr;
185: x.mlen = d->dlen - DKEYSZ + d->dcom;
186: mvgbt(bf->rdptr.rpref + d->dcom, d->dkey, d->dlen-DKEYSZ);
187: x.mdata = bf->rdptr.rpref;
188: return(x);
189: eof:
190: x.mlen = 0;
191: x.mdata = NULL;
192: return(x);
193: }
194:
195: bread(bf, key, rec) bfile *bf; mbuf *key, *rec;
196: {
197: dkey *d;
198: lfaddr *x;
199: int n;
200: if(bf == NULL)
201: return(NULL);
202: if(notran(bf))
203: return(EOF);
204: if(bf->advnc)
205: if(advance() == EOF)
206: return(EOF);
207: if(bf->rdptr.rnum >= bf->path[0]->kcnt)
208: return(EOF);
209: if(key != NULL) {
210: d = bf->rdptr.rptr;
211: key->mlen = d->dlen - DKEYSZ + d->dcom;
212: mvgbt(key->mdata, bf->rdptr.rpref, d->dcom);
213: mvgbt(key->mdata + d->dcom, d->dkey, d->dlen - DKEYSZ);
214: }
215: if(rec != NULL && !treeonly(bf)) {
216: x = lfadr(bf->path[0], bf->rdptr.rnum);
217: rec->mlen = x->llen;
218: if(rec->mlen != 0) {
219: (void) lseek(bf->dfd, x->lloc, 0);
220: if((n = read(bf->dfd, rec->mdata, (int)rec->mlen))
221: != rec->mlen) {
222: if(n >= 0)
223: errno = BRDERR;
224: return(EOF);
225: }
226: }
227: }
228: bf->advnc = 1;
229: return(0);
230: }
231: static struct D { struct D *a; char *b;} VER = {&VER,"\n82/10/9:bt.c\n"};
232: /*0001011110110101*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.