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;