]>
Commit | Line | Data |
---|---|---|
dcf13b6f DG |
1 | #include <string.h> |
2 | #include <stdint.h> | |
3 | ||
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 | ||
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 | ||
24 | void *memcpy(void *restrict dst, const void *restrict src, size_t n) { | |
25 | return copy_forward(dst, src, n); | |
26 | } | |
27 | ||
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 | ||
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 | } |