浏览代码

--- Merging r48752 into '.':
U packages/rtl-objpas/src/inc/strutils.pp
A tests/test/units/strutils/tboyer.pp
--- Recording mergeinfo for merge of r48752 into '.':
U .

# revisions: 48752
r48752 | florian | 2021-02-21 14:54:25 +0100 (Sun, 21 Feb 2021) | 2 lines
Changed paths:
M /trunk/packages/rtl-objpas/src/inc/strutils.pp
A /trunk/tests/test/units/strutils/tboyer.pp

* fix by avk for issue #38513
+ test

git-svn-id: branches/fixes_3_2@49050 -

marco 4 年之前
父节点
当前提交
fabc7fb50f
共有 3 个文件被更改,包括 82 次插入4 次删除
  1. 1 0
      .gitattributes
  2. 2 4
      packages/rtl-objpas/src/inc/strutils.pp
  3. 79 0
      tests/test/units/strutils/tboyer.pp

+ 1 - 0
.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

+ 2 - 4
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;

+ 79 - 0
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.