summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/i386/memchr.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/i386/memchr.asm')
-rw-r--r--private/crt32/string/i386/memchr.asm96
1 files changed, 96 insertions, 0 deletions
diff --git a/private/crt32/string/i386/memchr.asm b/private/crt32/string/i386/memchr.asm
new file mode 100644
index 000000000..3e20583c2
--- /dev/null
+++ b/private/crt32/string/i386/memchr.asm
@@ -0,0 +1,96 @@
+ page ,132
+ title memchr - search memory for a given character
+;***
+;memchr.asm - search block of memory for a given character
+;
+; Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
+;
+;Purpose:
+; defines memchr() - search memory until a character is
+; found or a limit is reached.
+;
+;Revision History:
+; 05-16-84 RN initial version
+; 07-20-87 SKS rewritten for speed
+; 05-17-88 SJM Add model-independent (large model) ifdef
+; 08-04-88 SJM convert to cruntime/ add 32-bit support
+; 08-23-88 JCR 386 cleanup
+; 10-25-88 JCR General cleanup for 386-only code
+; 03-23-90 GJF Changed to _stdcall. Also, fixed the copyright.
+; 05-10-91 GJF Back to _cdecl, sigh...
+;
+;*******************************************************************************
+
+ .xlist
+ include cruntime.inc
+ .list
+
+page
+;***
+;char *memchr(buf, chr, cnt) - search memory for given character.
+;
+;Purpose:
+; Searched at buf for the given character, stopping when chr is
+; first found or cnt bytes have been searched through.
+;
+; Algorithm:
+; char *
+; memchr (buf, chr, cnt)
+; char *buf;
+; int chr;
+; unsigned cnt;
+; {
+; while (cnt && *buf++ != c)
+; cnt--;
+; return(cnt ? --buf : NULL);
+; }
+;
+;Entry:
+; char *buf - memory buffer to be searched
+; char chr - character to search for
+; unsigned cnt - max number of bytes to search
+;
+;Exit:
+; returns pointer to first occurence of chr in buf
+; returns NULL if chr not found in the first cnt bytes
+;
+;Uses:
+;
+;Exceptions:
+;
+;*******************************************************************************
+
+ CODESEG
+
+ public memchr
+memchr proc \
+ buf:ptr, \
+ chr:byte, \
+ cnt:IWORD
+
+ xor eax,eax ; return NULL if cnt == 0
+
+ mov ecx,(cnt) ; cx = count
+ jecxz short empty
+
+ push edi ; Preserve DI
+
+ mov edi,buf ; di = buffer
+ mov al,chr ; al = search char
+
+ repne scasb ; scan for byte
+ mov eax,0 ; assume not found (ax=NULL)
+ jne short done ; not found -- return NULL
+ lea eax,[edi-1] ; found - return address of matching byte
+done:
+ pop edi ; Restore DI
+empty:
+
+ifdef _STDCALL_
+ ret DPSIZE + 2*ISIZE ; _stdcall return
+else
+ ret ; _cdecl return
+endif
+
+memchr endp
+ end