URI:
       tcomm.c - plan9port - [fork] Plan 9 from user space
  HTML git clone git://src.adamsgaard.dk/plan9port
   DIR Log
   DIR Files
   DIR Refs
   DIR README
   DIR LICENSE
       ---
       tcomm.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 }