44#include < cmath>
55#include < cstddef>
66#include < cstdint>
7+ #include < cstdlib>
78#include < cstring>
89#include < string>
910
@@ -548,7 +549,11 @@ size_t StringSearch<Char>::BoyerMooreSearch(Vector subject,
548549 size_t start = start_;
549550
550551 int *bad_char_occurrence = bad_char_shift_table_;
551- int *good_suffix_shift = good_suffix_shift_table_ - start_;
552+
553+ auto good_suffix_get = [&](size_t idx) -> int {
554+ if (idx < start || idx - start > kBMMaxShift ) return 0 ;
555+ return good_suffix_shift_table_[idx - start];
556+ };
552557
553558 Char last_char = pattern_[pattern_length - 1 ];
554559 size_t index = start_index;
@@ -575,7 +580,7 @@ size_t StringSearch<Char>::BoyerMooreSearch(Vector subject,
575580 index +=
576581 pattern_length - 1 - CharOccurrence (bad_char_occurrence, last_char);
577582 } else {
578- int gs_shift = good_suffix_shift[ j + 1 ] ;
583+ int gs_shift = good_suffix_get ( j + 1 ) ;
579584 int bc_occ = CharOccurrence (bad_char_occurrence, c);
580585 int shift = j - bc_occ;
581586 if (gs_shift > shift) {
@@ -591,22 +596,25 @@ size_t StringSearch<Char>::BoyerMooreSearch(Vector subject,
591596template <typename Char>
592597void StringSearch<Char>::PopulateBoyerMooreTable() {
593598 const size_t pattern_length = pattern_.length ();
594- // Only look at the last kBMMaxShift characters of pattern (from start_
595- // to pattern_length).
596599 const size_t start = start_;
597600 const size_t length = pattern_length - start;
598601
599- // Biased tables so that we can use pattern indices as table indices,
600- // even if we only cover the part of the pattern from offset start.
601- int *shift_table = good_suffix_shift_table_ - start_;
602- int *suffix_table = suffix_table_ - start_;
602+ auto shift_get = [&](size_t idx) -> int & {
603+ if (idx < start) abort ();
604+ return good_suffix_shift_table_[idx - start];
605+ };
606+
607+ auto suffix_get = [&](size_t idx) -> int & {
608+ if (idx < start) abort ();
609+ return suffix_table_[idx - start];
610+ };
603611
604612 // Initialize table.
605613 for (size_t i = start; i < pattern_length; i++) {
606- shift_table[i] = length;
614+ shift_get (i) = length;
607615 }
608- shift_table[ pattern_length] = 1 ;
609- suffix_table[ pattern_length] = pattern_length + 1 ;
616+ shift_get ( pattern_length) = 1 ;
617+ suffix_get ( pattern_length) = pattern_length + 1 ;
610618
611619 if (pattern_length <= start) {
612620 return ;
@@ -620,34 +628,35 @@ void StringSearch<Char>::PopulateBoyerMooreTable() {
620628 while (i > start) {
621629 Char c = pattern_[i - 1 ];
622630 while (suffix <= pattern_length && c != pattern_[suffix - 1 ]) {
623- if (static_cast <size_t >(shift_table[ suffix] ) == length) {
624- shift_table[ suffix] = suffix - i;
631+ if (static_cast <size_t >(shift_get ( suffix) ) == length) {
632+ shift_get ( suffix) = suffix - i;
625633 }
626- suffix = suffix_table[ suffix] ;
634+ suffix = suffix_get ( suffix) ;
627635 }
628- suffix_table[ --i] = --suffix;
636+ suffix_get ( --i) = --suffix;
629637 if (suffix == pattern_length) {
630638 // No suffix to extend, so we check against last_char only.
631639 while ((i > start) && (pattern_[i - 1 ] != last_char)) {
632- if (static_cast <size_t >(shift_table[ pattern_length] ) == length) {
633- shift_table[ pattern_length] = pattern_length - i;
640+ if (static_cast <size_t >(shift_get ( pattern_length) ) == length) {
641+ shift_get ( pattern_length) = pattern_length - i;
634642 }
635- suffix_table[ --i] = pattern_length;
643+ suffix_get ( --i) = pattern_length;
636644 }
637645 if (i > start) {
638- suffix_table[ --i] = --suffix;
646+ suffix_get ( --i) = --suffix;
639647 }
640648 }
641649 }
642650 }
651+
643652 // Build shift table using suffixes.
644653 if (suffix < pattern_length) {
645654 for (size_t i = start; i <= pattern_length; i++) {
646- if (static_cast <size_t >(shift_table[i] ) == length) {
647- shift_table[i] = suffix - start;
655+ if (static_cast <size_t >(shift_get (i) ) == length) {
656+ shift_get (i) = suffix - start;
648657 }
649658 if (i == suffix) {
650- suffix = suffix_table[ suffix] ;
659+ suffix = suffix_get ( suffix) ;
651660 }
652661 }
653662 }
0 commit comments