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