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