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

1.1     ! root        1: #include "stdio.h"
        !             2: #include "cbt.h"
        !             3: extern char *malloc();
        !             4: extern bfile *bopen();
        !             5: extern mbuf bkey();
        !             6: extern long lseek();
        !             7: 
        !             8: char *onearg();
        !             9: mbuf key, value;
        !            10: bfile *it;
        !            11: #define OPEN   1
        !            12: #define CLOSE  2
        !            13: #define SEEK   3
        !            14: #define FIRST  4
        !            15: #define NEXT   5
        !            16: #define WRITE  6
        !            17: #define BT     7
        !            18: #define LEV    8
        !            19: #define NODE   9
        !            20: #define KEY    10
        !            21: #define FLUSH  11
        !            22: #define COMMIT 12
        !            23: #define SHELL  13
        !            24: #define DELETE 14
        !            25: #define START  15
        !            26: #define CHECK  16
        !            27: struct cmd
        !            28: {      int cmt, cln;
        !            29:        char *ccm;
        !            30: } cmnd[] =
        !            31: {      {OPEN, 4, "open"},
        !            32:        {CLOSE, 5, "close"},
        !            33:        {SHELL, 1, "!"},
        !            34:        {DELETE, 6, "delete"},
        !            35:        {SEEK, 4, "seek"},
        !            36:        {FIRST, 5, "first"},
        !            37:        {NEXT, 4, "next"},
        !            38:        {NEXT, 4, "read"},
        !            39:        {WRITE, 5, "write"},
        !            40:        {CHECK, 5, "check"},
        !            41:        {BT, 2, "bt"},
        !            42:        {LEV, 3, "lev"},
        !            43:        {NODE, 4, "node"},
        !            44:        {KEY, 3, "key"},
        !            45:        {FLUSH, 5, "flush"},
        !            46:        {COMMIT, 6, "commit"},
        !            47:        {START, 5, "start"},
        !            48:        {START, 7, "trstart"},
        !            49:        {0, 0, 0}
        !            50: };
        !            51: char line[128];
        !            52: char ndbuf[512];
        !            53: main()
        !            54: {
        !            55:        int n;
        !            56:        char *s, *p;
        !            57:        key.mdata = malloc(200);
        !            58:        value.mdata = malloc(200);
        !            59:        for(;;) {
        !            60:                for(n = 0; n < sizeof(line); n++)
        !            61:                        line[n] = 0;
        !            62:                (void) fgets(line, sizeof(line), stdin);
        !            63:                if(feof(stdin)) break;
        !            64:                switch(cmtp(line)) {
        !            65:                default:
        !            66:                        printf("?\n");
        !            67:                        break;
        !            68:                case CLOSE:
        !            69:                        bclose(it);
        !            70:                        break;
        !            71:                case SHELL:
        !            72:                        (void) system(line);
        !            73:                        printf("!\n");
        !            74:                        break;
        !            75:                case START:
        !            76:        /*              printf("%d\n", trstart()); */
        !            77:                        break;
        !            78:                case COMMIT:
        !            79:        /*              btcommit(); */
        !            80:                        break;
        !            81:                case FLUSH:
        !            82:                        bflush(it);
        !            83:                        break;
        !            84:                case OPEN:
        !            85:                        s = onearg(line);
        !            86:                        it = bopen(s, 2);
        !            87:                        if(it == NULL || errno)
        !            88:                        {       perror(s);
        !            89:                        }
        !            90:                        break;
        !            91:                case DELETE:
        !            92:                        s = onearg(line);
        !            93:                        if(s[strlen(s)-1] == '\n')
        !            94:                                s[strlen(s)-1] = 0;
        !            95:                        todatum(s, &key);
        !            96:                        printf("%d\n", bdelete(it, key));
        !            97:                        break;
        !            98:                case SEEK:
        !            99:                        s = onearg(line);
        !           100:                        if(s[strlen(s)-1] == '\n')
        !           101:                                s[strlen(s)-1] = 0;
        !           102:                        todatum(s, &key);
        !           103:                        printf("%d\n", bseek(it, key));
        !           104:                        break;
        !           105:                case FIRST:
        !           106:                        printf("%d\n", bfirst(it));
        !           107:                        break;
        !           108:                case NEXT:
        !           109:                        printf("%d - ", bread(it, &key, &value));
        !           110:                        prbuf(value);
        !           111:                        printf(" | ");
        !           112:                        prbuf(key);
        !           113:                        putchar('\n');
        !           114:                        break;
        !           115:                case WRITE:
        !           116:                        twoarg(line, &s, &p);
        !           117:                        todatum(s, &key);
        !           118:                        todatum(p, &value);
        !           119:                        printf("%d\n", bwrite(it, key, value));
        !           120:                        break;
        !           121:                case BT:
        !           122:                        prbt(it);
        !           123:                        break;
        !           124:                case LEV:
        !           125:                        (void) sscanf(line, "%d", &n);
        !           126:                        if(n < 0 || n > it->height)
        !           127:                        {       printf("out of range\n");
        !           128:                                break;
        !           129:                        }
        !           130:                        tprnode(it->path[n]);
        !           131:                        break;
        !           132:                case NODE:
        !           133:                        (void) sscanf(line, "%d", &n);
        !           134:                        (void) lseek(it->tfd, (long)n*NDSZ, 0);
        !           135:                        (void) read(it->tfd, ndbuf, NDSZ);
        !           136:                        tprnode((hdr *)ndbuf);
        !           137:                        break;
        !           138:                case CHECK:
        !           139:                        (void) sscanf(line, "%d", &n);
        !           140:                        (void) lseek(it->tfd, (long)n * NDSZ, 0);
        !           141:                        (void) read(it->tfd, ndbuf, NDSZ);
        !           142:                        checknode((hdr *)ndbuf);
        !           143:                        break;
        !           144:                case KEY:
        !           145:                        printf("%d ", breclen(it));
        !           146:                        prbuf(bkey(it));
        !           147:                        putchar('\n');
        !           148:                        break;
        !           149:                }
        !           150:        }
        !           151:        exit(0);
        !           152: }
        !           153: cmtp(s) char *s;
        !           154: {      struct cmd *p;
        !           155:        int i;
        !           156:        for(p=cmnd; p->cln != 0; p++)
        !           157:                if(strncmp(s, p->ccm, p->cln) == 0)
        !           158:                {       for(i=0; i<p->cln; i++)
        !           159:                                line[i] =' ';
        !           160:                        return(p->cmt);
        !           161:                }
        !           162:        return(-1);
        !           163: }
        !           164: char *onearg(s) char *s;
        !           165: {      char *p, *q;
        !           166:        for(p=s; *p == ' '; p++);
        !           167:        for(q=p; *q && *q!='\n'; q++);
        !           168:        *q = 0;
        !           169:        return(p);
        !           170: }
        !           171: todatum(s, k) char *s; mbuf *k;
        !           172: {      int i;
        !           173:        k->mlen = strlen(s);
        !           174:        if(s[k->mlen - 1] == '\n')
        !           175:                k->mlen--;
        !           176:        for(i=0; i<k->mlen; i++)
        !           177:                k->mdata[i] = s[i];
        !           178: }
        !           179: twoarg(a, b, c) char *a, **b, **c;
        !           180: {      char *p, *q;
        !           181:        for(; *a==' '; a++);
        !           182:        for(p=a; *p && *p!='\t'; p++);
        !           183:        *p++ = 0;
        !           184:        for(q=p; *q && *q!='\n'; q++);
        !           185:        *q = 0;
        !           186:        *b = a;
        !           187:        *c = p;
        !           188: }
        !           189: prbuf(a) mbuf a;
        !           190: {      int i;
        !           191:        printf("%d:", a.mlen);
        !           192:        for(i=0; i<a.mlen; i++)
        !           193:                putchar(a.mdata[i]);
        !           194: }
        !           195: prbt(a) bfile *a;
        !           196: {      int i;
        !           197:        printf("ht %d adv %d rdw %d flags ", a->height, a->advnc,
        !           198:                a->rdwrt);
        !           199:        for(i = 0; i <= MXHT; i++)
        !           200:                printf(" %d", a->flag[i]);
        !           201:        putchar('\n');
        !           202:        printf("nodes ");
        !           203:        for(i = 0; i <= MXHT; i++)
        !           204:                printf(" %d", a->loc[i]);
        !           205:        putchar('\n');
        !           206:        printf("rdkey #%d:", a->rdptr.rnum);
        !           207:        printf(":\n");
        !           208: }
        !           209: tprnode(a) hdr *a;
        !           210: {      int i;
        !           211:        dkey *q;
        !           212:        prhdr(a);
        !           213:        q = (dkey *)(a+1);
        !           214:        for(i = 0; i < a->kcnt; i++) {
        !           215:                if(a->hlev == 0)
        !           216:                        prlfa(lfadr(a, i));
        !           217:                else prnda(ndadr(a, i));
        !           218:                prkey(q);
        !           219:                q = (dkey *)((char *)q + q->dlen);
        !           220:        }
        !           221:        if(a->hlev)
        !           222:                prnda(ndadr(a, i));
        !           223:        putchar('\n');
        !           224: }
        !           225: checknode(a)
        !           226: hdr *a;
        !           227: {      int i;
        !           228:        char *p;
        !           229:        for(i = 0, p = (char *)(a + 1); i < a->kcnt; i++)
        !           230:                p += *p;
        !           231:        i = p - (char *)a + nfree(a) + sizeof(trailer);
        !           232:        if(a->hlev)
        !           233:                i += (a->kcnt + 1) * sizeof(ndaddr);
        !           234:        else if(!treeonly(it))
        !           235:                i += a->kcnt * sizeof(lfaddr);
        !           236:        if(i == NDSZ) {
        !           237:                printf("ok\n");
        !           238:                return;
        !           239:        }
        !           240:        printf("nfree should be %d not %d\n", NDSZ - i + nfree(a),
        !           241:                nfree(a));
        !           242: }
        !           243: prhdr(a) hdr *a;
        !           244: {
        !           245:        printf("stamp %ld kcnt %d type %d lev %d free %d\n",
        !           246:                a->hstamp, a->kcnt, a->htype, a->hlev, nfree(a));
        !           247: }
        !           248: prlfa(a) lfaddr *a;
        !           249: {
        !           250:        if(treeonly(it))
        !           251:                printf("\t");
        !           252:        else
        !           253:                printf("%ld %u\t", a->lloc, a->llen);
        !           254: }
        !           255: prnda(a) ndaddr *a;
        !           256: {
        !           257:        printf("%u\t", *a);
        !           258: }
        !           259: prkey(b) dkey *b;
        !           260: {      int i;
        !           261:        for(i = 0; i < b->dcom; i++)
        !           262:                putchar(' ');
        !           263:        for(i = 0; i < b->dlen - DKEYSZ; i++)
        !           264:                putchar(b->dkey[i]);
        !           265:        putchar('\n');
        !           266: }

unix.superglobalmegacorp.com

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