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
Antwort Antwort
Seite 2 von 2     12   
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#11

Re: PCHarReplace

  Alt 13. Dez 2004, 07:37
keiner eine Idee?
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
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
Benutzerbild von SirThornberry
SirThornberry
(Moderator)

Registriert seit: 23. Sep 2003
Ort: Bockwen
12.235 Beiträge
 
Delphi 2006 Professional
 
#13

Re: PCHarReplace

  Alt 13. Dez 2004, 20:50
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.
Jens
Mit Source ist es wie mit Kunst - Hauptsache der Künstler versteht's
  Mit Zitat antworten Zitat
Benutzerbild von Garby
Garby

Registriert seit: 17. Mär 2003
Ort: Tirol
199 Beiträge
 
Delphi 2005 Professional
 
#14

Re: PCHarReplace

  Alt 14. Dez 2004, 07:48
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
Walter
Wenn zwei dasselbe tun, ist es noch lange nicht dasselbe
(Adelphi)
  Mit Zitat antworten Zitat
Antwort Antwort
Seite 2 von 2     12   


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 14:08 Uhr.
Powered by vBulletin® Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
LinkBacks Enabled by vBSEO © 2011, Crawlability, Inc.
Delphi-PRAXiS (c) 2002 - 2023 by Daniel R. Wolf, 2024 by Thomas Breitkreuz