]> pd.if.org Git - pdclib/blobdiff - functions/string/memcpy.c
Re-import from Subversion.
[pdclib] / functions / string / memcpy.c
index d0da5567a018c7b947de9b372a6d2ba20cce5a4d..4e7b63cc32a150dbad70e1e4825bca4c050f905d 100644 (file)
@@ -1,8 +1,59 @@
-// ----------------------------------------------------------------------------
-// $Id$
-// ----------------------------------------------------------------------------
-// Public Domain C Library - http://pdclib.sourceforge.net
-// This code is Public Domain. Use, modify, and redistribute at will.
-// ----------------------------------------------------------------------------
-
-void * memcpy( void * restrict s1, const void * restrict s2, size_t n ) { /* TODO */ };
+/* ----------------------------------------------------------------------------
+ * $Id$
+ * ----------------------------------------------------------------------------
+ * Public Domain C Library - http://pdclib.sourceforge.net
+ * This code is Public Domain. Use, modify, and redistribute at will.
+ * --------------------------------------------------------------------------*/
+
+#include <__size_t.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);
+}
+*/