OLD | NEW |
| (Empty) |
1 | |
2 #include "libctiny.h" | |
3 #include <windows.h> | |
4 #include <errno.h> | |
5 #include "memory.h" | |
6 | |
7 // memmove is defined first so it will use the intrinsic memcpy | |
8 void * __cdecl memmove(void * dst, const void * src, size_t count) { | |
9 void * ret = dst; | |
10 | |
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); | |
15 // while (count--) { | |
16 // *(char *)dst = *(char *)src; | |
17 // dst = (char *)dst + 1; | |
18 // src = (char *)src + 1; | |
19 // } | |
20 } | |
21 else { | |
22 // Overlapping Buffers - copy from higher addresses to lower addresses | |
23 dst = (char *)dst + count - 1; | |
24 src = (char *)src + count - 1; | |
25 | |
26 while (count--) { | |
27 *(char *)dst = *(char *)src; | |
28 dst = (char *)dst - 1; | |
29 src = (char *)src - 1; | |
30 } | |
31 } | |
32 | |
33 return(ret); | |
34 } | |
35 | |
36 // Turn off compiler intrinsics so that we can define these functions | |
37 #pragma function(memcmp, memcpy, memset) | |
38 | |
39 int __cdecl memcmp(const void * buf1, const void * buf2, size_t count) { | |
40 if (!count) | |
41 return(0); | |
42 while (--count && *(char *)buf1 == *(char *)buf2) { | |
43 buf1 = (char *)buf1 + 1; | |
44 buf2 = (char *)buf2 + 1; | |
45 } | |
46 return( *((unsigned char *)buf1) - *((unsigned char *)buf2) ); | |
47 } | |
48 | |
49 void * __cdecl memcpy(void * dst, const void * src, size_t count) { | |
50 void * ret = dst; | |
51 // copy from lower addresses to higher addresses | |
52 while (count--) { | |
53 *(char *)dst = *(char *)src; | |
54 dst = (char *)dst + 1; | |
55 src = (char *)src + 1; | |
56 } | |
57 return(ret); | |
58 } | |
59 | |
60 void * __cdecl memset(void *dst, int val, size_t count) { | |
61 void *start = dst; | |
62 while (count--) { | |
63 *(char *)dst = (char)val; | |
64 dst = (char *)dst + 1; | |
65 } | |
66 return(start); | |
67 } | |
68 | |
69 errno_t __cdecl memmove_s(void* dst, | |
70 size_t size_in_bytes, | |
71 const void* src, | |
72 size_t count) { | |
73 if (count == 0) { | |
74 return 0; | |
75 } | |
76 | |
77 if (!dst) return EINVAL; | |
78 if (!src) return EINVAL; | |
79 if (size_in_bytes < count) return ERANGE; | |
80 | |
81 memmove(dst, src, count); | |
82 return 0; | |
83 } | |
84 | |
85 errno_t __cdecl memcpy_s(void *dst, | |
86 size_t size_in_bytes, | |
87 const void *src, | |
88 size_t count) { | |
89 if (count == 0) { | |
90 return 0; | |
91 } | |
92 | |
93 if (!dst) return EINVAL; | |
94 if (!src) return EINVAL; | |
95 if (size_in_bytes < count) return ERANGE; | |
96 | |
97 memcpy(dst, src, count); | |
98 return 0; | |
99 } | |
100 | |
OLD | NEW |