AGB  ·  Datenschutz  ·  Impressum  







Anmelden
Nützliche Links
Registrieren
Zurück Delphi-PRAXiS Code-Bibliothek Neuen Beitrag zur Code-Library hinzufügen Delphi ReverseString für ältere Delphi-Versionen
Thema durchsuchen
Ansicht
Themen-Optionen

ReverseString für ältere Delphi-Versionen

Ein Thema von Wolfgang Mix · begonnen am 11. Dez 2009 · letzter Beitrag vom 12. Dez 2009
 
Benutzerbild von himitsu
himitsu

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

Re: ReverseString für ältere Delphi-Versionen

  Alt 11. Dez 2009, 22:08
Delphi-Quellcode:
Function ReverseString(Const Text: String): String;
Var L: Integer;
  S, D: PChar;
Begin
  L := Length(Text) - 1;
  SetLength(Result, L + 1);
  S := PChar(Text);
  D := PChar(Result) + L;
  For L := L downto 0 do Begin
    D^ := S^;
    Inc(S);
    Dec(D);
  End;
End;
Ihr wißt aber, daß die/unsere Ansi-Varianten nur mit Singelbyte-Zeichensätzen richtig arbeiten?


Und weil ich grad mal 'nen Sekündchen lang Lange Weile hatte:
Delphi-Quellcode:
Function ReverseString(Const Text: AnsiString): AnsiString; Overload;
  ASM
    PUSH EDI
    PUSH ESI
    PUSH EDX
    PUSH EAX
    XCHG EAX, EDX
    TEST EDX, EDX
    JZ @@ZeroSet
    SUB EDX, 4
    MOV EDX, [EDX]
    @@ZeroSet:
    CALL _LStrSetLength
    POP ESI
    POP EDI
    MOV EDI, [EDI]
    SUB EDI, 4
    MOV ECX, ESI
    TEST ECX, ECX
    JZ @@Exit
    SUB ECX, 4
    MOV ECX, [ECX]
    //XOR EAX, EAX
    //@@Loop:
    //MOV DL, [ESI + EAX]
    //MOV [EDI + ECX], DL
    //INC EAX
    //LOOP @@Loop
    //@@Exit:
    PUSH ECX
    MOV EAX, ECX
    AND EAX, $3
    ADD EDI, EAX
    SHR ECX, 2
    // TEST ECX, ECX // wenn SHR das Zero-Flag nicht setzt, dann dieses einfügen
    JZ @@None4
    XOR EAX, EAX
    @@Loop4:
    MOV EDX, [ESI + EAX * 4]
    BSWAP EDX
    MOV [EDI + ECX * 4], EDX
    INC EAX
    LOOP @@Loop4
    @@None4:
    POP EAX
    MOV ECX, EAX
    AND ECX, $3
    JZ @@Exit
    AND EAX, $FFFFFFFC
    @@Loop:
    MOV DL, [ESI + EAX]
    MOV [EDI + ECX + 1], DL
    INC EAX
    LOOP @@Loop
    @@Exit:
    POP ESI
    POP EDI
  End;

{$IFDEF UNICODE}
Function ReverseString(Const Text: UnicodeString): UnicodeString; Overload;
  ASM
    PUSH EDX
    PUSH EAX
    XCHG EAX, EDX
    TEST EDX, EDX
    JZ @@ZeroSet
    SUB EDX, 4
    MOV EDX, [EDX]
    @@ZeroSet:
    CALL _UStrSetLength
    POP ESI
    POP EDI
    MOV EDI, [EDI]
    SUB EDI, 2
    MOV ECX, ESI
    TEST ECX, ECX
    JZ @@Exit
    SUB ECX, 4
    MOV ECX, [ECX]
    XOR EAX, EAX
    @@Loop:
    MOV DX, [ESI + EAX * 2]
    MOV [EDI + ECX * 2], DX
    INC EAX
    LOOP @@Loop
    @@Exit:
  End;
{$ENDIF}

Function ReverseString(Const Text: WideString): WideString; Overload;
  ASM
    PUSH EDX
    PUSH EAX
    XCHG EAX, EDX
    TEST EDX, EDX
    JZ @@ZeroSet
    SUB EDX, 4
    MOV EDX, [EDX]
    SHR EDX, 1
    @@ZeroSet:
    CALL _WStrSetLength
    POP ESI
    POP EDI
    MOV EDI, [EDI]
    SUB EDI, 2
    MOV ECX, ESI
    TEST ECX, ECX
    JZ @@Exit
    SUB ECX, 4
    MOV ECX, [ECX]
    SHR ECX, 1
    XOR EAX, EAX
    @@Loop:
    MOV DX, [ESI + EAX * 2]
    MOV [EDI + ECX * 2], DX
    INC EAX
    LOOP @@Loop
    @@Exit:
  End;
Und weil ich einfach zu doof bin, um die Funktionen der System-Unit aufzurufen
(ich hasse es, daß die Namen der System.pas nicht mit der System.dcu und der CPU-Anzeige übereinstimmen)
Delphi-Quellcode:
Procedure _LStrSetLength(Var Text: AnsiString; Len: Integer);
  Begin
    SetLength(Text, Len);
  End;

{$IFDEF UNICODE}
Procedure _WStrSetLength(Var Text: WideString; Len: Integer);
  Begin
    SetLength(Text, Len);
  End;
{$ENDIF}

Procedure _UStrSetLength(Var Text: UnicodeString; Len: Integer);
  Begin
    SetLength(Text, Len);
  End;
Ein Therapeut entspricht 1024 Gigapeut.
  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 09:33 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