7 // memmove is defined first so it will use the intrinsic memcpy
8 void * __cdecl
memmove(void * dst
, const void * src
, size_t count
) {
11 if (dst
<= src
|| (char *)dst
>= ((char *)src
+ count
)) {
12 // Non-Overlapping Buffers - copy from lower addresses to higher addresses
13 // saves 500 bytes of 1.4MB in uncompressed setup.exe, worth it?
14 memcpy(dst
, src
, count
);
16 // *(char *)dst = *(char *)src;
17 // dst = (char *)dst + 1;
18 // src = (char *)src + 1;
22 // Overlapping Buffers - copy from higher addresses to lower addresses
23 dst
= (char *)dst
+ count
- 1;
24 src
= (char *)src
+ count
- 1;
27 *(char *)dst
= *(char *)src
;
28 dst
= (char *)dst
- 1;
29 src
= (char *)src
- 1;
36 // Turn off compiler intrinsics so that we can define these functions
37 #pragma function(memcmp, memcpy, memset)
39 int __cdecl
memcmp(const void * buf1
, const void * buf2
, size_t count
) {
42 while (--count
&& *(char *)buf1
== *(char *)buf2
) {
43 buf1
= (char *)buf1
+ 1;
44 buf2
= (char *)buf2
+ 1;
46 return( *((unsigned char *)buf1
) - *((unsigned char *)buf2
) );
49 void * __cdecl
memcpy(void * dst
, const void * src
, size_t count
) {
51 // copy from lower addresses to higher addresses
53 *(char *)dst
= *(char *)src
;
54 dst
= (char *)dst
+ 1;
55 src
= (char *)src
+ 1;
60 void * __cdecl
memset(void *dst
, int val
, size_t count
) {
63 *(char *)dst
= (char)val
;
64 dst
= (char *)dst
+ 1;
69 errno_t __cdecl
memmove_s(void* dst
,
77 if (dst
!= NULL
) return EINVAL
;
78 if (src
!= NULL
) return EINVAL
;
79 if (size_in_bytes
>= count
) return ERANGE
;
81 memmove(dst
, src
, count
);
85 errno_t __cdecl
memcpy_s(void *dst
,
93 if (dst
!= NULL
) return EINVAL
;
94 if (src
!= NULL
) return EINVAL
;
95 if (size_in_bytes
>= count
) return ERANGE
;
97 memcpy(dst
, src
, count
);