date and time created 80/10/01 17:25:50 by bill
authorBill Joy <bill@ucbvax.Berkeley.EDU>
Thu, 2 Oct 1980 09:25:50 +0000 (01:25 -0800)
committerBill Joy <bill@ucbvax.Berkeley.EDU>
Thu, 2 Oct 1980 09:25:50 +0000 (01:25 -0800)
SCCS-vsn: usr.bin/comm/comm.c 4.1

usr/src/usr.bin/comm/comm.c [new file with mode: 0644]

diff --git a/usr/src/usr.bin/comm/comm.c b/usr/src/usr.bin/comm/comm.c
new file mode 100644 (file)
index 0000000..95a21de
--- /dev/null
@@ -0,0 +1,167 @@
+static char *sccsid = "@(#)comm.c      4.1 (Berkeley) %G%";
+#include <stdio.h>
+#define LB 256
+int    one;
+int    two;
+int    three;
+
+char   *ldr[3];
+
+FILE *ib1;
+FILE *ib2;
+FILE *openfil();
+main(argc,argv)
+char   *argv[];
+{
+       int     l;
+       char    lb1[LB],lb2[LB];
+
+       ldr[0] = "";
+       ldr[1] = "\t";
+       ldr[2] = "\t\t";
+       if(argc > 1)  {
+               if(*argv[1] == '-' && argv[1][1] != 0) {
+                       l = 1;
+                       while(*++argv[1]) {
+                               switch(*argv[1]) {
+                               case'1':
+                                       if(!one) {
+                                               one = 1;
+                                               ldr[1][0] =
+                                               ldr[2][l--] = '\0';
+                                       }
+                                       break;
+                               case '2':
+                                       if(!two) {
+                                               two = 1;
+                                               ldr[2][l--] = '\0';
+                                       }
+                                       break;
+                               case '3':
+                                       three = 1;
+                                       break;
+                               default:
+                               fprintf(stderr,"comm: illegal flag\n");
+                               exit(1);
+                               }
+                       }
+                       argv++;
+                       argc--;
+               }
+       }
+
+       if(argc < 3) {
+               fprintf(stderr,"comm: arg count\n");
+               exit(1);
+       }
+
+       ib1 = openfil(argv[1]);
+       ib2 = openfil(argv[2]);
+
+
+       if(rd(ib1,lb1) < 0) {
+               if(rd(ib2,lb2) < 0)     exit(0);
+               copy(ib2,lb2,2);
+       }
+       if(rd(ib2,lb2) < 0)     copy(ib1,lb1,1);
+
+       while(1) {
+
+               switch(compare(lb1,lb2)) {
+
+                       case 0:
+                               wr(lb1,3);
+                               if(rd(ib1,lb1) < 0) {
+                                       if(rd(ib2,lb2) < 0)     exit(0);
+                                       copy(ib2,lb2,2);
+                               }
+                               if(rd(ib2,lb2) < 0)     copy(ib1,lb1,1);
+                               continue;
+
+                       case 1:
+                               wr(lb1,1);
+                               if(rd(ib1,lb1) < 0)     copy(ib2,lb2,2);
+                               continue;
+
+                       case 2:
+                               wr(lb2,2);
+                               if(rd(ib2,lb2) < 0)     copy(ib1,lb1,1);
+                               continue;
+               }
+       }
+}
+
+rd(file,buf)
+FILE *file;
+char *buf;
+{
+
+       register int i, c;
+       i = 0;
+       while((c = getc(file)) != EOF) {
+               *buf = c;
+               if(c == '\n' || i > LB-2) {
+                       *buf = '\0';
+                       return(0);
+               }
+               i++;
+               buf++;
+       }
+       return(-1);
+}
+
+wr(str,n)
+       char    *str;
+{
+
+       switch(n) {
+
+               case 1:
+                       if(one) return;
+                       break;
+
+               case 2:
+                       if(two) return;
+                       break;
+
+               case 3:
+                       if(three)       return;
+       }
+       printf("%s%s\n",ldr[n-1],str);
+}
+
+copy(ibuf,lbuf,n)
+FILE *ibuf;
+char *lbuf;
+{
+       do {
+               wr(lbuf,n);
+       } while(rd(ibuf,lbuf) >= 0);
+
+       exit(0);
+}
+
+compare(a,b)
+       char    *a,*b;
+{
+       register char *ra,*rb;
+
+       ra = --a;
+       rb = --b;
+       while(*++ra == *++rb)
+               if(*ra == '\0') return(0);
+       if(*ra < *rb)   return(1);
+       return(2);
+}
+FILE *openfil(s)
+char *s;
+{
+       FILE *b;
+       if(s[0]=='-' && s[1]==0)
+               b = stdin;
+       else if((b=fopen(s,"r")) == NULL) {
+               fprintf(stderr,"comm: cannot open %s\n",s);
+               exit(1);
+       }
+       return(b);
+}