Commit | Line | Data |
---|---|---|
9c79dca0 BJ |
1 | #include <stdio.h> |
2 | #define LB 256 | |
3 | int one; | |
4 | int two; | |
5 | int three; | |
6 | ||
7 | char *ldr[3]; | |
8 | ||
9 | FILE *ib1; | |
10 | FILE *ib2; | |
11 | FILE *openfil(); | |
12 | main(argc,argv) | |
13 | char *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 | ||
93 | rd(file,buf) | |
94 | FILE *file; | |
95 | char *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 | ||
112 | wr(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 | ||
132 | copy(ibuf,lbuf,n) | |
133 | FILE *ibuf; | |
134 | char *lbuf; | |
135 | { | |
136 | do { | |
137 | wr(lbuf,n); | |
138 | } while(rd(ibuf,lbuf) >= 0); | |
139 | ||
140 | exit(0); | |
141 | } | |
142 | ||
143 | compare(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 | } | |
155 | FILE *openfil(s) | |
156 | char *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 | } |