home *** CD-ROM | disk | FTP | other *** search
/ CP/M / CPM_CDROM.iso / lambda / soundpot / p / ut-c.lbr / COMM.CZ / COMM.C
Encoding:
C/C++ Source or Header  |  1993-10-25  |  4.3 KB  |  143 lines

  1. /* comm.c -- UTOOL. Print lines common to two sorted files
  2.  
  3.      author: David H. Wolen
  4.      last change: 11/29/82
  5.  
  6.      usage:    comm -123 file1 file2
  7.                prog |comm file1
  8.  
  9.      options:  -n (n=1,2,3) print only named columns
  10.                             (default is print all 3)
  11.  
  12.      input:    2 files or file and STDIN
  13.      output:   STDOUT
  14.  
  15.      notes:    (1) if only one file is given, STDIN is file 2
  16.                (2) col 1 is lines only in file 1
  17.                    col 2 is lines only in file 2
  18.                    col 3 is lines in both files
  19.  
  20.      linkage:  a:clink comm -f dio -ca (uses deff3.crl)
  21. */
  22.  
  23. #include "a:bdscio.h"
  24. #include "dio.h"
  25.  
  26. #define  STDIN  0
  27. #define  STDOUT 1
  28.  
  29. main(argc,argv)
  30. int  argc;
  31. char *argv[];
  32. {
  33.      int  isstdin, c1flg, c2flg, c3flg, stat1, stat2, k;
  34.      char *s, buf1[BUFSIZ], buf2[BUFSIZ], line1[MAXLINE],
  35.           line2[MAXLINE];
  36.  
  37.  
  38.      dioinit(&argc,argv);
  39.      c1flg=c2flg=c3flg=FALSE;
  40.  
  41.      /* process options */
  42.  
  43.      while(--argc > 0 && (*++argv)[0] == '-')
  44.           for(s=argv[0]+1; *s != '\0'; s++)
  45.                switch(*s)
  46.                     {case '1': c1flg=TRUE; break;
  47.                     case  '2': c2flg=TRUE; break;
  48.                     case  '3': c3flg=TRUE; break;
  49.                     default:   error("comm: invalid option");
  50.                     }
  51.  
  52.      if(!c1flg && !c2flg && !c3flg)
  53.           c1flg=c2flg=c3flg=TRUE;
  54.  
  55.      /* open file or files */
  56.  
  57.      switch(argc)
  58.           {case 1:       /* 1 file and STDIN */
  59.                isstdin=TRUE;
  60.                if(fopen(*argv,buf1)==ERROR)
  61.                     error("comm: can't open file");
  62.                break;
  63.           case 2:        /* 2 files */
  64.                isstdin=FALSE;
  65.                if(fopen(*argv++,buf1)==ERROR)
  66.                     error("comm: can't open file 1");
  67.                if(fopen(*argv,buf2)==ERROR)
  68.                     error("comm: can't open file 2");
  69.                break;
  70.           default:
  71.                error("usage: comm [-123] file1 file2 or file STDIN");
  72.           }
  73.  
  74.      /* process */
  75.  
  76.      stat1=fgets(line1,buf1);
  77.      stat2=(isstdin) ? fgets(line2,STDIN) : fgets(line2,buf2);
  78.  
  79.      while(1)
  80.           {if(!stat1 || !stat2)  break;
  81.           k=strcmp(line1,line2);
  82.           if(k < 0)      /* line only in file 1 */
  83.                {if(c1flg)  prntcol(line1,1,c1flg,c2flg,c3flg);
  84.                stat1=fgets(line1,buf1);
  85.                }
  86.           else if(k > 0) /* line only in file 2 */
  87.                {if(c2flg)  prntcol(line2,2,c1flg,c2flg,c3flg);
  88.                stat2=(isstdin) ? fgets(line2,STDIN) : fgets(line2,buf2);
  89.                }
  90.           else           /* line in both files */
  91.                {if(c3flg)  prntcol(line1,3,c1flg,c2flg,c3flg);
  92.                stat1=fgets(line1,buf1);
  93.                stat2=(isstdin) ? fgets(line2,STDIN) : fgets(line2,buf2);
  94.                }
  95.           }
  96.  
  97.      if(!stat1 && c2flg) /* end of file 1, print rest of file 2 */
  98.           while(stat2)
  99.                {prntcol(line2,2,c1flg,c2flg,c3flg);
  100.                stat2=(isstdin) ? fgets(line2,STDIN) : fgets(line2,buf2);
  101.                }
  102.      else if(!stat2 && c1flg) /* end of file 2, print rest of file 1 */
  103.           while(stat1)
  104.                {prntcol(line1,1,c1flg,c2flg,c3flg);
  105.                stat1=fgets(line1,buf1);
  106.                }
  107.  
  108.      dioflush();
  109. }
  110.  
  111.  
  112.  
  113. /* prntcol -- print line as column col */
  114. prntcol(line,col,c1flg,c2flg,c3flg)
  115. char *line;
  116. int  col, c1flg, c2flg, c3flg;
  117. {
  118.      int  i;
  119.  
  120.      for(i=0; isspace(line[i]); i++) ;    /* skip leading white space */
  121.  
  122.      switch(col)
  123.           {case 1:
  124.                fputs(&line[i],STDOUT);
  125.                break;
  126.           case 2:
  127.                if(c1flg)    /* 15 blanks */
  128.                     fputs("               ",STDOUT);
  129.                fputs(&line[i],STDOUT);
  130.                break;
  131.           case 3:
  132.                if(c1flg)    /* 10 blanks */
  133.                     fputs("          ",STDOUT);
  134.                if(c2flg)    /* 15 blanks */
  135.                     fputs("               ",STDOUT);
  136.                fputs(&line[i],STDOUT);
  137.                break;
  138.           default:
  139.                error("prntcol: can't happen");
  140.           }
  141. }
  142.  
  143.