cmp.c - sbase - suckless unix tools | |
git clone git://git.suckless.org/sbase | |
Log | |
Files | |
Refs | |
README | |
LICENSE | |
--- | |
cmp.c (1419B) | |
--- | |
1 /* See LICENSE file for copyright and license details. */ | |
2 #include <stdio.h> | |
3 #include <stdlib.h> | |
4 #include <string.h> | |
5 | |
6 #include "util.h" | |
7 | |
8 static void | |
9 usage(void) | |
10 { | |
11 enprintf(2, "usage: %s [-l | -s] file1 file2\n", argv0); | |
12 } | |
13 | |
14 int | |
15 main(int argc, char *argv[]) | |
16 { | |
17 FILE *fp[2]; | |
18 size_t line = 1, n; | |
19 int ret = 0, lflag = 0, sflag = 0, same = 1, b[2]; | |
20 | |
21 ARGBEGIN { | |
22 case 'l': | |
23 lflag = 1; | |
24 break; | |
25 case 's': | |
26 sflag = 1; | |
27 break; | |
28 default: | |
29 usage(); | |
30 } ARGEND | |
31 | |
32 if (argc != 2 || (lflag && sflag)) | |
33 usage(); | |
34 | |
35 for (n = 0; n < 2; n++) { | |
36 if (!strcmp(argv[n], "-")) { | |
37 argv[n] = "<stdin>"; | |
38 fp[n] = stdin; | |
39 } else { | |
40 if (!(fp[n] = fopen(argv[n], "r"))) { | |
41 if (!sflag) | |
42 weprintf("fopen %s:", argv[n]); | |
43 return 2; | |
44 } | |
45 } | |
46 } | |
47 | |
48 for (n = 1; ; n++) { | |
49 b[0] = getc(fp[0]); | |
50 b[1] = getc(fp[1]); | |
51 | |
52 if (b[0] == b[1]) { | |
53 if (b[0] == EOF) | |
54 break; | |
55 else if (b[0] == '\n') | |
56 line++; | |
57 continue; | |
58 } else if (b[0] == EOF || b[1] == EOF) { | |
59 if (!sflag) | |
60 weprintf("EOF on %s\n", argv[(b[0] != EO… | |
61 same = 0; | |
62 break; | |
63 } else if (!lflag) { | |
64 if (!sflag) | |
65 printf("%s %s differ: byte %zu, line %zu… | |
66 argv[0], argv[1], n, line); | |
67 same = 0; | |
68 break; | |
69 } else { | |
70 printf("%zu %o %o\n", n, b[0], b[1]); | |
71 same = 0; | |
72 } | |
73 } | |
74 | |
75 if (!ret) | |
76 ret = !same; | |
77 if (fshut(fp[0], argv[0]) | (fp[0] != fp[1] && fshut(fp[1], argv… | |
78 fshut(stdout, "<stdout>")) | |
79 ret = 2; | |
80 | |
81 return ret; | |
82 } |