// This code is Public Domain. Use, modify, and redistribute at will.
// ----------------------------------------------------------------------------
-void * memcpy( void * restrict s1, const void * restrict s2, size_t n ) { /* TODO */ };
+#include <string.h>
+
+void * memcpy( void * restrict dest, const void * restrict src, size_t n )
+{
+ const char * src_p = (const char *) src;
+ char * dest_p = (char *) dest;
+ while ( n-- )
+ {
+ *dest_p++ = *src_p++;
+ }
+ return dest;
+}
+
+/* TODO: This is code from PDPC, optimizing for word access.
+
+void *memcpy(void *s1, const void *s2, size_t n)
+{
+ register unsigned int *p = (unsigned int *)s1;
+ register unsigned int *cs2 = (unsigned int *)s2;
+ register unsigned int *endi;
+
+ endi = (unsigned int *)((char *)p + (n & ~0x03));
+ while (p != endi)
+ {
+ *p++ = *cs2++;
+ }
+ switch (n & 0x03)
+ {
+ case 0:
+ break;
+ case 1:
+ *(char *)p = *(char *)cs2;
+ break;
+ case 2:
+ *(char *)p = *(char *)cs2;
+ p = (unsigned int *)((char *)p + 1);
+ cs2 = (unsigned int *)((char *)cs2 + 1);
+ *(char *)p = *(char *)cs2;
+ break;
+ case 3:
+ *(char *)p = *(char *)cs2;
+ p = (unsigned int *)((char *)p + 1);
+ cs2 = (unsigned int *)((char *)cs2 + 1);
+ *(char *)p = *(char *)cs2;
+ p = (unsigned int *)((char *)p + 1);
+ cs2 = (unsigned int *)((char *)cs2 + 1);
+ *(char *)p = *(char *)cs2;
+ break;
+ }
+ return (s1);
+}
+*/