Online
Registriert seit: 11. Okt 2003
Ort: Elbflorenz
44.054 Beiträge
Delphi 12 Athens
|
Re: StringReplace und doppelte Zeichen
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.
|
|
Zitat
|