home *** CD-ROM | disk | FTP | other *** search
/ Usenet 1994 October / usenetsourcesnewsgroupsinfomagicoctober1994disk2.iso / unix / volume4 / bm1.2 / Search.c < prev   
C/C++ Source or Header  |  1986-11-30  |  883b  |  37 lines

  1. #include "bm.h"
  2. #include "Extern.h"
  3. int Search(Pattern,PatLen,EndBuff, Skip1, Skip2, Desc)
  4. register char Pattern[];
  5. int PatLen;
  6. char *EndBuff;
  7. unsigned short int Skip1[], Skip2[];
  8. struct PattDesc *Desc;
  9. {
  10.     register char *k, /* indexes text */
  11.         *j; /* indexes Pattern */
  12.     register int Skip; /* skip distance */
  13.     char *PatEnd,
  14.     *BuffEnd; /* pointers to last char in Pattern and Buffer */
  15.     BuffEnd = EndBuff;
  16.     PatEnd = Pattern + PatLen - 1;
  17.  
  18.     k = Desc->Start;
  19.     Skip = PatLen-1;
  20.     while ( Skip <= (BuffEnd - k) ) {
  21.         j = PatEnd;
  22.         k = k + Skip;
  23.         while (*j == *k) {
  24.             if (j == Pattern) {
  25.                 /* found it. Start next search
  26.                 * just after the pattern */
  27.                 Desc -> Start = k + Desc->PatLen;
  28.                 return(1);
  29.             } /* if */
  30.             --j; --k;
  31.         } /* while */
  32.         Skip = max(Skip1[*(unsigned char *)k],Skip2[j-Pattern]);
  33.     } /* while */
  34.     Desc->Start = k+Skip-(PatLen-1);
  35.     return(0);
  36. } /* Search */
  37.