]> pd.if.org Git - pdclib/blobdiff - functions/string/memcpy.c
Merged PDPCLIB and Therx code.
[pdclib] / functions / string / memcpy.c
index d0da5567a018c7b947de9b372a6d2ba20cce5a4d..d53b22e0fa3ae3fb2b063ec92234989ce69cbee2 100644 (file)
@@ -6,3 +6,69 @@
 // ----------------------------------------------------------------------------
 
 void * memcpy( void * restrict s1, const void * restrict s2, size_t n ) { /* TODO */ };
+
+/* Therx code
+{
+    void * ret = s1;
+    const char * src = (const char *) s2;
+    char * dst = (char *) s1;
+    for( ; n != 0; n-- )
+    {
+        *dst++ = *src++;
+    }
+    return ret;
+}
+*/
+
+/* PDPC code - unreviewed
+void *memcpy(void *s1, const void *s2, size_t n)
+{
+    register const unsigned char *f = s2;
+    register const unsigned char *fe;
+    register unsigned char *t = s1;
+    
+    fe = f + n;
+    while (f != fe)
+    {
+        *t++ = *f++;
+    }
+    return (s1);
+}
+#else
+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);
+}
+*/