Thema: Delphi PCHarReplace

Einzelnen Beitrag anzeigen

Benutzerbild von Nothine
Nothine

Registriert seit: 3. Jul 2004
Ort: Mülheim an der Ruhr
198 Beiträge
 
Delphi 5 Enterprise
 
#12

Re: PCHarReplace

  Alt 13. Dez 2004, 20:09
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;
if ThisPost is senseless then
ThisPost.WasPostedBy := SomeoneElse();
  Mit Zitat antworten Zitat