|
|
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: free(bf->fname); ! 116: for(i = 0; i <= MXHT; i++) ! 117: if(bf->path[i] != NULL) ! 118: free((char *)bf->path[i]); ! 119: if(bf->tfd != -1) ! 120: (void) close(bf->tfd); ! 121: if(bf->dfd != -1) ! 122: (void) close(bf->dfd); ! 123: free((char *)bf); ! 124: } ! 125: ! 126: bflush(bf) bfile *bf; ! 127: { int i; ! 128: if(bf == NULL) ! 129: return(0); ! 130: if(!bf->rdwrt) { ! 131: errno = BNOWRITE; ! 132: return(EOF); ! 133: } ! 134: curbf = bf; ! 135: if(shared(bf)) ! 136: if(intran()) { ! 137: trabort(); ! 138: return(EOF); ! 139: } ! 140: else return(0); ! 141: for(i = 0; i <= bf->height; i++) { ! 142: if(!mustwrite(bf, i)) ! 143: continue; ! 144: if(readonly(bf) || i == bf->height) ! 145: if(ndwrt(bf->path[i], bf->loc[i]) == EOF) ! 146: return(EOF); ! 147: else ! 148: if(fixpath(bf) == EOF) ! 149: return(EOF); ! 150: bf->flag[i] = 0; ! 151: } ! 152: return(0); ! 153: } ! 154: ! 155: breclen(bf) bfile *bf; ! 156: { ! 157: if(bf == NULL) ! 158: return(EOF); ! 159: if(notran(bf)) ! 160: return(EOF); ! 161: if(bf->advnc) ! 162: if(advance() == EOF) ! 163: return(EOF); ! 164: if(bf->rdptr.rnum >= bf->path[0]->kcnt) ! 165: return(EOF); ! 166: if(treeonly(bf)) ! 167: return(0); ! 168: return(lfadr(bf->path[0], bf->rdptr.rnum)->llen); ! 169: } ! 170: ! 171: mbuf bkey(bf) bfile *bf; ! 172: { mbuf x; ! 173: dkey *d; ! 174: if(bf == NULL) ! 175: goto eof; ! 176: if(notran(bf)) ! 177: goto eof; ! 178: if(bf->advnc) ! 179: if(advance() == EOF) ! 180: goto eof; ! 181: if(bf->rdptr.rnum >= bf->path[0]->kcnt) ! 182: goto eof; ! 183: d = bf->rdptr.rptr; ! 184: x.mlen = d->dlen - DKEYSZ + d->dcom; ! 185: mvgbt(bf->rdptr.rpref + d->dcom, d->dkey, d->dlen-DKEYSZ); ! 186: x.mdata = bf->rdptr.rpref; ! 187: return(x); ! 188: eof: ! 189: x.mlen = 0; ! 190: x.mdata = NULL; ! 191: return(x); ! 192: } ! 193: ! 194: bread(bf, key, rec) bfile *bf; mbuf *key, *rec; ! 195: { ! 196: dkey *d; ! 197: lfaddr *x; ! 198: int n; ! 199: if(bf == NULL) ! 200: return(NULL); ! 201: if(notran(bf)) ! 202: return(EOF); ! 203: if(bf->advnc) ! 204: if(advance() == EOF) ! 205: return(EOF); ! 206: if(bf->rdptr.rnum >= bf->path[0]->kcnt) ! 207: return(EOF); ! 208: if(key != NULL) { ! 209: d = bf->rdptr.rptr; ! 210: key->mlen = d->dlen - DKEYSZ + d->dcom; ! 211: mvgbt(key->mdata, bf->rdptr.rpref, d->dcom); ! 212: mvgbt(key->mdata + d->dcom, d->dkey, d->dlen - DKEYSZ); ! 213: } ! 214: if(rec != NULL && !treeonly(bf)) { ! 215: x = lfadr(bf->path[0], bf->rdptr.rnum); ! 216: rec->mlen = x->llen; ! 217: if(rec->mlen != 0) { ! 218: (void) lseek(bf->dfd, x->lloc, 0); ! 219: if((n = read(bf->dfd, rec->mdata, (int)rec->mlen)) ! 220: != rec->mlen) { ! 221: if(n >= 0) ! 222: errno = BRDERR; ! 223: return(EOF); ! 224: } ! 225: } ! 226: } ! 227: bf->advnc = 1; ! 228: return(0); ! 229: } ! 230: static struct D { struct D *a; char *b;} VER = {&VER,"\n82/10/9:bt.c\n"}; ! 231: /*0001011110110101*/
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.