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