Annotation of researchv10no/cmd/btree/btadd.c, revision 1.1.1.1

1.1       root        1: #include "stdio.h"
                      2: #include "cbt.h"
                      3: 
                      4: /* like btbuild, but random access */
                      5: char keybuf[NDSZ];
                      6: char recbuf[32767];
                      7: mbuf key = { keybuf, 0};
                      8: mbuf rec = { recbuf, 0};
                      9: bfile *bf;
                     10: int cflag;
                     11: 
                     12: main(argc, argv)
                     13: char **argv;
                     14: {      int n;
                     15:        if(argv[1][0] == '-') {
                     16:                cflag++;
                     17:                argc--;
                     18:                argv++;
                     19:        }
                     20:        if(argc != 2) {
                     21:                fprintf(stderr, "usage: btadd bfile < recs\n");
                     22:                exit(1);
                     23:        }
                     24:        if((bf = bopen(argv[1], 2)) == NULL) {
                     25:                perror(argv[1]);
                     26:                exit(1);
                     27:        }
                     28:        for(;;) {
                     29:                get(2, (char *)&key.mlen);
                     30:                if(key.mlen > MAXKLEN) {
                     31:                        fprintf(stderr, "key too long\n");
                     32:                        exit(1);
                     33:                }
                     34:                get(key.mlen, key.mdata);
                     35:                get(2, (char *)&rec.mlen);
                     36:                if(rec.mlen > sizeof(recbuf)) {
                     37:                        fprintf(stderr, "rec len %ud: recompile btadd\n",
                     38:                                rec.mlen);
                     39:                        abort();
                     40:                }
                     41:                get(rec.mlen, rec.mdata);
                     42:                (void)bwrite(bf, key, rec);
                     43:                bfirst(bf);
                     44:                if(bseek(bf, key) != FOUND) {
                     45:                        key.mdata[key.mlen] = 0;
                     46:                        fprintf(stderr, "vanished:%s:\n", key.mdata);
                     47:                        abort();
                     48:                }
                     49:                if(cflag)
                     50:                        bcheck(bf);
                     51:        }
                     52: }
                     53: get(n, s)
                     54: char *s;
                     55: {      int m;
                     56:        for(m = 0; n > 0; n -= m) {
                     57:                m = read(0, s, n);
                     58:                if(m == 0) {
                     59:                        bclose(bf);
                     60:                        exit(0);
                     61:                }
                     62:                if(m < 0) {
                     63:                        fprintf(stderr, "io error in btadd\n");
                     64:                        abort();
                     65:                }
                     66:                s += m;
                     67:        }
                     68: }
                     69: 
                     70: mbuf new, old;
                     71: char newbuf[NDSZ], oldbuf[NDSZ];
                     72: bcheck(bf)
                     73: bfile *bf;
                     74: {      long i;
                     75:        int j, k;
                     76:        char *p;
                     77:        bfirst(bf);
                     78:        new.mdata = newbuf;
                     79:        old.mdata = oldbuf;
                     80:        for(i = 0;; i++) {
                     81:                if(bread(bf, &new, (mbuf *)NULL) == EOF)
                     82:                        break;
                     83:                if(i > 0) {
                     84:                        k = new.mlen;
                     85:                        if(old.mlen < new.mlen)
                     86:                                k = old.mlen;
                     87:                        for(j = 0; j < k; j++)
                     88:                                if(new.mdata[j] != old.mdata[j])
                     89:                                        break;
                     90:                        if(j != k) {
                     91:                                if(new.mdata[j] > old.mdata[j])
                     92:                                        continue;
                     93: bad:
                     94:                                fprintf(stderr, "disorder at key %ld\n", i);
                     95:                                key.mdata[key.mlen] = 0;
                     96:                                fprintf(stderr, "key is:%s:\n", key.mdata);
                     97:                                abort();
                     98:                        }
                     99:                        if(old.mlen >= new.mlen)
                    100:                                goto bad;
                    101:                }
                    102:                p = old.mdata;
                    103:                old = new;
                    104:                new.mdata = p;
                    105:        }
                    106: }
                    107: static struct D { struct D *a; char *b;} VER = {&VER,"\n81/8/25:btadd.c\n"};
                    108: /*1100001100101101*/

unix.superglobalmegacorp.com

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