Annotation of researchv10no/cmd/btree/gbt/bttest.c, revision 1.1.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: }
                    267: static struct D { struct D *a; char *b;} VER = {&VER,"\n82/10/9:bttest.c\n"};
                    268: /*0111000111010001*/

unix.superglobalmegacorp.com

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