AGB  ·  Datenschutz  ·  Impressum  







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

StringReplace und doppelte Zeichen

Ein Thema von Opa · begonnen am 23. Dez 2007 · letzter Beitrag vom 4. Mai 2009
Antwort Antwort
Benutzerbild von himitsu
himitsu

Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.340 Beiträge
 
Delphi 12 Athens
 
#1

Re: StringReplace und doppelte Zeichen

  Alt 25. Dez 2007, 18:24
hab bei mir mal ein/zwei Fehlerchen behoben
Delphi-Quellcode:
Function ReduceMultiples(Const S: String; C: Char): String;
  Var Pi, Po, Pe: PChar;
    Cm: Char;

  Begin
    Result := S;
    If Result = 'Then Exit;
    Pi := @Result[1];
    Pe := Pi + Length(Result);
    Inc(Pi);
    Po := Pi;
    Cm := Result[1];
    While Pi < Pe do Begin
      If (Pi^ <> Cm) or (Pi^ <> C) Then Begin
        Inc(Po);
        Cm := Pi^;
      End;
      Inc(Pi);
      Po^ := Pi^;
    End;
    SetLength(Result, Po - @Result[1]);
  End;
und leider hab'sch festgestellt, daß mein Compiler besser optimiert, als ich ;(
Delphi-Quellcode:
Function ReduceMultiplesA(Const S: String; C: Char): String;
  Var i: Integer;

  Begin
    Result := S;
    UniqueString(Result);
    ASM
      PUSH EDI
      PUSH ESI
      MOV &i, 0
      MOV DL, &C
      MOV EAX, &Result
      MOV EAX, [EAX]
      CMP EAX, 0 // If Result_EAX = '' Then Exit;
      JZ @Exit //
      MOV ESI, EAX // Pi_ESI := @Result_EAX[1];
      MOV ECX, ESI // Pe_ECX := Pi_ESI + Length(Result_EAX);
      ADD ECX, DWORD PTR [EAX - 4] //
      INC ESI // Inc(Pi_ESI);
      MOV EDI, ESI // Po_EDI := Pi_ESI;
      MOV DH, BYTE PTR [EAX] // Cm_DH := Result_EAX[1];
      @Loop: // While Pi_ESI < Pe_ECX do Begin
      CMP ESI, ECX //
      JGE @LoopEnd //
      MOV AL, BYTE PTR [ESI] // If (Pi_ESI^ <> Cm_DH) or (Pi_ESI^ <> C_DL) Then Begin
      CMP AL, DH //
      JNZ @BeginIf //
      CMP AL, DL //
      JZ @EndIf //
      @BeginIf: //
      INC EDI // Inc(Po_EDI);
      MOV DH, BYTE PTR [ESI] // Cm_DH := Pi_ESI^;
      @EndIf: // End;
      INC ESI // Inc(Pi_ESI);
      MOV AL, BYTE PTR [ESI] // Po_EDI^ := Pi_ESI^;
      MOV BYTE PTR [EDI], AL //
      JMP @Loop // End;
      @LoopEnd: //
      MOV EAX, &Result
      SUB EDI, [EAX] // i := Po_EDI - @Result_EAX[1];
      MOV &i, EDI //
      @Exit:
      POP ESI
      POP EDI
    End;
    SetLength(Result, i);
  End;
Ein Therapeut entspricht 1024 Gigapeut.
  Mit Zitat antworten Zitat
Antwort Antwort


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 21:49 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