@Maekkelrajter: Du solltest den Fall limit<0 noch abfangen.
Darauf hatte ich verzichtet, da weiter unten im Code der Vergleich des Substr mit dem zu durchsuchenden Teilstring durchgeführt wird:
Delphi-Quellcode:
mov ebx, [eax-4] //Length(Substr)
sub esi, ecx //effective length of Str (= length(str) - offset)
add edx, ecx //addr of the first AnsiChar at starting position
cmp esi, ebx
jl @Past //jump if EffectiveLength(Str)<Length(Substr)
[...]
@Past:
pop ebx
pop esi
@Nil:
xor eax, eax
jmp @done
Falls 'EffectiveLength(Str) < Length(Substr)', was bei negativem 'Limit' der Fall wäre, erfolgt der Ausstieg mit Result =0.
Die von dir vorgeschlagene Variante hätte zur Folge, dass auch bei allen Limit-Werten < 0 der limit-Wert einfach ignoriert wird und die Suche dennoch durchgeführt wird.
Deshalb habe ich das ganze Design noch einmal überarbeitet. Die Vorbelegung der Parameter wurde entfernt, ebenso die Null-Prüfung von 'Limit'. Alle Limit-Werte, die kleiner oder gleich Offset sind führen jetzt zu einem Ende mit Result = 0, ebenso wenn Offset kleiner 1 ist.
Für den geplanten speziellen Einsatz dieser Funktion ist das so völlig ausreichend:
Delphi-Quellcode:
function PosInLimits(
const SubStr, Str: RawByteString; Offset,Limit:Integer): Integer;
asm
test eax, eax
jz @
Nil
test edx, edx
jz @
Nil
dec ecx
jl @
Nil
push esi
push ebx
mov esi, [edx-4]
//Length(Str)
mov ebx, limit
// limit holen
cmp ebx, esi
// limit >= Length(Str)?
jge @IgnoreLimit
// limit ignorieren
mov esi, ebx
// limit übernehmen anstelle von Length(Str)
@IgnoreLimit:
mov ebx, [eax-4]
//Length(Substr)
sub esi, ecx
//effective length of Str (= length(str) - offset)
add edx, ecx
//addr of the first AnsiChar at starting position
cmp esi, ebx
jl @Past
//jump if EffectiveLength(Str)<Length(Substr)
[usw.]
Trotzdem Danke für den Hinweis!
Gruß LP