26-03-2013, 10:06 AM
السلام عليكم ورحمة الله وبركاته
لقد بدأت العمل على مشروع جديد FastFunctions
FastFunctions :
المشروع عبارة عن اعادة كتابة دوال بالاسمبلي سريعة وتدعم اليونيكود .. حاليا لقد كتبت عدة دوال متوافقة مع x86 لكنها تحتاج الى الاختبار
أنوي دعم x64 لكن ليس في الوقت الراهن ..
المشروع بترخيص MPL

الباب مفتوح لم أراد التطوير
أرجـــوا منكم تجربة هذه الدوال واعلامي بأي Bug
PHP كود :
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;