1 #include <string.h>
2 #include <stdint.h>
3
copy_forward(void * restrict dst,const void * restrict src,size_t n)4 static void *copy_forward(void *restrict dst, const void *restrict src, size_t n) {
5 char *d = (char *)dst;
6 const char *s = (const char *)src;
7 while (n-- != 0) {
8 *d++ = *s++;
9 }
10 return dst;
11 }
12
copy_backward(void * restrict dst,const void * restrict src,size_t n)13 static void *copy_backward(void *restrict dst, const void *restrict src, size_t n) {
14 char *d = (char *)dst;
15 const char *s = (const char *)src;
16 d += n;
17 s += n;
18 while (n-- != 0) {
19 *--d = *--s;
20 }
21 return dst;
22 }
23
memcpy(void * restrict dst,const void * restrict src,size_t n)24 void *memcpy(void *restrict dst, const void *restrict src, size_t n) {
25 return copy_forward(dst, src, n);
26 }
27
memmove(void * dst,const void * src,size_t n)28 void *memmove(void *dst, const void *src, size_t n) {
29 if ((uintptr_t)dst - (uintptr_t)src >= n) {
30 return copy_forward(dst, src, n);
31 }
32 return copy_backward(dst, src, n);
33 }
34
memset(void * restrict dst,int c,size_t n)35 void *memset(void *restrict dst, int c, size_t n) {
36 char *d = (char *)dst;
37 while (n-- != 0) {
38 *d++ = c;
39 }
40 return dst;
41 }
42