Einzelnen Beitrag anzeigen

Benutzerbild von himitsu
himitsu
Online

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

Re: StringReplace und doppelte Zeichen

  Alt 25. Dez 2007, 19: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;
Neuste Erkenntnis:
Seit Pos einen dritten Parameter hat,
wird PoSex im Delphi viel seltener praktiziert.
  Mit Zitat antworten Zitat