home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume4 / match1.2 / match.c < prev    next >
C/C++ Source or Header  |  1986-11-30  |  3KB  |  98 lines

  1. #include <stdio.h>
  2. #include <fcntl.h>
  3. #include <sys/file.h>
  4. #ifdef STRINGS
  5. /* some systems use <strings.h>, others use <string.h> */
  6. #include <strings.h>
  7. #else
  8. #include <string.h>
  9. #endif
  10. #include "match.h"
  11. #include "Extern.h"
  12. main(argc,argv)
  13. int argc;
  14. char *argv[];
  15. {
  16.     /* grep based on VAX MATCHC instruction */
  17.     char BigBuff[MAXBUFF + 2];
  18.     /*
  19.     * We leave one extra character at the beginning and end of the buffer,
  20.     * but don't tell Execute about it. This is so when someone is
  21.     * scanning the buffer and scans past the end (or beginning)
  22.     * we are still technically in the buffer (picky, but there ARE
  23.     * machines which would complain)
  24.     */
  25.     int ret = 1, /* return code from Execute */
  26.         NotFound = 0, /* non-zero if file not readable */
  27.         NFiles,
  28.         NPats; /* number of patterns to search for */
  29.     char i,
  30.         *FlagPtr,
  31.         **OptPtr; /* used to scan command line */
  32.     int TextFile /* file to search */;
  33.     struct PattDesc *DescVec[MAXPATS];
  34.  
  35.     --argc;
  36.     OptPtr = argv + 1;
  37.     while ( argc && **OptPtr == '-') {
  38.         FlagPtr = *OptPtr + 1;
  39.         while (*FlagPtr) {
  40.             switch (*FlagPtr) {
  41.                 case 'c': cFlag = 1; break;
  42.                 case 'e': eFlag = 1;
  43.                     /* get the patterns from next arg */
  44.                     NPats = MkDescVec(DescVec,*++OptPtr);
  45.                     --argc;
  46.                     break;
  47.                 case 'f': fFlag = 1; 
  48.                     /* read the patterns from a file */
  49.                     NPats = GetPatFile(*++OptPtr,DescVec);
  50.                     --argc;
  51.                     break;
  52.                 case 'l': lFlag = 1; break;
  53.                 case 'n': nFlag = 1; break;
  54.                 case 's': sFlag = 1; break;
  55.                 case 'x': xFlag = 1; break;
  56.                 case 'h': hFlag = 1; break;
  57.                 default:
  58.                     fprintf(stderr,
  59.                     "match: invalid option: -%c \n",
  60.                     *FlagPtr);
  61.                     PutUsage();
  62.                     exit(2);
  63.             } /* switch */
  64.             ++FlagPtr;
  65.         } /* while */
  66.         ++OptPtr; --argc;
  67.     } /* while */
  68.     /* OptPtr now points to patterns */
  69.     if (!fFlag && !eFlag) {
  70.         if (!argc) {
  71.             fprintf(stderr,"match: no pattern specified\n");
  72.             PutUsage();
  73.             exit(2);
  74.         } else
  75.             NPats = MkDescVec(DescVec,*OptPtr);
  76.         ++OptPtr; --argc;
  77.     }
  78.     /* OptPtr now points to first file */
  79.     NFiles = argc;
  80.     if (!NFiles)
  81.         ret &= Execute(DescVec,NPats,0,BigBuff+1);
  82.     else while (argc--) {
  83.         if ((NFiles > 1) || lFlag) FileName = *OptPtr;
  84.         if ((TextFile = open(*OptPtr,O_RDONLY,0)) < 0) {
  85.             fprintf(stderr,"match: can't open %s\n",*OptPtr);
  86.             NotFound++;
  87.         } else {
  88.             ret &= Execute(DescVec,NPats,TextFile,BigBuff+1);
  89.             if (sFlag && !ret)
  90.                 exit(0);
  91.             close(TextFile);
  92.         } /* if */
  93.         ++OptPtr;
  94.     } /* while */
  95.     if (cFlag) printf("%d\n",MatchCount);
  96.     exit(NotFound ? 2 : ret);
  97. } /* main */
  98.