Another_eYes写的FastPos函数
来源:互联网 发布:xy坐标转换经纬度软件 编辑:程序博客网 时间:2024/05/17 03:12
- Type
- TFastPosProc = function (TagStr, SrcStr: PChar;
- TagCount: Integer; var SrcCount: Integer): Integer;
- function FastPos(TagStr, SrcStr: PChar; TagCount: Integer;
- var SrcCount: Integer): PChar; assembler;
- asm
- PUSH ESI
- PUSH EDI
- PUSH EBX
- PUSH EBP
- MOV ESI, EAX
- MOV EDI, EDX
- MOV EDX, SrcCount
- AND EDX, EDX
- JLE @NotFound
- DEC ECX
- JL @NotFound
- SUB EDX, ECX
-
- JLE @NotFound
- LODSB
- MOV AH, CL
- AND AH, 3
- SHR ECX, 1
- SHR ECX, 1
- MOV EBP, ECX
- MOV ECX, EDX
- @StartFind:
- REPNZ SCASB
- JNZ @NotFound
- MOV EDX, ECX
- MOV ECX, EBP
- MOV EBX, EDI
- REPZ CMPSD
- JNZ @FindNext
- XOR ECX, ECX
- MOV CL, AH
- REPZ CMPSB
- JNZ @FindNext
- DEC EDX
- MOV SrcCount, EDX
- MOV EAX, EBX
- DEC EAX
- JMP @Found
- @FindNext:
- MOV ESI, SrcStr
- INC ESI
- MOV ECX, EDX
- MOV EDI, EBX
- JMP @StartFind
- @NotFound:
- XOR EAX, EAX
- @Found:
- POP EBP
- POP EBX
- POP EDI
- POP ESI
- end;
- function FastPosNoCase(Tag, Src: PChar; TagCount: Integer;
- var SrcCount: Integer): PChar; assembler;
- asm
- PUSH ESI
- PUSH EDI
- PUSH EBX
- MOV EDI, EAX
- MOV ESI, EDX
- MOV EDX, SrcCount
- XCHG EDX, ECX
- DEC EDX
- JL @NotFound
- OR ECX, ECX
- JLE @NotFound
- SUB ECX, EDX
- JLE @NotFound
- MOV AH, [EDI]
- INC EDI
- CMP AH, 97
- JB @StartScan
- CMP AH, 122
- JA @StartScan
- SUB AH, 32
- @StartScan:
- OR ECX, ECX
- JZ @NotFound
- LODSB
- CMP AL, 97
- JB @@1
- CMP AL, 122
- JA @@1
- SUB AL, 32
- @@1:
- CMP AH, AL
- JZ @CmpStr
- DEC CX
- JNZ @StartScan
- JMP @NotFound
- @CmpStr:
- DEC ECX
- MOV EBX, EDX
- SHL EAX, 16
- @ContinueCompare:
- MOV AH, [ESI + EBX]
- CMP AH, 97
- JB @@2
- CMP AH, 122
- JA @@2
- SUB AH, 32
- @@2:
- MOV AL, [EDI+EBX]
- CMP AL, 97
- JB @@3
- CMP AL, 122
- JA @@3
- SUB AL, 32
- @@3:
- CMP AH, AL
- JNZ @FindNext
- DEC EBX
- JG @ContinueCompare
- @Found:
- DEC ECX
- MOV SrcCount, ECX
- MOV EAX, ESI
- DEC EAX
- JMP @OutPoint
- @NotFound:
- XOR EAX, EAX
- JMP @OutPoint
- @FindNext:
- SHR EAX, 16
- JMP @StartScan
- @OutPoint:
- POP EBX
- POP EDI
- POP ESI
- end;
- function FastReplace(var Target: string; FindStr: string; ReplaceStr: string;
- CaseSensitive: Boolean = True): Integer;
-
-
-
-
-
- var
- MaxCnt: Integer;
- MatchPoses: array of Integer;
- AdjustLen: Integer;
- n,
- l1,
- l2,
- l3,
- l: Integer;
- Proc: TFastPosProc;
- begin
- Result := 0;
- l1 := Length(Target);
- l2 := Length(FindStr);
- l3 := Length(ReplaceStr);
- if (l1 = 0) or (l2 = 0) then Exit;
- AdjustLen := 0;
- MaxCnt:=0;
- l := l1;
- if CaseSensitive then
- Proc := @FastPos
- else
- Proc := @FastPosNoCase;
-
- n := Integer(PChar(Target));
- while (n <> 0) do
- begin
- n := Integer(Proc(PChar(FindStr), Ptr(n), l2, l));
- if n <> 0 then
- begin
- if Result >= MaxCnt then
- begin
- MaxCnt := MaxCnt + 256;
- SetLength(MatchPoses, MaxCnt);
- end;
- MatchPoses[Result] := n + AdjustLen;
- Inc(AdjustLen, l3 - l2);
- Inc(Result);
- Inc(n, l2);
- end;
- end;
- if Result = 0 then Exit;
- if AdjustLen > 0 then
- begin
- SetLength(Target, l1 + AdjustLen);
-
-
- asm
- PUSH ESI
- PUSH EDI
- PUSH EBX
- PUSH EBP
- MOV EAX, ReplaceStr
- ADD EAX, L3
- DEC EAX
- MOV EBP, EAX
- MOV EDX, MatchPoses
- MOV EAX, Result
- MOV EBX, EAX
- DEC EAX
- SHL EAX, 1
- SHL EAX, 1
- ADD EDX, EAX
- MOV ESI, Target
- ADD ESI, L1
- DEC ESI
- MOV EDI, ESI
- ADD EDI, AdjustLen
- STD
- @@1:
- MOV ECX, EDI
- LEA EAX, [EDX]
- ADD EAX, L3
- DEC EAX
- SUB ECX, EAX
- MOV EAX, ECX
- SHR ECX, 1
- SHR ECX, 1
- REP MOVSD
- MOV ECX, EAX
- AND ECX, 3
- REP MOVSB
- MOV EAX, ESI
- SUB EAX, L2
- MOV ESI, EBP
- MOV ECX, L3
- SHR ECX, 1
- SHR ECX, 1
- REP MOVSD
- MOV ECX, L3
- AND ECX, 3
- REP MOVSB
- SUB EDX, 4
- MOV ESI, EAX
- DEC EBX
- JNZ @@1
-
-
-
- CLD
- POP EBP
- POP EBX
- POP EDI
- POP ESI
- end;
- end
- else if AdjustLen < 0 then
-
- begin
- asm
- PUSH ESI
- PUSH EDI
- PUSH EBX
- PUSH EBP
- MOV EAX, ReplaceStr
- ADD EAX, L1
- ADD EAX, AdjustLen
- PUSH EAX
-
- MOV EBX, Result
- MOV EDX, MatchPoses
- LEA ESI, [EDX]
- MOV EDI, ESI
- JMP @@2
- @@1:
- LEA ECX, [EDX]
- SUB ECX, EDI
- MOV EAX, ECX
- SHR ECX, 1
- SHR ECX, 1
- REP MOVSD
- MOV ECX, EAX
- AND ECX, 3
- REP MOVSB
- @@2:
- MOV EAX, ESI
- ADD EAX, L2
- MOV ESI, ReplaceStr
- MOV ECX, L3
- MOV EBP, ECX
- SHR ECX, 1
- SHR ECX, 1
- REP MOVSD
- MOV ECX, EBP
- AND ECX, 3
- REP MOVSB
- MOV ESI, EAX
- ADD EDX, 4
- DEC EBX
- JNZ @@1
- POP ECX
- SUB ECX, EDI
- MOV EBP, ECX
- SHR ECX, 1
- SHR ECX, 1
- REP MOVSD
- MOV ECX, EBP
- AND ECX, 3
- REP MOVSB
- POP EBP
- POP EBX
- POP EDI
- POP ESI
- end;
- SetLength(Target, l1 + AdjustLen);
- end
- else begin
-
- asm
- PUSH ESI
- PUSH EDI
- PUSH EBX
- PUSH EBP
- MOV EBX, ReplaceStr
- MOV EDX, MatchPoses
- MOV EAX, Result
- MOV EBP, L3
- @@1:
- LEA EDI, [EDX]
- MOV ESI, EBX
- MOV ECX, EBP
- SHR ECX, 1
- SHR ECX, 1
- REP MOVSD
- MOV ECX, EBP
- AND ECX, 3
- REP MOVSB
- ADD EDX, 4
- DEC EAX
- JNZ @@1
- POP EBP
- POP EBX
- POP EDI
- POP ESI
- end;
- end;
- end;