type
TFSResults = array of Integer;
function FindStringMulti(const Value, Pattern: string;
const CaseSensitive: Boolean = True;
const StartPos: Integer = 1): TFSResults;
var
Index: Integer;
jIndex: Integer;
kIndex: Integer;
LLenPattern: Integer;
LLenValue: Integer;
LSkipTable: array[Char] of Integer;
LChar: Char;
function __SameChar: Boolean;
begin
if CaseSensitive then
Result := (Value[Index] = Pattern[jIndex])
else
Result := (CompareText(Value[Index], Pattern[jIndex]) = 0);
end; // function __SameChar: Boolean;
begin
LLenPattern := Length(Pattern);
if LLenPattern = 0 then
Exit;
for LChar := Low(Char) to High(Char) do
LSkipTable[LChar] := LLenPattern;
if CaseSensitive then begin
for kIndex := 1 to LLenPattern -1 do
LSkipTable[Pattern[kIndex]] := LLenPattern -kIndex;
end else begin
for kIndex := 1 to LLenPattern -1 do
LSkipTable[Windows.CharLower(@Pattern[kIndex])^] := LLenPattern -kIndex;
end; // if CaseSensitive then begin
kIndex := LLenPattern + (StartPos -1);
LLenValue := Length(Value);
while (kIndex <= LLenValue) do begin
Index := kIndex;
jIndex := LLenPattern;
while (jIndex >= 1) do begin
if __SameChar then begin
jIndex := jIndex -1;
Index := Index -1;
end else
jIndex := -1;
if jIndex = 0 then begin
SetLength(Result, Length(Result) +1);
Result[High(Result)] := Index +1;
jIndex := -1;
end; // if jIndex = 0 then begin
kIndex := kIndex + LSkipTable[Value[kIndex]];
end; // while (jIndex >= 1) do begin
end; // while (kIndex <= LLenValue) do begin
end;
Enjoy!