home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume3 / bm1.1 < prev    next >
Internet Message Format  |  1986-11-30  |  4KB

  1. From: Peter Bain <genrad!ihnp4!watmath!wateng!pdbain>
  2. Subject: Ken Yap's changes to bm
  3. Newsgroups: mod.sources
  4. Approved: jpn@panda.UUCP
  5.  
  6. Mod.sources:  Volume 3, Issue 1
  7. Submitted by: Peter Bain <ihnp4!watmath!wateng!pdbain>
  8.  
  9.  
  10. Here is the revised bm.c for bm version 1.1, incorporating Ken Yap's changes.
  11. If it encounters a bad file bm now prints an error message and continues
  12. to the next file.  Several people has asked for bm to have an option to
  13. "stop after the first match in each file" to scan the subject lines
  14. in rn articles.  I haven't put this in out of a desire to avoid
  15. creeping featurism, because bm isn't good at looking at a bit of one file
  16. then going to the next, and finally because there is already a command
  17. to do this - hgrep:
  18.  
  19. HGREP(PUBLIC)    Waterloo UNIX Programmer's Manual   HGREP(PUBLIC)
  20.  
  21. NAME
  22.      hgrep - search header of (news) files for a pattern
  23.             .
  24.             .
  25.             .
  26. DESCRIPTION
  27.      Hgrep is a cousin of grep(1) that limits its search to the
  28.      -----                ----
  29.      "header" portions of files.  A blank line marks the end of
  30.      the header....
  31.  
  32.      The pattern is a limited regular expression of the ilk
  33.          -------
  34.      recognized by ed(1); hgrep uses re comp and re exec (see
  35.                    --     -----      -------     -------
  36.      reference below) to interpret it....
  37.  
  38.      and so on....
  39.  
  40. ____________________ shear energy! ___________________________________________
  41. : This is a shar archive.    Extract with sh, not csh.
  42. : The rest of this file will extract:
  43. : bm.c
  44. echo Extracting bm.c
  45. sed 's/^X//' > bm.c << 'e-o-f'
  46. X#include <stdio.h>
  47. X#include <sys/file.h>
  48. X#include <strings.h>
  49. X#include "bm.h"
  50. X#include "Extern.h"
  51. Xmain(argc,argv)
  52. Xint argc;
  53. Xchar *argv[];
  54. X{
  55. X    /* test driver for grep based on Boyer-Moore algorithm */
  56. X    char BigBuff[MAXBUFF + 2];
  57. X    /*
  58. X    * We leave one extra character at the beginning and end of the buffer,
  59. X    * but don't tell Execute about it. This is so when someone is
  60. X    * scanning the buffer and scans past the end (or beginning)
  61. X    * we are still technically in the buffer (picky, but there ARE
  62. X    * machines which would complain)
  63. X    */
  64. X    int ret = 1, /* return code from Execute */
  65. X        NotFound = 0, /* non-zero if file not readable */
  66. X        NFiles,
  67. X        NPats; /* number of patterns to search for */
  68. X    char i,
  69. X        *FlagPtr,
  70. X        **OptPtr; /* used to scan command line */
  71. X    int TextFile /* file to search */;
  72. X    struct PattDesc *DescVec[MAXPATS];
  73. X
  74. X    --argc;
  75. X    OptPtr = argv + 1;
  76. X    while ( argc && **OptPtr == '-') {
  77. X        FlagPtr = *OptPtr + 1;
  78. X        while (*FlagPtr) {
  79. X            switch (*FlagPtr) {
  80. X                case 'c': cFlag = 1; break;
  81. X                case 'e': eFlag = 1;
  82. X                    /* get the patterns from next arg */
  83. X                    NPats = MkDescVec(DescVec,*++OptPtr);
  84. X                    --argc;
  85. X                    break;
  86. X                case 'f': fFlag = 1; 
  87. X                    /* read the patterns from a file */
  88. X                    NPats = GetPatFile(*++OptPtr,DescVec);
  89. X                    --argc;
  90. X                    break;
  91. X                case 'l': lFlag = 1; break;
  92. X                case 'n': nFlag = 1; break;
  93. X                case 's': sFlag = 1; break;
  94. X                case 'x': xFlag = 1; break;
  95. X                case 'h': hFlag = 1; break;
  96. X                default:
  97. X                    fprintf(stderr,
  98. X                    "bm: invalid option: -%c \n",
  99. X                    *FlagPtr);
  100. X                    PutUsage();
  101. X                    exit(2);
  102. X            } /* switch */
  103. X            ++FlagPtr;
  104. X        } /* while */
  105. X        ++OptPtr; --argc;
  106. X    } /* while */
  107. X    /* OptPtr now points to patterns */
  108. X    if (!fFlag && !eFlag) {
  109. X        if (!argc) {
  110. X            fprintf(stderr,"bm: no pattern specified\n");
  111. X            PutUsage();
  112. X            exit(2);
  113. X        } else
  114. X            NPats = MkDescVec(DescVec,*OptPtr);
  115. X        ++OptPtr; --argc;
  116. X    }
  117. X    /* OptPtr now points to first file */
  118. X    NFiles = argc;
  119. X    if (!NFiles)
  120. X        ret &= Execute(DescVec,NPats,0,BigBuff+1);
  121. X    else while (argc--) {
  122. X        if ((NFiles > 1) || lFlag) FileName = *OptPtr;
  123. X        if ((TextFile = open(*OptPtr,O_RDONLY,0)) < 0) {
  124. X            fprintf(stderr,"bm: can't open %s\n",*OptPtr);
  125. X            NotFound++;
  126. X        } else {
  127. X            ret &= Execute(DescVec,NPats,TextFile,BigBuff+1);
  128. X            if (sFlag && !ret)
  129. X                exit(0);
  130. X            close(TextFile);
  131. X        } /* if */
  132. X        ++OptPtr;
  133. X    } /* while */
  134. X    if (cFlag) printf("%d\n",MatchCount);
  135. X    exit(NotFound ? 2 : ret);
  136. X} /* main */
  137. e-o-f
  138. exit 0
  139. -- 
  140.    - peter bain
  141. ...!{allegra|decvax|clyde|ihnp4 }!watmath!wateng!pdbain
  142. hard mail:    CCNG, CPH-2369A, University of Waterloo,
  143.     Waterloo, Ont. Canada N2M 5G4
  144. telephone:    (519) 885-1211 x2810
  145.  
  146.  
  147.