MCPcopy Create free account
hub / github.com/git/git / bmexec

Function bmexec

kwset.c:539–622  ·  view source on GitHub ↗

Fast boyer-moore search. */

Source from the content-addressed store, hash-verified

537
538/* Fast boyer-moore search. */
539static size_t
540bmexec (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)

Callers 1

kwsexecFunction · 0.85

Calls

no outgoing calls

Tested by

no test coverage detected