function _FastCharPos(Str:String;const chr :char;const IgnoreCase:BOOLEAN;const offset :integer=0 ):Integer;assembler;
function FastCharPos(Str:String;const chr :char;const IgnoreCase:BOOLEAN ):Integer;assembler;
function FastCharPosEx(Str:String;const chr :char;const IgnoreCase:BOOLEAN;const offset :integer=0 ):Integer;assembler;
function FastStrPos(Str:String;SubStr:String;const IgnoreCase:Boolean=False):Integer;assembler;
function FastStrPosEx(Str:String;SubStr:String;const IgnoreCase:Boolean=False;offset:integer=0):Integer;assembler;
//-------------> BY SMP3 <------------------------
function _FastCharPos(Str:String;const chr :char;
const IgnoreCase:BOOLEAN;
const offset :integer=0 ):Integer;assembler;
asm
{EAX =Str}
{EDX =chr}
{ECX =IgnoreCase}
PUSH EBX
PUSH ESI
MOV ESI,DWORD PTR SS:[ebp+7]
ROR ESI,8 {offset}
PUSH ESI
{$IFDEF UNICODE}
SHL ESI,1
{$ENDIF}
ADD EAX,ESI
POP ESI
XOR EDI,EDI
TEST EAX,EAX
JE @RFALSE
@LOOP:
MOV BL,BYTE PTR DS:[EAX]
CMP BL,DL
JE @EQU
TEST ECX,ECX
JNE @IGNORECASE
JMP @CASE
@IGNORECASE:
MOV BH,BL
CMP BH,DL
JLE @LESS
SUB BH,DL
JMP @GREAT
@LESS:
PUSH EDX
SUB DL,BH
MOV BH,DL
POP EDX
@GREAT:
CMP BH,32
JE @EQU
@CASE:
INC ESI
{$IFDEF UNICODE}
ADD EAX,2
{$ELSE}
INC EAX
{$ENDIF}
TEST BL,BL
JNE @LOOP
JMP @RFALSE
@EQU:
MOV EAX,ESI
JMP @FIN
@RFALSE:
MOV EAX ,-1
@FIN:
INC EAX
POP ESI
POP EBX
end;
function FastCharPos(Str:String;const chr :char;const IgnoreCase:BOOLEAN ):Integer;assembler;
asm
{EAX =Str}
{EDX =chr}
{ECX =IgnoreCase}
PUSH EDX
PUSH EBX
PUSH ESI
PUSH EDI
XOR EDI,EDI
XOR ESI,ESI
TEST EAX,EAX
JE @RFALSE
@LOOP:
MOV BL,BYTE PTR DS:[EAX]
CMP BL,DL
JE @EQU
TEST ECX,ECX
JNE @IGNORECASE
JMP @CASE
@IGNORECASE:
MOV BH,BL
CMP BH,DL
JLE @LESS
SUB BH,DL
JMP @GREAT
@LESS:
PUSH EDX
SUB DL,BH
MOV BH,DL
POP EDX
@GREAT:
CMP BH,32
JE @EQU
@CASE:
INC ESI
{$IFDEF UNICODE}
ADD EAX,2
{$ELSE}
INC EAX
{$ENDIF}
TEST BL,BL
JNE @LOOP
JMP @RFALSE
@EQU:
MOV EAX,ESI
JMP @FIN
@RFALSE:
MOV EAX ,-1
@FIN:
INC EAX
POP EDI
POP ESI
POP EBX
POP EDX
end;
function FastCharPosEx(Str:String;const chr :char;const IgnoreCase:BOOLEAN;const offset :integer=0 ):Integer;assembler;
asm
TEST EAX,EAX
JE @NULL
PUSH EDX
PUSH ESI
MOV ESI,DWORD PTR SS:[EBP+8] {offset}
PUSH ESI
{$IFDEF UNICODE}
SHL ESI,1
{$ENDIF}
ADD EAX,ESI
POP ESI
PUSH ESI
CALL FastCharPos
TEST EAX,EAX
JE @FIN
ADD EAX,ESI
@Fin:
POP ESI
POP ESI
POP EDX
@NULL:
end;
function FastStrPos(Str:String;SubStr:String;const IgnoreCase:Boolean=False):Integer;assembler;
asm
PUSH EBX
PUSH EDX
PUSH EDI
PUSH ESI
PUSH ECX
MOV ESI,[EDX-4]
CMP ESI,1
JE @@@FastCharPos
JMP @@@FastStrPos
@@@FastCharPos : {Length(SubStr)=1 => Is Char}
MOV DX,[EDX]
CALL FastCharPos
JMP @FIN
@@@FastStrPos:
MOV EBX,EAX
XOR EDI,EDI
MOV EAX,EBX
MOV ESI,EDX
@NEXT:
POP ECX
MOV EAX,EBX
PUSH EDX
MOV DX,[EDX]
TEST EDI,EDI
JNE @SUBONE
JMP @NSUBONE
@SUBONE:
DEC EDI
@NSUBONE:
PUSH EDI
CALL FastCharPosEx
TEST EDI,EDI
JNE @ADDONE
JMP @NADDONE
@ADDONE:
INC EDI
@NADDONE:
POP EDX
PUSH ECX
TEST EAX,EAX
JE @NOTFOUND
DEC EAX
TEST EDI,EDI
JE @FIRST
CMP EAX,EDI
JNE @TRYAGAIN
@FIRST:
MOV EDI,EAX
INC EDI
JMP @NOTFIRST
@TRYAGAIN: {Get Next Index }
MOV EDX,ESI
{$IFDEF UNICODE}
SUB EDX,2
{$ELSE}
DEC EDX
{$ENDIF}
MOV EDI,EAX
@NOTFIRST:
{$IFDEF UNICODE}
ADD EDX,2
{$ELSE}
INC EDX
{$ENDIF}
POP ECX
PUSH ECX
MOV CX,[EDX]
TEST CX,CX
JNE @NEXT
JMP @RTRUE
@NOTFOUND:
JMP @RFALSE
@RTRUE:
ADD EAX,2
SUB EAX,[ESI-4]
JMP @FIN
@RFALSE:
MOV EAX,0
@FIN:
POP ECX
POP ESI
POP EDI
POP EDX
POP EBX
end;
function FastStrPosEx(Str:String;SubStr:String;const IgnoreCase:Boolean=False;offset:integer=0):Integer;assembler;
asm
TEST EAX,EAX
JE @NULL
TEST EDX,EDX
JE @NULL
PUSH ESI
MOV ESI,DWORD PTR SS:[ebp+8] {offset}
PUSH ESI
{$IFDEF UNICODE}
IMUL ESI,2
{$ENDIF}
ADD EAX,ESI
POP ESI
CALL FastStrPos
ADD EAX,ESI
POP ESI
@NULL:
end;