Thema: Delphi PosEx für Delphi 5?

Einzelnen Beitrag anzeigen

Benutzerbild von CK_CK
CK_CK

Registriert seit: 31. Aug 2005
Ort: Dortmund, Germany
388 Beiträge
 
Delphi 2006 Enterprise
 
#9

Re: PosEx für Delphi 5?

  Alt 27. Mär 2007, 11:31
Der originale PosEx-Code ist folgender:
Delphi-Quellcode:
(* ***** BEGIN LICENSE BLOCK *****
* Version: MPL 1.1
*
* The implementation of function PosEx is subject to the
* Mozilla Public License Version 1.1 (the "License"); you may
* not use this file except in compliance with the License.
* You may obtain a copy of the License at [url]http://www.mozilla.org/MPL/[/url]
*
* Software distributed under the License is distributed on an "AS IS" basis,
* WITHOUT WARRANTY OF ANY KIND, either express or implied. See the License
* for the specific language governing rights and limitations under the
* License.
*
* The Original Code is Fastcode
*
* The Initial Developer of the Original Code is Fastcode
*
* Portions created by the Initial Developer are Copyright (C) 2002-2004
* the Initial Developer. All Rights Reserved.
*
* Contributor(s): Aleksandr Sharahov
*
* ***** END LICENSE BLOCK ***** *)

function PosEx(const SubStr, S: string; Offset: Integer = 1): 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, [eax-4] //Length(Substr)
       sub esi, ecx //effective length of Str
       add edx, ecx //addr of the first char at starting position
       cmp esi, ebx
       jl @Past //jump if EffectiveLength(Str)<Length(Substr)
       test ebx, ebx
       jle @Past //jump if Length(Substr)<=0

       add esp, -12
       add ebx, -1 //Length(Substr)-1
       add esi, edx //addr of the terminator
       add edx, ebx //addr of the last char at starting position
       mov [esp+8], esi //save addr of the terminator
       add eax, ebx //addr of the last char of Substr
       sub ecx, edx //-@Str[Length(Substr)]
       neg ebx //-(Length(Substr)-1)
       mov [esp+4], ecx //save -@Str[Length(Substr)]
       mov [esp], ebx //save -(Length(Substr)-1)
       movzx ecx, byte ptr [eax] //the last char of Substr

@Loop:
       cmp cl, [edx]
       jz @Test0
@AfterTest0:
       cmp cl, [edx+1]
       jz @TestT
@AfterTestT:
       add edx, 4
       cmp edx, [esp+8]
       jb @Continue
@EndLoop:
       add edx, -2
       cmp edx, [esp+8]
       jb @Loop
@Exit:
       add esp, 12
@Past:
       pop ebx
       pop esi
@Nil:
       xor eax, eax
       ret
@Continue:
       cmp cl, [edx-2]
       jz @Test2
       cmp cl, [edx-1]
       jnz @Loop
@Test1:
       add edx, 1
@Test2:
       add edx, -2
@Test0:
       add edx, -1
@TestT:
       mov esi, [esp]
       test esi, esi
       jz @Found
@String:
       movzx ebx, word ptr [esi+eax]
       cmp bx, word ptr [esi+edx+1]
       jnz @AfterTestT
       cmp esi, -2
       jge @Found
       movzx ebx, word ptr [esi+eax+2]
       cmp bx, word ptr [esi+edx+3]
       jnz @AfterTestT
       add esi, 4
       jl @String
@Found:
       mov eax, [esp+4]
       add edx, 2

       cmp edx, [esp+8]
       ja @Exit

       add esp, 12
       add eax, edx
       pop ebx
       pop esi
end;
Vielleicht hilft's dir ja

Chris
Chris
» «
Mehr von mir (Programme, etc.): http://www.kroegerama.de
  Mit Zitat antworten Zitat