BSD 4 release
[unix-history] / usr / src / cmd / comm.c
CommitLineData
31cef89c 1static char *sccsid = "@(#)comm.c 4.1 (Berkeley) 10/1/80";
6fe4541f
BJ
2#include <stdio.h>
3#define LB 256
4int one;
5int two;
6int three;
7
8char *ldr[3];
9
10FILE *ib1;
11FILE *ib2;
12FILE *openfil();
13main(argc,argv)
14char *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
94rd(file,buf)
95FILE *file;
96char *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
113wr(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
133copy(ibuf,lbuf,n)
134FILE *ibuf;
135char *lbuf;
136{
137 do {
138 wr(lbuf,n);
139 } while(rd(ibuf,lbuf) >= 0);
140
141 exit(0);
142}
143
144compare(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}
156FILE *openfil(s)
157char *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}