diff --git a/.gitattributes b/.gitattributes index 62e2e88469..d0d51a2835 100644 --- a/.gitattributes +++ b/.gitattributes @@ -15470,6 +15470,7 @@ tests/test/units/strings/tstrings1.pp svneol=native#text/plain tests/test/units/strutils/taddchar.pp svneol=native#text/plain tests/test/units/strutils/taddcharr.pp svneol=native#text/plain tests/test/units/strutils/tbintohex.pp svneol=native#text/plain +tests/test/units/strutils/tboyer.pp svneol=native#text/pascal tests/test/units/strutils/tdec2numb.pp svneol=native#text/plain tests/test/units/strutils/thex2dec.pp svneol=native#text/plain tests/test/units/strutils/thextobin.pp svneol=native#text/plain diff --git a/packages/rtl-objpas/src/inc/strutils.pp b/packages/rtl-objpas/src/inc/strutils.pp index beb7b96eb5..7b8de4c69b 100644 --- a/packages/rtl-objpas/src/inc/strutils.pp +++ b/packages/rtl-objpas/src/inc/strutils.pp @@ -436,8 +436,7 @@ begin AddMatch(i+1); //Only first match ? if not aMatchAll then break; - inc(i,OldPatternSize); - inc(i,OldPatternSize); + inc(i,DeltaJumpTable2[0]); end else begin i:=i + Max(DeltaJumpTable1[ord(s[i])],DeltaJumpTable2[j]); end; @@ -589,8 +588,7 @@ begin AddMatch(i+1); //Only first match ? if not aMatchAll then break; - inc(i,OldPatternSize); - inc(i,OldPatternSize); + inc(i,DeltaJumpTable2[0]); end else begin i:=i + Max(DeltaJumpTable1[Ord(lCaseArray[Ord(s[i])])],DeltaJumpTable2[j]); end; diff --git a/tests/test/units/strutils/tboyer.pp b/tests/test/units/strutils/tboyer.pp new file mode 100644 index 0000000000..7eb6fda835 --- /dev/null +++ b/tests/test/units/strutils/tboyer.pp @@ -0,0 +1,79 @@ +{$mode objfpc} + +uses + StrUtils; +const + result1 : array of SizeInt = (1, 4, 7, 10, 13, 16); +var + a : array of SizeInt; + i : LongInt; +begin + if FindMatchesBoyerMooreCaseSensitive('abcabcabcabcabcabcab','abcab',a,false) then + begin + if Length(a)<>1 then + halt(2); + if a[0]<>result1[0] then + halt(3); + end + else + halt(1); + + if FindMatchesBoyerMooreCaseSensitive('abcabcabcabcabcabcab','abcab',a,true) then + begin + if Length(a)<>Length(result1) then + halt(12); + for i:=Low(a) to High(a) do + if a[i]<>result1[i] then + halt(13); + end + else + halt(11); + + if FindMatchesBoyerMooreCaseInSensitive('abcabcabcabcabcabcab','abcab',a,false) then + begin + if Length(a)<>1 then + halt(22); + if a[0]<>result1[0] then + halt(23); + end + else + halt(21); + +{ + apparently not working yet: + + if FindMatchesBoyerMooreCaseInSensitive('abcabcabcabcabcabcab','abcab',a,true) then + begin + if Length(a)<>Length(result1) then + halt(32); + for i:=Low(a) to High(a) do + if a[i]<>result1[i] then + halt(33); + end + else + halt(31); + + if FindMatchesBoyerMooreCaseInSensitive('abcabcabcAbcabcAbcab','abcaB',a,false) then + begin + if Length(a)<>1 then + halt(42); + if a[0]<>result1[0] then + halt(43); + end + else + halt(41); + + if FindMatchesBoyerMooreCaseInSensitive('abcabCabcAbcabcABcab','abcaB',a,true) then + begin + if Length(a)<>Length(result1) then + halt(52); + for i:=Low(a) to High(a) do + if a[i]<>result1[i] then + halt(53); + end + else + halt(51); +} + + writeln('ok'); +end.