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