|
|
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, atol(), 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: argerr(name1); ! 30: if((f2 = open(name2 = argv[n++], 0)) == -1) ! 31: argerr(name2); ! 32: if(n < argc){ ! 33: o = atol(argv[n++]); ! 34: if(lseek(f1, o, 0) < 0) ! 35: argerr("cmp: lseek by offset1"); ! 36: } ! 37: if(n < argc){ ! 38: o = atol(argv[n++]); ! 39: if(lseek(f2, o, 0) < 0) ! 40: argerr("cmp: lseek by offset2"); ! 41: } ! 42: if(n < argc) ! 43: usage(); ! 44: b1s = b1e = buf1; ! 45: b2s = b2e = buf2; ! 46: for(;;){ ! 47: if(b1s >= b1e){ ! 48: if(b1s >= &buf1[BUF]) ! 49: b1s = buf1; ! 50: n1 = read(f1, b1s, &buf1[BUF] - b1s); ! 51: b1e = b1s + n1; ! 52: } ! 53: if(b2s >= b2e){ ! 54: if(b2s >= &buf2[BUF]) ! 55: b2s = buf2; ! 56: n2 = read(f2, b2s, &buf2[BUF] - b2s); ! 57: b2e = b2s + n2; ! 58: } ! 59: n = n2; ! 60: if(n1 < n2) n = n1; ! 61: if(n <= 0) ! 62: break; ! 63: if(memcmp(b1s, b2s, n) != 0){ ! 64: if(sflag) ! 65: exit(1); ! 66: l1 = 0; ! 67: for(p = b1s, q = b2s, i = 0, nn = n; nn > 0; nn--, p++, q++, i++) { ! 68: if(*p=='\n') ! 69: l1++; ! 70: if(*p != *q){ ! 71: if(!lflag){ ! 72: printf("%s %s differ: char %d", ! 73: name1, name2, nc+i); ! 74: printf(Lflag?" line %d\n":"\n", l+l1); ! 75: exit(1); ! 76: } ! 77: printf("%6ld %3o %3o\n", nc+i, *p, *q); ! 78: } ! 79: } ! 80: } ! 81: if(Lflag) ! 82: for(p = b1s; p < b1e;) ! 83: if(*p++=='\n') ! 84: l++; ! 85: nc += n; ! 86: b1s += n; ! 87: b2s += n; ! 88: } ! 89: if(n1 == n2) ! 90: exit(0); ! 91: if(!sflag) ! 92: printf("EOF on %s\n", (n1 > n2)? name2 : name1); ! 93: exit(1); ! 94: } ! 95: ! 96: long ! 97: atol(s) ! 98: char *s; ! 99: { ! 100: long n; ! 101: int f; ! 102: ! 103: n = 0; ! 104: f = 0; ! 105: while (*s == ' ' || *s == '\t') ! 106: s++; ! 107: if (*s == '-') { ! 108: f = 1; ! 109: s++; ! 110: } ! 111: if (s[0] == '0' && s[1]){ ! 112: if (s[1] == 'x' || s[1] == 'X') { ! 113: s += 2; ! 114: for (;;) { ! 115: if (*s >= '0' && *s <= '9') ! 116: n = n*16 + *s++ - '0'; ! 117: else if (*s >= 'a' && *s <= 'f') ! 118: n = n*16 + *s++ - 'a' + 10; ! 119: else if (*s >= 'A' && *s <= 'F') ! 120: n = n*16 + *s++ - 'A' + 10; ! 121: else ! 122: break; ! 123: } ! 124: } ! 125: else ! 126: while (*s >= '0' && *s <= '7') ! 127: n = n*8 + *s++ - '0'; ! 128: } ! 129: else ! 130: while (*s >= '0' && *s <= '9') ! 131: n = n*10 + *s++ - '0'; ! 132: if (f) ! 133: n = -n; ! 134: return n; ! 135: } ! 136: ! 137: argerr(s) ! 138: char *s; ! 139: { ! 140: if(sflag == 0) ! 141: perror(s); ! 142: exit(2); ! 143: } ! 144: ! 145: usage() ! 146: { ! 147: printf("Usage: cmp [-ls] file1 file2 [offset1 [offset2] ]\n"); ! 148: exit(2); ! 149: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.