1
0

memcpy.c 635 B

1234567891011121314151617181920212223242526272829
  1. #include <string.h>
  2. #include <stdlib.h>
  3. #include <stdint.h>
  4. #define SS (sizeof(size_t))
  5. #define ALIGN (sizeof(size_t)-1)
  6. #define ONES ((size_t)-1/UCHAR_MAX)
  7. void *memcpy(void *restrict dest, const void *restrict src, size_t n)
  8. {
  9. unsigned char *d = dest;
  10. const unsigned char *s = src;
  11. if (((uintptr_t)d & ALIGN) != ((uintptr_t)s & ALIGN))
  12. goto misaligned;
  13. for (; ((uintptr_t)d & ALIGN) && n; n--) *d++ = *s++;
  14. if (n) {
  15. size_t *wd = (void *)d;
  16. const size_t *ws = (const void *)s;
  17. for (; n>=SS; n-=SS) *wd++ = *ws++;
  18. d = (void *)wd;
  19. s = (const void *)ws;
  20. misaligned:
  21. for (; n; n--) *d++ = *s++;
  22. }
  23. return dest;
  24. }