1 #include <u.h> 2 #include <libc.h> 3 #include <bio.h> 4 5 #define LB 2048 6 int one; 7 int two; 8 int three; 9 10 char *ldr[3]; 11 12 Biobuf *ib1; 13 Biobuf *ib2; 14 Biobuf *openfil(char*); 15 int rd(Biobuf*, char*); 16 void wr(char*, int); 17 void copy(Biobuf*, char*, int); 18 int compare(char*, char*); 19 20 void 21 main(int argc, char *argv[]) 22 { 23 int l; 24 char lb1[LB],lb2[LB]; 25 26 ldr[0] = ""; 27 ldr[1] = "\t"; 28 ldr[2] = "\t\t"; 29 l = 2; 30 ARGBEGIN{ 31 case '1': 32 if(!one) { 33 one = 1; 34 ldr[1][0] = 35 ldr[2][l--] = '\0'; 36 } 37 break; 38 39 case '2': 40 if(!two) { 41 two = 1; 42 ldr[2][l--] = '\0'; 43 } 44 break; 45 46 case '3': 47 three = 1; 48 break; 49 50 default: 51 goto Usage; 52 53 }ARGEND 54 55 if(argc < 2) { 56 Usage: 57 fprint(2, "usage: comm [-123] file1 file2\n"); 58 exits("usage"); 59 } 60 61 ib1 = openfil(argv[0]); 62 ib2 = openfil(argv[1]); 63 64 65 if(rd(ib1,lb1) < 0){ 66 if(rd(ib2,lb2) < 0) 67 exits(0); 68 copy(ib2,lb2,2); 69 } 70 if(rd(ib2,lb2) < 0) 71 copy(ib1,lb1,1); 72 73 for(;;){ 74 switch(compare(lb1,lb2)) { 75 case 0: 76 wr(lb1,3); 77 if(rd(ib1,lb1) < 0) { 78 if(rd(ib2,lb2) < 0) 79 exits(0); 80 copy(ib2,lb2,2); 81 } 82 if(rd(ib2,lb2) < 0) 83 copy(ib1,lb1,1); 84 continue; 85 86 case 1: 87 wr(lb1,1); 88 if(rd(ib1,lb1) < 0) 89 copy(ib2,lb2,2); 90 continue; 91 92 case 2: 93 wr(lb2,2); 94 if(rd(ib2,lb2) < 0) 95 copy(ib1,lb1,1); 96 continue; 97 } 98 } 99 } 100 101 int 102 rd(Biobuf *file, char *buf) 103 { 104 int i, c; 105 106 i = 0; 107 while((c = Bgetc(file)) != Beof) { 108 *buf = c; 109 if(c == '\n' || i > LB-2) { 110 *buf = '\0'; 111 return 0; 112 } 113 i++; 114 buf++; 115 } 116 return -1; 117 } 118 119 void 120 wr(char *str, int n) 121 { 122 123 switch(n){ 124 case 1: 125 if(one) 126 return; 127 break; 128 129 case 2: 130 if(two) 131 return; 132 break; 133 134 case 3: 135 if(three) 136 return; 137 } 138 print("%s%s\n", ldr[n-1],str); 139 } 140 141 void 142 copy(Biobuf *ibuf, char *lbuf, int n) 143 { 144 do 145 wr(lbuf,n); 146 while(rd(ibuf,lbuf) >= 0); 147 exits(0); 148 } 149 150 int 151 compare(char *a, char *b) 152 { 153 while(*a == *b){ 154 if(*a == '\0') 155 return 0; 156 a++; 157 b++; 158 } 159 if(*a < *b) 160 return 1; 161 return 2; 162 } 163 164 Biobuf* 165 openfil(char *s) 166 { 167 Biobuf *b; 168 169 if(s[0]=='-' && s[1]==0) 170 s = "/fd/0"; 171 b = Bopen(s, OREAD); 172 if(b) 173 return b; 174 fprint(2,"comm: cannot open %s: %r\n",s); 175 exits("open"); 176 return 0; /* shut up ken */ 177 } 178