Annotation of researchv9/cmd/cmp.c, revision 1.1

1.1     ! root        1: #define                BUF             4096
        !             2: 
        !             3: int sflag = 0;
        !             4: int lflag = 0;
        !             5: int Lflag = 0;
        !             6: 
        !             7: main(argc, argv)
        !             8:        char **argv;
        !             9: {
        !            10:        register n1, n2, n;
        !            11:        unsigned char buf1[BUF], buf2[BUF];
        !            12:        register unsigned char *p, *q;
        !            13:        int f1, f2, i, nn;
        !            14:        long nc = 1, o, otoi(), l=1, l1;
        !            15:        char *name1, *name2, *a;
        !            16:        unsigned char *b1s, *b1e, *b2s, *b2e;
        !            17: 
        !            18:        for(n=1; n<argc && (*argv[n] == '-'); n++)
        !            19:                for(a = &argv[n][1]; *a; a++)
        !            20:                        switch(*a) {
        !            21:                        case 's':       sflag = 1; break;
        !            22:                        case 'l':       lflag = 1; break;
        !            23:                        case 'L':       Lflag = 1; break;
        !            24:                        default:        usage();
        !            25:                        }
        !            26:        if(n > argc-2)
        !            27:                usage();
        !            28:        if((f1 = open(name1 = argv[n++], 0)) == -1){
        !            29:                perror(name1);
        !            30:                exit(2);
        !            31:        }
        !            32:        if((f2 = open(name2 = argv[n++], 0)) == -1){
        !            33:                perror(name2);
        !            34:                exit(2);
        !            35:        }
        !            36:        if(n < argc){
        !            37:                o = otoi(argv[n++]);
        !            38:                if(lseek(f1, o, 0) < 0){
        !            39:                        perror("cmp: lseek by offset1");
        !            40:                        exit(2);
        !            41:                }
        !            42:        }
        !            43:        if(n < argc){
        !            44:                o = otoi(argv[n++]);
        !            45:                if(lseek(f2, o, 0) < 0){
        !            46:                        perror("cmp: lseek by offset2");
        !            47:                        exit(2);
        !            48:                }
        !            49:        }
        !            50:        if(n < argc)
        !            51:                usage();
        !            52:        b1s = b1e = buf1;
        !            53:        b2s = b2e = buf2;
        !            54:        for(;;){
        !            55:                register unsigned char *ep;
        !            56: 
        !            57:                if(b1s >= b1e){
        !            58:                        if(b1s >= &buf1[BUF])
        !            59:                                b1s = buf1;
        !            60:                        n1 = read(f1, b1s,  &buf1[BUF] - b1s);
        !            61:                        b1e = b1s + n1;
        !            62:                }
        !            63:                if(b2s >= b2e){
        !            64:                        if(b2s >= &buf2[BUF])
        !            65:                                b2s = buf2;
        !            66:                        n2 = read(f2, b2s,  &buf2[BUF] - b2s);
        !            67:                        b2e = b2s + n2;
        !            68:                }
        !            69:                n = n2;
        !            70:                if(n1 < n2) n = n1;
        !            71:                if(n <= 0)
        !            72:                        break;
        !            73:                if(memcmp(b1s, b2s, n) != 0){
        !            74:                        if(sflag)
        !            75:                                exit(1);
        !            76:                        l1 = 0;
        !            77:                        for(p = b1s, q = b2s, i = 0, nn = n; nn > 0; nn--, p++, q++, i++) {
        !            78:                                if(*p=='\n')
        !            79:                                        l1++;
        !            80:                                if(*p != *q){
        !            81:                                        if(!lflag){
        !            82:                                                printf("%s %s differ: char %d",
        !            83:                                                    name1, name2, nc+i);
        !            84:                                                printf(Lflag?" line %d\n":"\n", l+l1);
        !            85:                                                exit(1);
        !            86:                                        }
        !            87:                                        printf("%6ld %3o %3o\n", nc+i, *p, *q);
        !            88:                                }
        !            89:                        }
        !            90:                }               
        !            91:                if(Lflag)
        !            92:                        for(p = b1s; p < b1e;)
        !            93:                                if(*p++=='\n')
        !            94:                                        l++;
        !            95:                nc += n;
        !            96:                b1s += n;
        !            97:                b2s += n;
        !            98:        }
        !            99:        if(n1 == n2)
        !           100:                exit(0);
        !           101:        if(!sflag)
        !           102:                printf("EOF on %s\n", (n1 > n2)? name2 : name1);
        !           103:        exit(1);
        !           104: }
        !           105: 
        !           106: long
        !           107: otoi(s)
        !           108:        register char *s;
        !           109: {
        !           110:        long n, ok;
        !           111: 
        !           112:        if(*s == '0'){
        !           113:                if(s[1] == 'x')
        !           114:                        ok = sscanf(s, "%lx", &n);
        !           115:                else
        !           116:                        ok = sscanf(s, "%lo", &n);
        !           117:        } else
        !           118:                ok = sscanf(s, "%ld", &n);
        !           119:        if (ok!=1)
        !           120:                usage();
        !           121:        return(n);
        !           122: }
        !           123: 
        !           124: usage()
        !           125: {
        !           126:        printf("Usage: cmp [-ls] file1 file2 [offset1 [offset2] ]\n");
        !           127:        exit(2);
        !           128: }

unix.superglobalmegacorp.com

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