| #include <string.h> |
| #include <stdint.h> |
| |
| #define WT size_t |
| #define WS (sizeof(WT)) |
| |
| void* memmove(void* dest, const void* src, size_t n) { |
| char* d = dest; |
| const char* s = src; |
| |
| if (d == s) |
| return d; |
| if (s + n <= d || d + n <= s) |
| return memcpy(d, s, n); |
| |
| if (d < s) { |
| if ((uintptr_t)s % WS == (uintptr_t)d % WS) { |
| while ((uintptr_t)d % WS) { |
| if (!n--) |
| return dest; |
| *d++ = *s++; |
| } |
| for (; n >= WS; n -= WS, d += WS, s += WS) |
| *(WT*)d = *(WT*)s; |
| } |
| for (; n; n--) |
| *d++ = *s++; |
| } else { |
| if ((uintptr_t)s % WS == (uintptr_t)d % WS) { |
| while ((uintptr_t)(d + n) % WS) { |
| if (!n--) |
| return dest; |
| d[n] = s[n]; |
| } |
| while (n >= WS) |
| n -= WS, *(WT*)(d + n) = *(WT*)(s + n); |
| } |
| while (n) |
| n--, d[n] = s[n]; |
| } |
| |
| return dest; |
| } |