Annotation of researchv10no/cmd/cbt/btdelete.c, revision 1.1.1.1

1.1       root        1: #include "stdio.h"
                      2: #include "cbt.h"
                      3: 
                      4: /* read keys from stdin, and delete the records from argv[1] */
                      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: btdelete 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 btdelete\n",
                     38:                                rec.mlen);
                     39:                        abort();
                     40:                }
                     41:                get(rec.mlen, rec.mdata);
                     42:                (void)bdelete(bf, key);
                     43:                if(cflag)
                     44:                        bcheck(bf);
                     45:        }
                     46: }
                     47: get(n, s)
                     48: char *s;
                     49: {      int m;
                     50:        for(m = 0; n > 0; n -= m) {
                     51:                m = read(0, s, n);
                     52:                if(m == 0) {
                     53:                        bclose(bf);
                     54:                        exit(0);
                     55:                }
                     56:                if(m < 0) {
                     57:                        fprintf(stderr, "io error in btdelete\n");
                     58:                        abort();
                     59:                }
                     60:                s += m;
                     61:        }
                     62: }
                     63: 
                     64: mbuf new, old;
                     65: char newbuf[NDSZ], oldbuf[NDSZ];
                     66: bcheck(bf)
                     67: bfile *bf;
                     68: {      long i;
                     69:        int j, k;
                     70:        char *p;
                     71:        bfirst(bf);
                     72:        new.mdata = newbuf;
                     73:        old.mdata = oldbuf;
                     74:        for(i = 0;; i++) {
                     75:                if(bread(bf, &new, (mbuf *)NULL) == EOF)
                     76:                        break;
                     77:                if(i > 0) {
                     78:                        k = new.mlen;
                     79:                        if(old.mlen < new.mlen)
                     80:                                k = old.mlen;
                     81:                        for(j = 0; j < k; j++)
                     82:                                if(new.mdata[j] != old.mdata[j])
                     83:                                        break;
                     84:                        if(j != k) {
                     85:                                if(new.mdata[j] > old.mdata[j])
                     86:                                        continue;
                     87: bad:
                     88:                                fprintf(stderr, "disorder at key %ld\n", i);
                     89:                                key.mdata[key.mlen] = 0;
                     90:                                fprintf(stderr, "key is:%s:\n", key.mdata);
                     91:                                abort();
                     92:                        }
                     93:                        if(old.mlen >= new.mlen)
                     94:                                goto bad;
                     95:                }
                     96:                p = old.mdata;
                     97:                old = new;
                     98:                new.mdata = p;
                     99:        }
                    100: }

unix.superglobalmegacorp.com

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