summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/i386/memccpy.asm
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/i386/memccpy.asm')
-rw-r--r--private/crt32/string/i386/memccpy.asm103
1 files changed, 103 insertions, 0 deletions
diff --git a/private/crt32/string/i386/memccpy.asm b/private/crt32/string/i386/memccpy.asm
new file mode 100644
index 000000000..728f4ce23
--- /dev/null
+++ b/private/crt32/string/i386/memccpy.asm
@@ -0,0 +1,103 @@
+ page ,132
+ title memccpy - copy bytes until character found
+;***
+;memccpy.asm - copy bytes until a character is found
+;
+; Copyright (c) 1985-1991, Microsoft Corporation. All rights reserved.
+;
+;Purpose:
+; defines _memccpy() - copies bytes until a specifed character
+; is found, or a maximum number of characters have been copied.
+;
+;Revision History:
+; 05-16-84 RN initial version
+; 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 Minor 386 adjustments
+; 10-25-88 JCR General cleanup for 386-only code
+; 03-23-90 GJF Changed to _stdcall. Also, fixed the copyright.
+; 01-17-91 GJF ANSI naming.
+; 05-10-91 GJF Back to _cdecl, sigh...
+; 10-27-92 SKS Avoid using a MASM keyword ("C") as a parameter name
+;
+;*******************************************************************************
+
+ .xlist
+ include cruntime.inc
+ .list
+
+page
+;***
+;char *_memccpy(dest, src, _c, count) - copy bytes until character found
+;
+;Purpose:
+; Copies bytes from src to dest until count bytes have been
+; copied, or up to and including the character _c, whichever
+; comes first.
+;
+; Algorithm:
+; char *
+; _memccpy (dest, sorc, _c, count)
+; char *dest, *sorc, _c;
+; unsigned int count;
+; {
+; while (count && (*dest++ = *sorc++) != _c)
+; count--;
+;
+; return(count ? dest : NULL);
+; }
+;
+;Entry:
+; char *dest - pointer to memory to receive copy
+; char *src - source of bytes
+; char _c - character to stop copy at
+; int count - max number of bytes to copy
+;
+;Exit:
+; returns pointer to byte immediately after _c in dest;
+; returns NULL if _c was never found
+;
+;Uses:
+;
+;Exceptions:
+;
+;*******************************************************************************
+
+ CODESEG
+
+ public _memccpy
+_memccpy proc \
+ uses edi esi, \
+ dest:ptr byte, \
+ sorc:ptr byte, \
+ _c:byte, \
+ count:IWORD
+
+ mov edi,dest ; di = dest
+ mov esi,sorc ; si = source
+
+ mov ah,_c ; ah = byte to look for
+ mov ecx,count ; cx = max byte count
+ jecxz short retnull ; don't do loop if nothing to move
+
+lupe:
+ lodsb ; get byte into al and kick si
+ stosb ; store byte from al and kick di
+ cmp al,ah ; see if we just moved the byte
+ je short toend ; end of string
+
+ loop lupe ; dec cx & jmp to lupe if nonzero
+ ; else drop out & return NULL
+retnull:
+ xor edi,edi ; null pointer
+toend:
+ mov eax,edi ; return value
+
+ifdef _STDCALL_
+ ret 2*DPSIZE + 2*ISIZE ; _stdcall return
+else
+ ret ; _cdecl return
+endif
+
+_memccpy endp
+ end