xref: /original-bsd/usr.bin/comm/comm.c (revision 552e81d8)
1 static char *sccsid = "@(#)comm.c	4.1 (Berkeley) 10/01/80";
2 #include <stdio.h>
3 #define LB 256
4 int	one;
5 int	two;
6 int	three;
7 
8 char	*ldr[3];
9 
10 FILE *ib1;
11 FILE *ib2;
12 FILE *openfil();
13 main(argc,argv)
14 char	*argv[];
15 {
16 	int	l;
17 	char	lb1[LB],lb2[LB];
18 
19 	ldr[0] = "";
20 	ldr[1] = "\t";
21 	ldr[2] = "\t\t";
22 	if(argc > 1)  {
23 		if(*argv[1] == '-' && argv[1][1] != 0) {
24 			l = 1;
25 			while(*++argv[1]) {
26 				switch(*argv[1]) {
27 				case'1':
28 					if(!one) {
29 						one = 1;
30 						ldr[1][0] =
31 						ldr[2][l--] = '\0';
32 					}
33 					break;
34 				case '2':
35 					if(!two) {
36 						two = 1;
37 						ldr[2][l--] = '\0';
38 					}
39 					break;
40 				case '3':
41 					three = 1;
42 					break;
43 				default:
44 				fprintf(stderr,"comm: illegal flag\n");
45 				exit(1);
46 				}
47 			}
48 			argv++;
49 			argc--;
50 		}
51 	}
52 
53 	if(argc < 3) {
54 		fprintf(stderr,"comm: arg count\n");
55 		exit(1);
56 	}
57 
58 	ib1 = openfil(argv[1]);
59 	ib2 = openfil(argv[2]);
60 
61 
62 	if(rd(ib1,lb1) < 0) {
63 		if(rd(ib2,lb2) < 0)	exit(0);
64 		copy(ib2,lb2,2);
65 	}
66 	if(rd(ib2,lb2) < 0)	copy(ib1,lb1,1);
67 
68 	while(1) {
69 
70 		switch(compare(lb1,lb2)) {
71 
72 			case 0:
73 				wr(lb1,3);
74 				if(rd(ib1,lb1) < 0) {
75 					if(rd(ib2,lb2) < 0)	exit(0);
76 					copy(ib2,lb2,2);
77 				}
78 				if(rd(ib2,lb2) < 0)	copy(ib1,lb1,1);
79 				continue;
80 
81 			case 1:
82 				wr(lb1,1);
83 				if(rd(ib1,lb1) < 0)	copy(ib2,lb2,2);
84 				continue;
85 
86 			case 2:
87 				wr(lb2,2);
88 				if(rd(ib2,lb2) < 0)	copy(ib1,lb1,1);
89 				continue;
90 		}
91 	}
92 }
93 
94 rd(file,buf)
95 FILE *file;
96 char *buf;
97 {
98 
99 	register int i, c;
100 	i = 0;
101 	while((c = getc(file)) != EOF) {
102 		*buf = c;
103 		if(c == '\n' || i > LB-2) {
104 			*buf = '\0';
105 			return(0);
106 		}
107 		i++;
108 		buf++;
109 	}
110 	return(-1);
111 }
112 
113 wr(str,n)
114 	char	*str;
115 {
116 
117 	switch(n) {
118 
119 		case 1:
120 			if(one)	return;
121 			break;
122 
123 		case 2:
124 			if(two)	return;
125 			break;
126 
127 		case 3:
128 			if(three)	return;
129 	}
130 	printf("%s%s\n",ldr[n-1],str);
131 }
132 
133 copy(ibuf,lbuf,n)
134 FILE *ibuf;
135 char *lbuf;
136 {
137 	do {
138 		wr(lbuf,n);
139 	} while(rd(ibuf,lbuf) >= 0);
140 
141 	exit(0);
142 }
143 
144 compare(a,b)
145 	char	*a,*b;
146 {
147 	register char *ra,*rb;
148 
149 	ra = --a;
150 	rb = --b;
151 	while(*++ra == *++rb)
152 		if(*ra == '\0')	return(0);
153 	if(*ra < *rb)	return(1);
154 	return(2);
155 }
156 FILE *openfil(s)
157 char *s;
158 {
159 	FILE *b;
160 	if(s[0]=='-' && s[1]==0)
161 		b = stdin;
162 	else if((b=fopen(s,"r")) == NULL) {
163 		fprintf(stderr,"comm: cannot open %s\n",s);
164 		exit(1);
165 	}
166 	return(b);
167 }
168