|
|
1.1 ! root 1: #include "cbt.h" ! 2: #include "pr.h" ! 3: ! 4: extern bfile *curbf; ! 5: ! 6: xscan(b, key, x) hdr *b; mbuf key; private *x; ! 7: { int ncom, i, n, val; ! 8: char a, *p; ! 9: dkey *d; ! 10: ! 11: n = i = ncom = 0; ! 12: val = NOTFOUND; ! 13: p = (char *)(b+1); ! 14: d = (dkey *)p; ! 15: for(; i < b->kcnt; i++, p += d->dlen) { ! 16: d = (dkey *)p; ! 17: if(ncom < d->dcom) ! 18: goto onward; ! 19: if(ncom > d->dcom) { ! 20: if(x != NULL) { ! 21: x->match = val; ! 22: x->ncom = d->dcom; ! 23: x->ocom = ncom; ! 24: x->d = d; ! 25: } ! 26: return(i); ! 27: } ! 28: for(n = ncom; ncom < key.mlen && ncom - n < d->dlen - DKEYSZ; ncom++) { ! 29: if((a = d->dkey[ncom - n]) == key.mdata[ncom]) ! 30: continue; ! 31: if(a < key.mdata[ncom]) ! 32: goto onward; ! 33: goto done; ! 34: } ! 35: if(ncom == key.mlen) { ! 36: if(ncom == d->dlen - DKEYSZ + d->dcom) ! 37: val = FOUND; ! 38: goto done; ! 39: } ! 40: onward: ; ! 41: } ! 42: /* infinity: */ ! 43: if(x != NULL) { ! 44: x->match = EOF; ! 45: x->ncom = ncom; ! 46: x->ocom = n; ! 47: x->d = d; ! 48: } ! 49: return(i); ! 50: done: ! 51: if(x != NULL) { ! 52: x->match = val; ! 53: x->ncom = ncom; ! 54: x->ocom = n; ! 55: x->d = d; ! 56: } ! 57: return(i); ! 58: } ! 59: ! 60: desce(bf, key, x) bfile *bf; mbuf key; private *x; ! 61: { int i, j; ! 62: ndaddr u; ! 63: for(i = bf->height; i > 0; i--) { ! 64: j = xscan(bf->path[i], key, (private *)NULL); ! 65: u = *ndadr(bf->path[i], j); ! 66: if(bf->loc[i-1] != u) ! 67: if(getincore(i - 1, u) == EOF) ! 68: return(EOF); ! 69: } ! 70: i = xscan(bf->path[0], key, x); ! 71: return(i); ! 72: } ! 73: ! 74: step(level) ! 75: /* ran off the end of node at lev-1 */ ! 76: { hdr *b; ! 77: int n, i; ! 78: ndaddr u; ! 79: if(level > curbf->height) ! 80: return(EOF); ! 81: n = curbf->loc[level - 1]; ! 82: b = curbf->path[level]; ! 83: for(i = 0; i <= b->kcnt; i++) ! 84: if(*ndadr(b, i) == n) ! 85: break; ! 86: if(i >= b->kcnt) ! 87: return(step(level + 1)); ! 88: n = level; ! 89: i++; ! 90: do { ! 91: u = *ndadr(curbf->path[n], i); ! 92: if(curbf->loc[n-1] != u) ! 93: if(getincore(n - 1, u) == EOF) ! 94: return(EOF); ! 95: i = 0; ! 96: } while(--n > 0); ! 97: return(0); ! 98: } ! 99: ! 100: advance() ! 101: { dkey *dold, *dnew; ! 102: struct rdptr *y = &curbf->rdptr; ! 103: curbf->advnc = 0; ! 104: dold = y->rptr; ! 105: if(++y->rnum < curbf->path[0]->kcnt) { ! 106: dnew = (dkey *)((char *)dold + dold->dlen); ! 107: if(dold->dcom < dnew->dcom) ! 108: mvgbt(y->rpref + dold->dcom, dold->dkey, dnew->dcom - dold->dcom); ! 109: y->rptr = dnew; ! 110: return(0); ! 111: } ! 112: errno = 0; ! 113: if(step(1) == EOF) { ! 114: if(errno) ! 115: return(EOF); ! 116: y->rnum = curbf->path[0]->kcnt + 1; ! 117: y->rptr = NULL; ! 118: } ! 119: else { ! 120: y->rnum = 0; ! 121: y->rptr = (dkey *)(curbf->path[0] + 1); ! 122: } ! 123: return(0); ! 124: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.