home *** CD-ROM | disk | FTP | other *** search
/ Crawly Crypt Collection 2 / crawlyvol2.bin / program / c / bm_src / search.c < prev   
Encoding:
C/C++ Source or Header  |  1990-01-16  |  1.4 KB  |  50 lines

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