|
|
1.1 root 1: /*
2: * Compare two files.
3: */
4:
5: #include <stdio.h>
6: #include <sys/types.h>
7:
8: #define isdigit(c) ((c)>='0'&&(c)<='9')
9:
10: int lflag; /* Print all differences */
11: int sflag; /* Return status only */
12: int differ; /* Non-zero if files differ */
13: long byteno;
14: long lineno = 1;
15: fsize_t skip1, skip2;
16: long atol();
17:
18: char eopen[] = "Cannot open %s\n";
19: char usage[] = "Usage: cmp [-l] [-s] file1 file2 [skip1 skip2]\n";
20: #if HEX
21: char diffl[] = "%ld: 0x%02x 0x%02x\n";
22: #else
23: char diffl[] = "%ld: %3o %3o\n";
24: #endif
25: char diffn[] = "%s, %s differ at char %ld, line %ld\n";
26:
27: main(argc, argv)
28: char *argv[];
29: {
30: #ifdef MSDOS
31: msdoscvt("cmp", &argc, &argv);
32: #endif
33: if (argc > 1) {
34: if (*argv[1] == '-') {
35: if (argv[1][1]=='s' && argv[1][2]=='\0')
36: sflag = 1;
37: else if (argv[1][1]=='l' && argv[1][2]=='\0')
38: lflag = 1;
39: else if (argv[1][1] == '\0') {
40: argc++;
41: argv--;
42: } else
43: err(usage);
44: argc--;
45: argv++;
46: }
47: }
48: if (argc==5 && isdigit(*argv[3]) && isdigit(*argv[4])) {
49: skip1 = atol(argv[3]);
50: skip2 = atol(argv[4]);
51: argc -= 2;
52: }
53: if (argc != 3)
54: err(usage);
55: cmp(argv[1], argv[2]);
56: exit(differ ? 1 : 0);
57: }
58:
59: /*
60: * Do the work of comparing the two files
61: */
62: cmp(a, b)
63: char *a, *b;
64: {
65: FILE *fp1, *fp2;
66: register c1, c2;
67:
68: if (a[0]=='-' && a[1]=='\0') {
69: fp1 = stdin;
70: #ifdef MSDOS
71: _setbinary(stdin);
72: #endif
73: }
74: else if ((fp1 = fopen(a, "rb")) == NULL)
75: err(eopen, a);
76: if ((fp2 = fopen(b, "rb")) == NULL)
77: err(eopen, b);
78: while (skip1--)
79: if ((c1 = getc(fp1)) == EOF) {
80: remark("EOF in skipping on %s\n", a);
81: exit(1);
82: }
83: while (skip2--)
84: if ((c2 = getc(fp2)) == EOF) {
85: remark("EOF in skipping on %s\n", b);
86: exit(1);
87: }
88: for (;;) {
89: c1 = getc(fp1);
90: c2 = getc(fp2);
91: if (c1==EOF || c2==EOF)
92: break;
93: byteno++;
94: if (c1 != c2) {
95: differ = 1;
96: if (lflag)
97: remark(diffl, byteno, c1, c2);
98: else {
99: remark(diffn, a, b, byteno, lineno);
100: return;
101: }
102: }
103: if (c1 == '\n')
104: lineno++;
105: }
106: if (c1 != c2) {
107: remark("EOF on %s\n", c1==EOF ? a : b);
108: differ = 1;
109: }
110: }
111:
112: err(x)
113: {
114: if (!sflag)
115: fprintf(stderr, "%r", &x);
116: exit(2);
117: }
118:
119: remark(x)
120: {
121: if (!sflag)
122: printf("%r", &x);
123: }
This archive runs on limited infrastructure. Preserving old code on modern bandwidth. Automated agents are requested to crawl responsibly.