]> git.corax.cc Git - corax/commitdiff
libc: Add memcpy() implementation, fix bug in memset()
authorMatthias Kruk <m@m10k.eu>
Tue, 5 May 2020 17:20:33 +0000 (02:20 +0900)
committerMatthias Kruk <m@m10k.eu>
Tue, 5 May 2020 17:20:33 +0000 (02:20 +0900)
libc/string.c

index af6ea7fbd305de9a4558a6f78d29fc3ae11958f7..5822776f21b742073d8429083ae783a6d5c471c4 100644 (file)
@@ -12,12 +12,40 @@ size_t strlen(const char *s)
 void *memset(void *s, int c, size_t n)
 {
        char *ptr;
+       size_t i;
 
        ptr = (char*)s;
 
-       while(--n >= 0) {
-               *ptr++ = (char)c;
+       for(i = 0; i < n; i++) {
+               ptr[i] = (char)c;
        }
 
        return(s);
 }
+
+void* memcpy(void *dst, const void *src, size_t n)
+{
+        u32_t *d;
+        const u32_t *s;
+
+        d = (u32_t*)dst;
+        s = (const u32_t*)src;
+
+        while(n > 4) {
+                *d++ = *s++;
+                n -= 4;
+        }
+
+        if(n >= 2) {
+                *((u16_t*)d) = *((u16_t*)s);
+                d = (u32_t*)(((void*)d) + 2);
+                s = (u32_t*)(((void*)s) + 2);
+                n -= 2;
+        }
+
+        if(n >= 1) {
+                *((u8_t*)d) = *((u8_t*)s);
+        }
+
+        return(dst);
+}