Private Declare Sub PokeLng Lib "kernel32" Alias "RtlMoveMemory" ( _
ByVal Addr As Long, Value As Long, _
Optional ByVal Bytes As Long = 4)
Public Function InStrRev06( _
ByRef sCheck As String, _
ByRef sMatch As String, _
Optional ByVal Start As Long, _
Optional ByVal Compare As VbCompareMethod = vbBinaryCompare _
) As Long
' by Jost Schwider, jost@schwider.de, 20001218
Dim Stopp As Long
Dim Index As Long
Dim Pivot As Long
Dim Length As Long
Dim LengthPtr As Long
Dim MatchLen As Long
If Compare = vbBinaryCompare Then
MatchLen = LenB(sMatch) - 1
If MatchLen > -1 Then
'Linke Grenze bestimmen:
Stopp = InStrB(sCheck, sMatch)
If Stopp = 0 Then Exit Function
'Rechte Grenze bestimmen:
Length = LenB(sCheck)
If Start <= 0 Then
Start = Length - MatchLen
LengthPtr = StrPtr(sCheck) - 4
Else
Start = Start + Start - MatchLen
If Stopp > Start Then Exit Function
LengthPtr = StrPtr(sCheck) - 4
PokeLng LengthPtr, Start + MatchLen
End If
'Ersten Treffer merken:
InStrRev06 = Stopp
Stopp = Stopp + 2
'Binäre Suche / Intervall-Halbierungs-Verfahren:
Do
'Ab Mitte testen:
Pivot = (Stopp + Start) \ 2
Index = InStrB(Pivot, sCheck, sMatch)
'Treffer?
If Index Then
InStrRev06 = Index
If Index >= Start Then
PokeLng LengthPtr, Length
InStrRev06 = InStrRev06 \ 2 + 1
Exit Function
End If
Stopp = Index + 2
Else
If Stopp + 8 >= Pivot Then Exit Do
Start = Pivot - 1
PokeLng LengthPtr, Start + MatchLen
End If
Loop
'Konventionell weiter machen:
Index = InStrB(Stopp, sCheck, sMatch)
Do While Index
InStrRev06 = Index
Index = InStrB(Index + 2, sCheck, sMatch)
Loop
InStrRev06 = InStrRev06 \ 2 + 1
PokeLng LengthPtr, Length
Else
If Start <= Len(sCheck) Then InStrRev06 = Start
End If
Else
InStrRev06 = InStrRev06(LCase$(sCheck), LCase$(sMatch), Start)
End If
End Function
|