mirror of https://github.com/lianthony/NT4.0
You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
95 lines
2.5 KiB
95 lines
2.5 KiB
; ========================================================
|
|
|
|
COMMENT #
|
|
|
|
FINDSTR.ASM
|
|
|
|
Copyright (c) 1988 - Microsoft Corp.
|
|
All rights reserved.
|
|
|
|
johnhe - 08/01/89 Initial coding
|
|
01/12/89 Converted to LIB form
|
|
|
|
END COMMENT #
|
|
|
|
;========================================================
|
|
|
|
DOSSEG
|
|
.MODEL LARGE,C
|
|
|
|
|
|
|
|
;========================================================
|
|
|
|
.CODE
|
|
|
|
; ========================================================
|
|
; FindString( char *Buffer, char *String, unsigned BufferSize );
|
|
;
|
|
; Quickly searches for a string in a buffer of any type of
|
|
; data. The search is case sensitive.
|
|
;
|
|
; Buffer - The buffer to search
|
|
; String - The zero terminated string to search for
|
|
; Count - The length of the buffer in bytes
|
|
; ========================================================
|
|
|
|
FindString PROC USES DS ES DI SI, Buffer:DWORD, String:DWORD, Count:WORD
|
|
|
|
cld
|
|
mov CX,Count ; Put length of buffer in CX
|
|
or CX,CX ; Make sure length > 0
|
|
jnz LoadStrings
|
|
jmp SHORT NoMatch
|
|
|
|
LoadStrings:
|
|
lds SI,String ; Pointer to string in DS:SI
|
|
les DI,Buffer ; Pointer to buffer in ES:DI
|
|
lodsb ; Put first character of string in AL
|
|
or AL,AL ; Check for zero length string
|
|
jnz FindChar
|
|
jmp SHORT NoMatch
|
|
FindChar:
|
|
repne scasb ; Try to match the first char in the string
|
|
jcxz NoMatch ; If CX==0 no matches were found
|
|
push AX ; Save setup of the scan so it can be
|
|
push DI ; continued if this is not a matching string
|
|
push SI
|
|
push CX
|
|
CmpString:
|
|
lodsb ; Get next char in the string
|
|
or AL,AL ; See if EOL marker
|
|
jnz CheckForMatch ; If not EOL compare the character
|
|
pop CX ; If EOL we found a matching string
|
|
pop SI ; So restore the register and break the loop
|
|
pop DI
|
|
pop AX
|
|
jmp SHORT FoundMatch
|
|
CheckForMatch:
|
|
cmp AL,ES:[DI] ; Cmp next char from str. with next in buffer
|
|
jne RestoreRegs ; If not equal go back to checking first char
|
|
inc DI ; Else point to next char in the buffer
|
|
dec CX ; and dec count
|
|
jz RestoreRegs ; If CX==0 were at the end of the buffer
|
|
jmp SHORT CmpString ; Else cmp the next chars
|
|
RestoreRegs:
|
|
pop CX ; Restore register setup used by char scan
|
|
pop SI
|
|
pop DI
|
|
pop AX
|
|
jmp SHORT FindChar ; Go back to checking for first char match
|
|
FoundMatch:
|
|
xor AX,AX ; Signal OK (ie: match found)
|
|
jmp SHORT FindStringReturn ; Jmp to procedure return
|
|
NoMatch:
|
|
mov AX,-1 ; Signal no match was found
|
|
FindStringReturn:
|
|
ret ; Finished
|
|
|
|
FindString ENDP
|
|
|
|
; ========================================================
|
|
|
|
END
|
|
|
|
; ========================================================
|