Delphi-PRAXiS
Seite 2 von 2     12   

Delphi-PRAXiS (https://www.delphipraxis.net/forum.php)
-   Object-Pascal / Delphi-Language (https://www.delphipraxis.net/32-object-pascal-delphi-language/)
-   -   Delphi PCHarReplace (https://www.delphipraxis.net/35668-pcharreplace.html)

Garby 13. Dez 2004 07:37

Re: PCHarReplace
 
keiner eine Idee?

Nothine 13. Dez 2004 20:09

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;

SirThornberry 13. Dez 2004 20:50

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.

Garby 14. Dez 2004 07:48

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.
Seite 2 von 2     12   

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