Fast boyer-moore search. */
| 537 | |
| 538 | /* Fast boyer-moore search. */ |
| 539 | static size_t |
| 540 | bmexec (kwset_t kws, char const *text, size_t size) |
| 541 | { |
| 542 | struct kwset const *kwset; |
| 543 | register unsigned char const *d1; |
| 544 | register char const *ep, *sp, *tp; |
| 545 | register int d, gc, i, len, md2; |
| 546 | |
| 547 | kwset = (struct kwset const *) kws; |
| 548 | len = kwset->mind; |
| 549 | |
| 550 | if (len == 0) |
| 551 | return 0; |
| 552 | if (len > size) |
| 553 | return -1; |
| 554 | if (len == 1) |
| 555 | { |
| 556 | tp = memchr (text, kwset->target[0], size); |
| 557 | return tp ? tp - text : -1; |
| 558 | } |
| 559 | |
| 560 | d1 = kwset->delta; |
| 561 | sp = kwset->target + len; |
| 562 | gc = U(sp[-2]); |
| 563 | md2 = kwset->mind2; |
| 564 | tp = text + len; |
| 565 | |
| 566 | /* Significance of 12: 1 (initial offset) + 10 (skip loop) + 1 (md2). */ |
| 567 | if (size > 12 * len) |
| 568 | /* 11 is not a bug, the initial offset happens only once. */ |
| 569 | for (ep = text + size - 11 * len;;) |
| 570 | { |
| 571 | while (tp <= ep) |
| 572 | { |
| 573 | d = d1[U(tp[-1])]; tp += d; |
| 574 | d = d1[U(tp[-1])]; tp += d; |
| 575 | if (d == 0) |
| 576 | goto found; |
| 577 | d = d1[U(tp[-1])]; tp += d; |
| 578 | d = d1[U(tp[-1])]; tp += d; |
| 579 | d = d1[U(tp[-1])]; tp += d; |
| 580 | if (d == 0) |
| 581 | goto found; |
| 582 | d = d1[U(tp[-1])]; tp += d; |
| 583 | d = d1[U(tp[-1])]; tp += d; |
| 584 | d = d1[U(tp[-1])]; tp += d; |
| 585 | if (d == 0) |
| 586 | goto found; |
| 587 | d = d1[U(tp[-1])]; tp += d; |
| 588 | d = d1[U(tp[-1])]; tp += d; |
| 589 | } |
| 590 | break; |
| 591 | found: |
| 592 | if (U(tp[-2]) == gc) |
| 593 | { |
| 594 | for (i = 3; i <= len && U(tp[-i]) == U(sp[-i]); ++i) |
| 595 | ; |
| 596 | if (i > len) |