AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Thema durchsuchen
Ansicht
Themen-Optionen

PCHarReplace

Offene Frage von "Garby"
Ein Thema von Garby · begonnen am 10. Dez 2004 · letzter Beitrag vom 14. Dez 2004
 
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
 


Forumregeln

Es ist dir nicht erlaubt, neue Themen zu verfassen.
Es ist dir nicht erlaubt, auf Beiträge zu antworten.
Es ist dir nicht erlaubt, Anhänge hochzuladen.
Es ist dir nicht erlaubt, deine Beiträge zu bearbeiten.

BB-Code ist an.
Smileys sind an.
[IMG] Code ist an.
HTML-Code ist aus.
Trackbacks are an
Pingbacks are an
Refbacks are aus

Gehe zu:

Impressum · AGB · Datenschutz · Nach oben
Alle Zeitangaben in WEZ +1. Es ist jetzt 07:09 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