Blame


1 bc7cb1a1 2003-11-23 devnull #include <u.h>
2 bc7cb1a1 2003-11-23 devnull #include <libc.h>
3 bc7cb1a1 2003-11-23 devnull
4 bc7cb1a1 2003-11-23 devnull #define BUF 65536
5 bc7cb1a1 2003-11-23 devnull
6 bc7cb1a1 2003-11-23 devnull int sflag = 0;
7 bc7cb1a1 2003-11-23 devnull int lflag = 0;
8 bc7cb1a1 2003-11-23 devnull int Lflag = 0;
9 bc7cb1a1 2003-11-23 devnull
10 bc7cb1a1 2003-11-23 devnull static void usage(void);
11 bc7cb1a1 2003-11-23 devnull
12 bc7cb1a1 2003-11-23 devnull void
13 bc7cb1a1 2003-11-23 devnull main(int argc, char *argv[])
14 bc7cb1a1 2003-11-23 devnull {
15 bc7cb1a1 2003-11-23 devnull int n, i;
16 bc7cb1a1 2003-11-23 devnull uchar *p, *q;
17 bc7cb1a1 2003-11-23 devnull uchar buf1[BUF], buf2[BUF];
18 bc7cb1a1 2003-11-23 devnull int f1, f2;
19 bc7cb1a1 2003-11-23 devnull vlong nc = 1, o, l = 1;
20 bc7cb1a1 2003-11-23 devnull char *name1, *name2;
21 bc7cb1a1 2003-11-23 devnull uchar *b1s, *b1e, *b2s, *b2e;
22 bc7cb1a1 2003-11-23 devnull
23 bc7cb1a1 2003-11-23 devnull ARGBEGIN{
24 bc7cb1a1 2003-11-23 devnull case 's': sflag = 1; break;
25 bc7cb1a1 2003-11-23 devnull case 'l': lflag = 1; break;
26 bc7cb1a1 2003-11-23 devnull case 'L': Lflag = 1; break;
27 bc7cb1a1 2003-11-23 devnull default: usage();
28 bc7cb1a1 2003-11-23 devnull }ARGEND
29 bc7cb1a1 2003-11-23 devnull if(argc < 2)
30 bc7cb1a1 2003-11-23 devnull usage();
31 bc7cb1a1 2003-11-23 devnull if((f1 = open(name1 = *argv++, OREAD)) == -1){
32 bc7cb1a1 2003-11-23 devnull if(!sflag) perror(name1);
33 bc7cb1a1 2003-11-23 devnull exits("open");
34 bc7cb1a1 2003-11-23 devnull }
35 bc7cb1a1 2003-11-23 devnull if((f2 = open(name2 = *argv++, OREAD)) == -1){
36 bc7cb1a1 2003-11-23 devnull if(!sflag) perror(name2);
37 bc7cb1a1 2003-11-23 devnull exits("open");
38 bc7cb1a1 2003-11-23 devnull }
39 bc7cb1a1 2003-11-23 devnull if(*argv){
40 bc7cb1a1 2003-11-23 devnull o = strtoll(*argv++, 0, 0);
41 bc7cb1a1 2003-11-23 devnull if(seek(f1, o, 0) < 0){
42 bc7cb1a1 2003-11-23 devnull if(!sflag) perror("cmp: seek by offset1");
43 bc7cb1a1 2003-11-23 devnull exits("seek 1");
44 bc7cb1a1 2003-11-23 devnull }
45 bc7cb1a1 2003-11-23 devnull }
46 bc7cb1a1 2003-11-23 devnull if(*argv){
47 bc7cb1a1 2003-11-23 devnull o = strtoll(*argv++, 0, 0);
48 bc7cb1a1 2003-11-23 devnull if(seek(f2, o, 0) < 0){
49 bc7cb1a1 2003-11-23 devnull if(!sflag) perror("cmp: seek by offset2");
50 bc7cb1a1 2003-11-23 devnull exits("seek 2");
51 bc7cb1a1 2003-11-23 devnull }
52 bc7cb1a1 2003-11-23 devnull }
53 bc7cb1a1 2003-11-23 devnull if(*argv)
54 bc7cb1a1 2003-11-23 devnull usage();
55 bc7cb1a1 2003-11-23 devnull b1s = b1e = buf1;
56 bc7cb1a1 2003-11-23 devnull b2s = b2e = buf2;
57 bc7cb1a1 2003-11-23 devnull for(;;){
58 bc7cb1a1 2003-11-23 devnull if(b1s >= b1e){
59 bc7cb1a1 2003-11-23 devnull if(b1s >= &buf1[BUF])
60 bc7cb1a1 2003-11-23 devnull b1s = buf1;
61 bc7cb1a1 2003-11-23 devnull n = read(f1, b1s, &buf1[BUF] - b1s);
62 bc7cb1a1 2003-11-23 devnull b1e = b1s + n;
63 bc7cb1a1 2003-11-23 devnull }
64 bc7cb1a1 2003-11-23 devnull if(b2s >= b2e){
65 bc7cb1a1 2003-11-23 devnull if(b2s >= &buf2[BUF])
66 bc7cb1a1 2003-11-23 devnull b2s = buf2;
67 bc7cb1a1 2003-11-23 devnull n = read(f2, b2s, &buf2[BUF] - b2s);
68 bc7cb1a1 2003-11-23 devnull b2e = b2s + n;
69 bc7cb1a1 2003-11-23 devnull }
70 bc7cb1a1 2003-11-23 devnull n = b2e - b2s;
71 bc7cb1a1 2003-11-23 devnull if(n > b1e - b1s)
72 bc7cb1a1 2003-11-23 devnull n = b1e - b1s;
73 bc7cb1a1 2003-11-23 devnull if(n <= 0)
74 bc7cb1a1 2003-11-23 devnull break;
75 bc7cb1a1 2003-11-23 devnull if(memcmp((void *)b1s, (void *)b2s, n) != 0){
76 bc7cb1a1 2003-11-23 devnull if(sflag)
77 bc7cb1a1 2003-11-23 devnull exits("differ");
78 bc7cb1a1 2003-11-23 devnull for(p = b1s, q = b2s, i = 0; i < n; p++, q++, i++) {
79 bc7cb1a1 2003-11-23 devnull if(*p == '\n')
80 bc7cb1a1 2003-11-23 devnull l++;
81 bc7cb1a1 2003-11-23 devnull if(*p != *q){
82 bc7cb1a1 2003-11-23 devnull if(!lflag){
83 bc7cb1a1 2003-11-23 devnull print("%s %s differ: char %lld",
84 bc7cb1a1 2003-11-23 devnull name1, name2, nc+i);
85 bc7cb1a1 2003-11-23 devnull print(Lflag?" line %lld\n":"\n", l);
86 bc7cb1a1 2003-11-23 devnull exits("differ");
87 bc7cb1a1 2003-11-23 devnull }
88 bc7cb1a1 2003-11-23 devnull print("%6lld 0x%.2x 0x%.2x\n", nc+i, *p, *q);
89 bc7cb1a1 2003-11-23 devnull }
90 bc7cb1a1 2003-11-23 devnull }
91 fa325e9b 2020-01-10 cross }
92 bc7cb1a1 2003-11-23 devnull if(Lflag)
93 bc7cb1a1 2003-11-23 devnull for(p = b1s; p < b1e;)
94 bc7cb1a1 2003-11-23 devnull if(*p++ == '\n')
95 bc7cb1a1 2003-11-23 devnull l++;
96 bc7cb1a1 2003-11-23 devnull nc += n;
97 bc7cb1a1 2003-11-23 devnull b1s += n;
98 bc7cb1a1 2003-11-23 devnull b2s += n;
99 bc7cb1a1 2003-11-23 devnull }
100 bc7cb1a1 2003-11-23 devnull if(b1e - b1s == b2e - b2s)
101 bc7cb1a1 2003-11-23 devnull exits((char *)0);
102 bc7cb1a1 2003-11-23 devnull if(!sflag)
103 bc7cb1a1 2003-11-23 devnull print("EOF on %s\n", (b1e - b1s > b2e - b2s)? name2 : name1);
104 bc7cb1a1 2003-11-23 devnull exits("EOF");
105 bc7cb1a1 2003-11-23 devnull }
106 bc7cb1a1 2003-11-23 devnull
107 bc7cb1a1 2003-11-23 devnull static void
108 bc7cb1a1 2003-11-23 devnull usage(void)
109 bc7cb1a1 2003-11-23 devnull {
110 a4af25bc 2022-09-06 crossd fprint(2, "Usage: cmp [-lsL] file1 file2 [offset1 [offset2] ]\n");
111 bc7cb1a1 2003-11-23 devnull exits("usage");
112 bc7cb1a1 2003-11-23 devnull }