memmove.c 734 B

123456789101112131415161718192021222324252627282930313233343536
  1. #include <string.h>
  2. #include <stdint.h>
  3. #define WT size_t
  4. #define WS (sizeof(WT))
  5. void *memmove(void *dest, const void *src, size_t n)
  6. {
  7. char *d = dest;
  8. const char *s = src;
  9. if (d==s) return d;
  10. if (s+n <= d || d+n <= s) return memcpy(d, s, n);
  11. if (d<s) {
  12. if ((uintptr_t)s % WS == (uintptr_t)d % WS) {
  13. while ((uintptr_t)d % WS) {
  14. if (!n--) return dest;
  15. *d++ = *s++;
  16. }
  17. for (; n>=WS; n-=WS, d+=WS, s+=WS) *(WT *)d = *(WT *)s;
  18. }
  19. for (; n; n--) *d++ = *s++;
  20. } else {
  21. if ((uintptr_t)s % WS == (uintptr_t)d % WS) {
  22. while ((uintptr_t)(d+n) % WS) {
  23. if (!n--) return dest;
  24. d[n] = s[n];
  25. }
  26. while (n>=WS) n-=WS, *(WT *)(d+n) = *(WT *)(s+n);
  27. }
  28. while (n) n--, d[n] = s[n];
  29. }
  30. return dest;
  31. }