Search.c 883 B

12345678910111213141516171819202122232425262728293031323334353637
  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. k = Desc->Start;
  18. Skip = PatLen-1;
  19. while ( Skip <= (BuffEnd - k) ) {
  20. j = PatEnd;
  21. k = k + Skip;
  22. while (*j == *k) {
  23. if (j == Pattern) {
  24. /* found it. Start next search
  25. * just after the pattern */
  26. Desc -> Start = k + Desc->PatLen;
  27. return(1);
  28. } /* if */
  29. --j; --k;
  30. } /* while */
  31. Skip = max(Skip1[*(unsigned char *)k],Skip2[j-Pattern]);
  32. } /* while */
  33. Desc->Start = k+Skip-(PatLen-1);
  34. return(0);
  35. } /* Search */