Commit | Line | Data |
---|---|---|
78d90aa3 | 1 | static char *sccsid = "@(#)comm.c 4.2 (Berkeley) %G%"; |
6fe4541f BJ |
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) { | |
78d90aa3 | 163 | perror(s); |
6fe4541f BJ |
164 | exit(1); |
165 | } | |
166 | return(b); | |
167 | } |