xref: /original-bsd/usr.bin/cmp/cmp.c (revision 92d3de31)
1 static char *sccsid = "@(#)cmp.c	4.2 (Berkeley) 04/29/83";
2 #include <stdio.h>
3 #include <ctype.h>
4 
5 FILE	*file1,*file2;
6 int	eflg;
7 int	lflg	= 1;
8 long	line	= 1;
9 long	chr	= 0;
10 long	skip1;
11 long	skip2;
12 
13 long	otoi();
14 
15 main(argc, argv)
16 char **argv;
17 {
18 	register c1, c2;
19 	char *arg;
20 
21 	if(argc < 3)
22 		goto narg;
23 	arg = argv[1];
24 	if(arg[0] == '-' && arg[1] == 's') {
25 		lflg--;
26 		argv++;
27 		argc--;
28 	}
29 	arg = argv[1];
30 	if(arg[0] == '-' && arg[1] == 'l') {
31 		lflg++;
32 		argv++;
33 		argc--;
34 	}
35 	if(argc < 3)
36 		goto narg;
37 	arg = argv[1];
38 	if( arg[0]=='-' && arg[1]==0 )
39 		file1 = stdin;
40 	else if((file1 = fopen(arg, "r")) == NULL)
41 		goto barg;
42 	arg = argv[2];
43 	if((file2 = fopen(arg, "r")) == NULL)
44 		goto barg;
45 	if (argc>3)
46 		skip1 = otoi(argv[3]);
47 	if (argc>4)
48 		skip2 = otoi(argv[4]);
49 	while (skip1) {
50 		if ((c1 = getc(file1)) == EOF) {
51 			arg = argv[1];
52 			goto earg;
53 		}
54 		skip1--;
55 	}
56 	while (skip2) {
57 		if ((c2 = getc(file2)) == EOF) {
58 			arg = argv[2];
59 			goto earg;
60 		}
61 		skip2--;
62 	}
63 
64 loop:
65 	chr++;
66 	c1 = getc(file1);
67 	c2 = getc(file2);
68 	if(c1 == c2) {
69 		if (c1 == '\n')
70 			line++;
71 		if(c1 == EOF) {
72 			if(eflg)
73 				exit(1);
74 			exit(0);
75 		}
76 		goto loop;
77 	}
78 	if(lflg == 0)
79 		exit(1);
80 	if(c1 == EOF) {
81 		arg = argv[1];
82 		goto earg;
83 	}
84 	if(c2 == EOF)
85 		goto earg;
86 	if(lflg == 1) {
87 		printf("%s %s differ: char %ld, line %ld\n", argv[1], arg,
88 			chr, line);
89 		exit(1);
90 	}
91 	eflg = 1;
92 	printf("%6ld %3o %3o\n", chr, c1, c2);
93 	goto loop;
94 
95 narg:
96 	printf("cmp: arg count\n");
97 	exit(2);
98 
99 barg:
100 	if (lflg)
101 	perror(arg);
102 	exit(2);
103 
104 earg:
105 	printf("cmp: EOF on %s\n", arg);
106 	exit(1);
107 }
108 
109 long otoi(s)
110 char *s;
111 {
112 	long v;
113 	int base;
114 
115 	v = 0;
116 	base = 10;
117 	if (*s == '0')
118 		base = 8;
119 	while(isdigit(*s))
120 		v = v*base + *s++ - '0';
121 	return(v);
122 }
123