[Back to FINDREPL SWAG index] [Back to Main SWAG index] [Original]
{ Default Compiler Directives}
{$S-,R-,V-,I-,N-,B-,F-}
{$IFNDEF Ver40}
{Allow overlays}
{$F+,O-,X+,A-}
{$ENDIF}
UNIT SEARCH;
INTERFACE
function SearchBuffer(var Buffer; BufLength : Word;
var Match; MatLength : Word) : Word;
{-Search through Buffer for Match. BufLength is length of range to search.
MatLength is length of string to match. Returns number of bytes searched
to find Match, $FFFF if not found.}
IMPLEMENTATION
function SearchBuffer(var Buffer; BufLength : Word;
var Match; MatLength : Word) : Word;
{-Search through Buffer for Match. BufLength is length of range to search.
MatLength is length of string to match. Returns number of bytes searched
to find Match, $FFFF if not found.}
begin
inline(
$1E/ {PUSH DS ;Save DS}
$FC/ {CLD ;Go forward}
$C4/$7E/<Buffer/ {LES DI,[BP+<Buffer] ;ES:DI => Buffer}
$89/$FB/ {MOV BX,DI ;BX = Ofs(Buffer)}
$8B/$4E/<BufLength/ {MOV CX,[BP+<BufLength] ;CX = Length of range to scan}
$8B/$56/<MatLength/ {MOV DX,[BP+<MatLength] ;DX = Length of match string}
$85/$D2/ {TEST DX,DX ;Length(Match) = 0?}
$74/$24/ {JZ Error ;If so, we're done}
$C5/$76/<Match/ {LDS SI,[BP+<Match] ;DS:SI => Match buffer}
$AC/ {LODSB ;AL = Match[1]; DS:SI => Match[2]}
$4A/ {DEC DX ;DX = MatLength-1}
$29/$D1/ {SUB CX,DX ;CX = BufLength-(MatLength-1)}
$76/$1B/ {JBE Error ;Error if BufLength is less}
{;Search for first character in Match}
{Next:}
$F2/$AE/ {REPNE SCASB ;Search forward for Match[1]}
$75/$17/ {JNE Error ;Done if not found}
$85/$D2/ {TEST DX,DX ;If Length = 1 (DX = 0) ...}
$74/$0C/ {JZ Found ; the "string" was found}
{;Search for remainder of Match}
$51/ {PUSH CX ;Save CX}
$57/ {PUSH DI ;Save DI}
$56/ {PUSH SI ;Save SI}
$89/$D1/ {MOV CX,DX ;CX = Length(Match) - 1}
$F3/$A6/ {REPE CMPSB ;Does rest of string match?}
$5E/ {POP SI ;Restore SI}
$5F/ {POP DI ;Restore DI}
$59/ {POP CX ;Restore CX}
$75/$EC/ {JNE Next ;Try again if no match}
{;Calculate number of bytes searched and return}
{Found:}
$4F/ {DEC DI ;DX = Offset where found}
$89/$F8/ {MOV AX,DI ;AX = Offset where found}
$29/$D8/ {SUB AX,BX ;Subtract starting offset}
$EB/$03/ {JMP SHORT SDone ;Done}
{;Match was not found}
{Error:}
$31/$C0/ {XOR AX,AX ;Return $FFFF}
$48/ {DEC AX}
{SDone:}
$1F/ {POP DS ;Restore DS}
$89/$46/<SearchBuffer); {MOV [BP+<Search],AX ;Set func result}
end;
END.
[Back to FINDREPL SWAG index] [Back to Main SWAG index] [Original]