Annotation of researchv10no/libcbt/bdelete.c, revision 1.1

1.1     ! root        1: #include "cbt.h"
        !             2: #include "pr.h"
        !             3: 
        !             4: extern bfile *curbf;
        !             5: bdelete(bf, key) bfile *bf; mbuf key;
        !             6: {      dkey *dold, *dnew;
        !             7:        hdr *b;
        !             8:        int svlen, dellen;
        !             9:        char *ffree;
        !            10: 
        !            11:        if(bf == NULL)
        !            12:                return(EOF);
        !            13:        if(notran(bf))
        !            14:                return(EOF);
        !            15:        if(!bf->rdwrt) {
        !            16:                errno = BNOWRITE;
        !            17:                return(EOF);
        !            18:        }
        !            19:        if(bseek(bf, key) != FOUND)
        !            20:                return(NOTFOUND);
        !            21:        b = bf->path[0];
        !            22:        dold = bf->rdptr.rptr;
        !            23:        if(bf->rdptr.rnum + 1 >= b->kcnt) {
        !            24:                nfree(b) += dold->dlen + (treeonly(bf)? 0: sizeof(lfaddr));
        !            25:                --b->kcnt;
        !            26:                mustwrite(bf, 0) = 1;
        !            27:                if(b->hlev == 0 && b->kcnt <= 0 || b->hlev > 0 && b->kcnt < 0) {
        !            28:                        mustwrite(bf, 0) = 0;
        !            29:                        ndelete(1, key);
        !            30:                }
        !            31:                if(b->kcnt < 0)
        !            32:                        b->kcnt = 0;
        !            33:                (void) bseek(bf, key);
        !            34:                return(FOUND);
        !            35:        }
        !            36: 
        !            37:        if(treeonly(bf))
        !            38:                ffree = (char *)&nfree(b) - nfree(b);
        !            39:        else
        !            40:                ffree = (char *)lfadr(b, b->kcnt - 1) - nfree(b);
        !            41:        svlen = dold->dlen;
        !            42:        dnew = (dkey *)((char *)dold + dold->dlen);
        !            43:        if(dnew->dcom <= dold->dcom) {
        !            44:                mvgbt((char *)dold, (char *)dnew, ffree - (char *)dnew);
        !            45:                if(!treeonly(bf))
        !            46:                        rmlfadr(b, bf->rdptr.rnum);
        !            47:                b->kcnt--;
        !            48:                mustwrite(bf, 0) = 1;
        !            49:                nfree(b) += svlen + (treeonly(bf)? 0: sizeof(lfaddr));
        !            50:                (void) bseek(bf, key);
        !            51:                return(FOUND);
        !            52:        }
        !            53:        dellen = dnew->dcom - dold->dcom;
        !            54:        /* writing over dold */
        !            55:        dold->dlen = dnew->dlen + dellen;
        !            56:        mvgbt(dold->dkey + dellen, dnew->dkey, ffree - dnew->dkey);
        !            57:        if(!treeonly(bf))
        !            58:                rmlfadr(b, bf->rdptr.rnum);
        !            59:        b->kcnt--;
        !            60:        mustwrite(bf, 0) = 1;
        !            61:        nfree(b) += svlen - dellen + (treeonly(bf)? 0: sizeof(lfaddr));
        !            62:        (void) bseek(bf, key);
        !            63:        return(FOUND);
        !            64: }
        !            65: rmlfadr(b, n) hdr *b; unsigned int n;
        !            66: {
        !            67:        mvgbt((char *)lfadr(b, b->kcnt - 2), (char *)lfadr(b, b->kcnt - 1),
        !            68:                (int)sizeof(lfaddr) * (b->kcnt - 1 - n));
        !            69: }
        !            70: rmndadr(b, n) hdr *b; unsigned short n;
        !            71: {
        !            72:        mvgbt((char *)ndadr(b, b->kcnt - 1), (char *)ndadr(b, b->kcnt),
        !            73:                (int)sizeof(ndaddr) * (b->kcnt - n));
        !            74: }
        !            75: ndelete(lev, key) mbuf key;
        !            76: {      hdr *b;
        !            77:        int svlen, dellen;
        !            78:        unsigned short n;
        !            79:        private x;
        !            80:        char *ffree;
        !            81:        dkey *dold, *dnew;
        !            82:        if(lev > curbf->height) {
        !            83:                b = curbf->path[curbf->height];
        !            84:                b->hlev = 0;
        !            85:                curbf->height = 0;
        !            86:                mustwrite(curbf, 0) = 1;
        !            87:                curbf->loc[0] = 0;
        !            88:                nfree(b) = NDSZ - sizeof(hdr) - sizeof(trailer);
        !            89:                b->kcnt = 0;
        !            90:                mvgbt((char *)curbf->path[0], (char *)b, NDSZ);
        !            91:                return;
        !            92:        }
        !            93:        b = curbf->path[lev];
        !            94:        n = xscan(b, key, &x);
        !            95:        if(x.match == EOF) {
        !            96:                if(b->kcnt <= 0) {
        !            97:                        mustwrite(curbf, lev) = 0;
        !            98:                        ndelete(lev+1, key);
        !            99:                        return;
        !           100:                }
        !           101:                b->kcnt--;
        !           102:                nfree(b) += sizeof(ndaddr) + x.d->dlen;
        !           103:                mustwrite(curbf, lev) = 1;
        !           104:                return;
        !           105:        }
        !           106:        dold = x.d;
        !           107:        dnew = (dkey *)((char *)dold + dold->dlen);
        !           108:        ffree = (char *)ndadr(b, b->kcnt) - nfree(b);
        !           109:        svlen = dold->dlen;
        !           110:        if(n + 1 >= b->kcnt || dnew->dcom <= dold->dcom) {
        !           111:                mvgbt((char *)dold, (char *)dnew, ffree - (char *)dnew);
        !           112:                rmndadr(b, n);
        !           113:                b->kcnt--;
        !           114:                mustwrite(curbf, lev) = 1;
        !           115:                nfree(b) += sizeof(ndaddr) + svlen;
        !           116:                return;
        !           117:        }
        !           118:        dellen = dnew->dcom - dold->dcom;
        !           119:        /* writing over dold */
        !           120:        dold->dlen = dnew->dlen + dellen;
        !           121:        mvgbt(dold->dkey + dellen, dnew->dkey, ffree - dnew->dkey);
        !           122:        rmndadr(b, n);
        !           123:        b->kcnt--;
        !           124:        mustwrite(curbf, lev) = 1;
        !           125:        nfree(b) += sizeof(ndaddr) + svlen - dellen;
        !           126: }

unix.superglobalmegacorp.com

This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.