![]() |
Re: PCHarReplace
keiner eine Idee?
|
Re: PCHarReplace
hab so ne PChar-variante von StringReplace mal selber gemacht, kannst es dir ja mal ansehen
Delphi-Quellcode:
uses SysUtils;
... function StrLen(P: PChar): Cardinal; asm //nachgeproggt da die SysUtils-variante bei mir nicht geht PUSH ECX MOV ECX,-$01 @@Loop: INC ECX CMP BYTE PTR [EAX+ECX],$00 JNZ @@Loop @@End: MOV EAX,ECX POP ECX end; function StrLenE(P: PChar): Cardinal; asm //das ist ein +1 im delphi-code weniger ;-D CALL StrLen INC EAX end; function StrCount(P: PChar; SubStr: PChar): Cardinal; asm PUSH -$01 PUSH EAX MOV EAX,EDX CALL StrLen XCHG DWORD PTR [ESP],EAX @@Loop: CALL StrPos INC DWORD PTR [ESP+$04] ADD EAX,DWORD PTR [ESP] CMP EAX,DWORD PTR [ESP] JNE @@Loop ADD ESP,$04 POP EAX end; function StrPosInt(P1,P2: PChar): Cardinal; asm //die variante für leute die lieber zahlen als pointer mögen PUSH EBX MOV EBX,EAX DEC EBX CALL StrPos TEST EAX,EAX JZ @@End SUB EAX,EBX @@End: POP EBX end; function StrUpper(P: PChar): PChar; asm //nachgeproggt da die SysUtils-variante bei mir nicht geht PUSH ESI PUSH EDI MOV ESI,EAX CALL StrLenE CALL AllocMem MOV EDI,EAX PUSH EAX @@Loop: CMP BYTE PTR [ESI],$00 JZ @@End LODSB CALL UpCase STOSB JMP @@Loop @@End: POP EAX POP EDI POP ESI end; function PCharReplace(Source,OldStr,NewStr: PChar; Flags: TReplaceFlags): PChar; var I: Cardinal; P: PChar; begin P := AllocMem( StrLen(Source) - (StrLen(OldStr)*StrCount(Source,OldStr)) + (StrLen(NewStr)*StrCount(Source,OldStr)) + 1); Result := P; while Source^ <> #00 do begin if rfIgnoreCase in Flags then I := StrPosInt(StrUpper(Source),StrUpper(OldStr)) else I := StrPosInt(Source,OldStr); if I = 0 then I := StrLenE(Source); StrMove(P,Source,I-1); Inc(P,I-1); Inc(Source,I-1); if Source^ <> #00 then begin StrMove(P,NewStr,StrLen(NewStr)); Inc(P,StrLen(NewStr)); Inc(Source,StrLen(OldStr)); if not (rfReplaceAll in Flags) then begin StrMove(P,Source,StrLenE(Source)); Break; end; end; end; end; |
Re: PCHarReplace
bekommst du bei der Funktion wenigstens auch die Länge des blobs? Ansonsten ist es völlig irsinnig, denn sobald eine #0 in dem Blob vorkommt würde an der stelle der blob als beendet angesehen werden.
|
Re: PCHarReplace
Danke erstmal für den Post.
Allerdings hat SirThornberry recht. Das Problem ist, dass ich mir nicht sicher sein kann, ob #0 Chars im PChar enthalten sind. Die Länge des Blobs ist bekannt. Könnte man damit die Funktion anpassen? Danke Garby |
Alle Zeitangaben in WEZ +1. Es ist jetzt 20:31 Uhr. |
Powered by vBulletin® Copyright ©2000 - 2025, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024-2025 by Thomas Breitkreuz