Annotation of researchv10no/cmd/btree/btbuild.c, revision 1.1

1.1     ! root        1: #include "stdio.h"
        !             2: #include "cbt.h"
        !             3: #define SZ     MXHT+1
        !             4: 
        !             5: typedef struct {
        !             6:        unsigned short mlen;
        !             7:        char mdata[NDSZ];       /* max size of values */
        !             8: } xbuf;
        !             9: int address[SZ];       /* where the next address goes in the node */
        !            10: xbuf curkey[SZ];       /* last key put in the node */
        !            11: xbuf shortone;         /* for compression */
        !            12: int freecnt[SZ];               /* number of bytes left in node */
        !            13: dkey *kp[SZ];          /* where to put next dkey in node */
        !            14: char node[SZ][NDSZ];   /* the nodes */
        !            15: char used[SZ+1];       /* which nodes have been used */
        !            16: xbuf nkey;             /* as read by getrec */
        !            17: struct {
        !            18:        unsigned short mlen;
        !            19:        char mdata[32767];
        !            20: } val;
        !            21: lfaddr currec;         /* where getrec put val */
        !            22: FILE *tfd, *dfd;
        !            23: char name[16];
        !            24: int type;
        !            25: long reccnt;
        !            26: extern char *malloc();
        !            27: 
        !            28: char *
        !            29: prkey(a)
        !            30: xbuf *a;
        !            31: {      int i;
        !            32:        unsigned char c;
        !            33:        static char buf[4*NDSZ], *p;
        !            34:        for(i = 0, p = buf; i < a->mlen; i++) {
        !            35:                c = a->mdata[i];
        !            36:                if(c < ' ') {
        !            37:                        *p++ = '^';
        !            38:                        c += ' ';
        !            39:                }
        !            40:                if(c < 127)
        !            41:                        *p++ = (char)c;
        !            42:                else {
        !            43:                        *p++ = '\\';
        !            44:                        *p++ = (c >> 6) + '0';
        !            45:                        *p++ = ((c&63)>>3) + '0';
        !            46:                        *p++ = c&7 + '0';
        !            47:                }
        !            48:        }
        !            49:        *p++ = 0;
        !            50:        return(buf);
        !            51: }
        !            52: pref(a, b, lev) xbuf *a, *b;
        !            53: {      register int n;
        !            54:        register char *p, *q;
        !            55:        for(n = 0, p = a->mdata, q = b->mdata; n < a->mlen && n < b->mlen; n++)
        !            56:                if(*p++ != *q++)
        !            57:                        break;
        !            58:        p--, q--;
        !            59:        if(lev == 0 && ((n == b->mlen && n >= a->mlen) || *p > *q)) {
        !            60:                fprintf(stderr, "key %ld out of order:\n", reccnt);
        !            61:                fprintf(stderr, "key %ld is %s\n", reccnt - 1, prkey(a));
        !            62:                fprintf(stderr, "key %ld is %s\n", reccnt, prkey(b));
        !            63:        }
        !            64:        return(n);
        !            65: }
        !            66: 
        !            67: getrec()
        !            68: {
        !            69:        reccnt++;
        !            70:        if(mget(&nkey))
        !            71:                return(-1);
        !            72:        if(mget((xbuf *)&val))
        !            73:                fail("half a record read");
        !            74:        if((currec.llen = val.mlen) != 0) {
        !            75:                currec.lloc = ftell(dfd);
        !            76:                (void) fwrite(val.mdata, 1, val.mlen, dfd);
        !            77:                if(ferror(dfd))
        !            78:                        fail("value write");
        !            79:        }
        !            80:        else currec.lloc = 0;
        !            81:        return(1);
        !            82: }
        !            83: 
        !            84: mget(a) xbuf *a;
        !            85: {
        !            86:        (void) fread((char *)&(a->mlen), 1, sizeof(a->mlen), stdin);
        !            87:        if(feof(stdin) || ferror(stdin))
        !            88:                return(1);
        !            89:        if(fread(a->mdata, 1, a->mlen, stdin) != a->mlen)
        !            90:                return(1);
        !            91:        return(0);
        !            92: }
        !            93: 
        !            94: ndaddr ndwrt(level)
        !            95: {      ndaddr loc;
        !            96:        int i;
        !            97:        hdr *x;
        !            98:        trailer *t;
        !            99:        loc = ftell(tfd)/NDSZ;
        !           100:        x = (hdr *)(node[level]);
        !           101:        x->hlev = level;
        !           102:        t = (trailer *)(node[level] + NDSZ - sizeof(trailer));
        !           103:        t->tfree = freecnt[level];
        !           104:        x->kcnt = address[level] - (level == 0? 0: 1);
        !           105:        x->htype = type;
        !           106:        (void) fwrite(node[level], 1, NDSZ, tfd);
        !           107:        if(ferror(tfd))
        !           108:                fail("node write");
        !           109:        for(i = 0; i < NDSZ; i++)
        !           110:                node[level][i] = 0;
        !           111:        address[level] = 0;
        !           112:        curkey[level].mlen = 0;
        !           113:        freecnt[level] = NDSZ - sizeof(hdr) - sizeof(trailer);
        !           114:        if(level)
        !           115:                freecnt[level] -= sizeof(ndaddr);
        !           116:        kp[level] = (dkey *)(node[level] + sizeof(hdr));
        !           117:        return(loc);
        !           118: }
        !           119: 
        !           120: finish(level, ptr) ndaddr ptr;
        !           121: {      ndaddr loc;
        !           122:        if(!used[level])
        !           123:                return;
        !           124:        *ndadr(node[level], address[level]++) = ptr;
        !           125:        if(!used[level + 1])
        !           126:                fseek(tfd, 0L, 0);
        !           127:        loc = ndwrt(level);
        !           128:        finish(level + 1, loc);
        !           129: }
        !           130: 
        !           131: insert(level, key, ptr) xbuf *key; ndaddr ptr;
        !           132: {      int n, len;
        !           133:        char *p;
        !           134:        ndaddr loc;
        !           135:        used[level] = 1;
        !           136:        n = pref(&curkey[level], key, level);
        !           137:        len = DKEYSZ + key->mlen - n + sizeof(ptr);
        !           138:        if(len < freecnt[level]) {
        !           139:                *ndadr(node[level], address[level]++) = ptr;
        !           140:                kp[level]->dlen = len - sizeof(ptr);
        !           141:                kp[level]->dcom = n;
        !           142:                mvgbt(kp[level]->dkey, key->mdata + n, key->mlen - n);
        !           143:                p = (char *)(kp[level]) + kp[level]->dlen;
        !           144:                kp[level] = (dkey *)p;
        !           145:                freecnt[level] -= len;
        !           146:                curkey[level] = *key;
        !           147:        }
        !           148:        else {
        !           149:                *ndadr(node[level],address[level]++) = ptr;
        !           150:                loc = ndwrt(level);
        !           151:                insert(level+1, key, loc);
        !           152:                curkey[level].mlen = 0;
        !           153:        }
        !           154: }
        !           155: 
        !           156: doit()
        !           157: {      int n, len;
        !           158:        ndaddr loc;
        !           159:        char *p;
        !           160:        for(;;) {
        !           161:                if(getrec() == -1)
        !           162:                        break;
        !           163:                used[0] = 1;
        !           164:                n = pref(&curkey[0], &nkey, 0);
        !           165:                len = DKEYSZ + nkey.mlen - n + sizeof(currec);
        !           166:                if(type & INDEX)
        !           167:                        len -= sizeof(currec);
        !           168:                if(len < freecnt[0]) {
        !           169:                        freecnt[0] -= len;
        !           170:                        if(!(type & INDEX))
        !           171:                                *lfadr(node[0], address[0]++) = currec;
        !           172:                        else
        !           173:                                address[0]++;
        !           174:                        kp[0]->dlen = DKEYSZ + nkey.mlen - n;
        !           175:                        kp[0]->dcom = n;
        !           176:                        mvgbt(kp[0]->dkey, nkey.mdata + n, nkey.mlen - n);
        !           177:                        p = (char *)(kp[0]) + kp[0]->dlen;
        !           178:                        kp[0] = (dkey *)p;
        !           179:                        curkey[0] = nkey;
        !           180:                }
        !           181:                else {
        !           182:                        shortest(&curkey[0], &nkey);
        !           183:                        loc = ndwrt(0);
        !           184:                        freecnt[0] -= DKEYSZ + nkey.mlen + sizeof(currec);
        !           185:                        if(type & INDEX)
        !           186:                                freecnt[0] += sizeof(currec);
        !           187:                        insert(1, &shortone, loc);
        !           188:                        if(!(type & INDEX))
        !           189:                                *lfadr(node[0], address[0]++) = currec;
        !           190:                        else
        !           191:                                address[0]++;
        !           192:                        kp[0]->dlen = DKEYSZ + nkey.mlen;
        !           193:                        kp[0]->dcom = 0;
        !           194:                        mvgbt(kp[0]->dkey, nkey.mdata, nkey.mlen);
        !           195:                        p = (char *)(kp[0]) + kp[0]->dlen;
        !           196:                        kp[0] = (dkey *)p;
        !           197:                        curkey[0] = nkey;
        !           198:                }
        !           199:        }
        !           200:        if(!used[1])
        !           201:                (void) fseek(tfd, 0L, 0);
        !           202:        loc = ndwrt(0);
        !           203:        finish(1, loc);
        !           204: }
        !           205: 
        !           206: init(s)
        !           207: char *s;
        !           208: {      int i;
        !           209:        hdr *b;
        !           210:        char xx[NDSZ];
        !           211:        (void) sprintf(name, "%s.T", s);
        !           212:        tfd = fopen(name, "r");
        !           213:        if(tfd == NULL) {
        !           214:                perror(s);
        !           215:                exit(1);
        !           216:        }
        !           217:        fread(xx, 1, NDSZ, tfd);
        !           218:        fclose(tfd);
        !           219:        tfd = fopen(name, "w");
        !           220:        (void) fseek(tfd, (long)NDSZ, 0);
        !           221:        b = (hdr *)xx;
        !           222:        type = b->htype;
        !           223:        (void) sprintf(name, "%s.F", s);
        !           224:        if((type & INDEX) != INDEX)
        !           225:                dfd = fopen(name, "w");
        !           226:        for(i = 0; i < SZ; i++) {
        !           227:                freecnt[i] = NDSZ - sizeof(hdr) - sizeof(trailer);
        !           228:                if(i)
        !           229:                        freecnt[i] -= sizeof(ndaddr);
        !           230:                kp[i] = (dkey *)(node[i] + sizeof(hdr));
        !           231:        }
        !           232: }
        !           233: 
        !           234: main(argc, argv)
        !           235: char **argv;
        !           236: {
        !           237:        if(argc != 2) {
        !           238:                fprintf(stderr, "%s: too many arguments\n", argv[1]);
        !           239:                exit(1);
        !           240:        }
        !           241:        init(argv[1]);
        !           242:        doit();
        !           243:        exit(0);
        !           244: }
        !           245: 
        !           246: shortest(a, b) xbuf *a, *b;
        !           247: {      int n;
        !           248:        char *p, *q, *s;
        !           249:        p = a->mdata;
        !           250:        q = b->mdata;
        !           251:        s = shortone.mdata;
        !           252:        for(n = 0; n < a->mlen && n < b->mlen; n++, p++, q++)
        !           253:                if(*p == *q)
        !           254:                        *s++ = *p;
        !           255:                else break;
        !           256:        if(n < a->mlen) {
        !           257:        again:
        !           258:                if(n + 1 == a->mlen)
        !           259:                        *s++ = *p;
        !           260:                else if(*p + 1 < *q)
        !           261:                        *s++ = *p + 1;
        !           262:                else {
        !           263:                        *s++ = *p++;
        !           264:                        n++;
        !           265:                        if(*p + 1 > *p)
        !           266:                                *s++ = *p + 1;
        !           267:                        else goto again;
        !           268:                }
        !           269:        }
        !           270:        shortone.mlen = s - shortone.mdata;
        !           271: }
        !           272: prbuf(x) xbuf *x;
        !           273: {      int i;
        !           274:        for(i = 0; i < x->mlen; i++)
        !           275:                printf("%3.3o ", x->mdata[i]);
        !           276:        putchar('\n');
        !           277: }
        !           278: fail(s)
        !           279: char *s;
        !           280: {
        !           281:        perror(s);
        !           282:        exit(2);
        !           283: }
        !           284: static struct D { struct D *a; char *b;} VER = {&VER,"\n81/8/9:btbuild.c\n"};
        !           285: /*1101000110100100*/

unix.superglobalmegacorp.com

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