summaryrefslogtreecommitdiffstats
path: root/private/crt32/string/memcpy.c
diff options
context:
space:
mode:
Diffstat (limited to 'private/crt32/string/memcpy.c')
-rw-r--r--private/crt32/string/memcpy.c80
1 files changed, 80 insertions, 0 deletions
diff --git a/private/crt32/string/memcpy.c b/private/crt32/string/memcpy.c
new file mode 100644
index 000000000..a4348e74e
--- /dev/null
+++ b/private/crt32/string/memcpy.c
@@ -0,0 +1,80 @@
+/***
+*memcpy.c - contains memcpy routine
+*
+* Copyright (c) 1988-1991, Microsoft Corporation. All right reserved.
+*
+*Purpose:
+* memcpy() copies a source memory buffer to a destination buffer.
+* Overlapping buffers are not treated specially, so propogation may occur.
+*
+*Revision History:
+* 05-31-89 JCR C version created.
+* 02-27-90 GJF Fixed calling type, #include <cruntime.h>, fixed
+* copyright.
+* 10-01-90 GJF New-style function declarator. Also, rewrote expr. to
+* avoid using cast as an lvalue.
+* 04-01-91 SRW Add #pragma function for i386 _WIN32_ and _CRUISER_
+* builds
+* 04-05-91 GJF Speed up for large buffers by moving int-sized chunks
+* as much as possible.
+* 08-06-91 GJF Backed out 04-05-91 change. Pointers would have to be
+* dword-aligned for this to work on MIPS.
+* 07-16-93 SRW ALPHA Merge
+*
+*******************************************************************************/
+
+#include <cruntime.h>
+#include <string.h>
+
+#ifdef _MSC_VER
+#pragma function(memcpy)
+#endif
+
+/***
+*memcpy - Copy source buffer to destination buffer
+*
+*Purpose:
+* memcpy() copies a source memory buffer to a destination memory buffer.
+* This routine does NOT recognize overlapping buffers, and thus can lead
+* to propogation.
+*
+* For cases where propogation must be avoided, memmove() must be used.
+*
+*Entry:
+* void *dst = pointer to destination buffer
+* const void *src = pointer to source buffer
+* size_t count = number of bytes to copy
+*
+*Exit:
+* Returns a pointer to the destination buffer
+*
+*Exceptions:
+*******************************************************************************/
+
+void * _CALLTYPE1 memcpy (
+ void * dst,
+ const void * src,
+ size_t count
+ )
+{
+ void * ret = dst;
+
+#if defined(_M_MRX000) || defined(_M_ALPHA) || defined(_M_PPC)
+ {
+ extern void RtlMoveMemory( void *, const void *, size_t count );
+
+ RtlMoveMemory( dst, src, count );
+ }
+#else
+ /*
+ * copy from lower addresses to higher addresses
+ */
+ while (count--) {
+ *(char *)dst = *(char *)src;
+ dst = (char *)dst + 1;
+ src = (char *)src + 1;
+ }
+#endif
+
+ return(ret);
+}