{ 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} $89/$FB/ {MOV BX,DI ;BX = Ofs(Buffer)} $8B/$4E/ 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/