bitap.H 744 B

12345678910111213141516171819202122232425262728293031
  1. #ifndef BITAP_H_
  2. #define BITAP_H_
  3. #include <string.h>
  4. #include <limits.h>
  5. inline void *bitap_bitwise_search(const void *text, int textLen, const void *pattern, int patternLen) {
  6. int m = patternLen;
  7. unsigned long R;
  8. unsigned long pattern_mask[CHAR_MAX + 1];
  9. int i;
  10. if (m > 31) return NULL;
  11. /* Initialize the bit array R */
  12. R = ~1;
  13. /* Initialize the pattern bitmasks */
  14. for (i = 0; i <= CHAR_MAX; ++i)
  15. pattern_mask[i] = ~0;
  16. for (i = 0; i < m; ++i)
  17. pattern_mask[int(((char*) pattern)[i])] &= ~(1UL << i);
  18. for (i = 0; i < textLen; ++i) {
  19. /* Update the bit array */
  20. R |= pattern_mask[int(((char*) text)[i])];
  21. R <<= 1;
  22. if (0 == (R & (1UL << m))) return ((char*) text + i - m) + 1;
  23. }
  24. return NULL;
  25. }
  26. #endif /* BITAP_H_ */