Decoupling Architectural-specific Code (#35)
[lunaix-os.git] / lunaix-os / libs / klibc / string / mem.c
1 #include <klibc/string.h>
2 #include <lunaix/types.h>
3
4 void* weak
5 memcpy(void* dest, const void* src, unsigned long num)
6 {
7     for (size_t i = 0; i < num; i++) {
8         ((u8_t*)dest)[i] = ((u8_t*)src)[i];
9     }
10
11     return dest;
12 }
13
14 void* weak
15 memmove(void* dest, const void* src, unsigned long num)
16 {
17     u8_t* dest_ptr = (u8_t*)dest;
18     const u8_t* src_ptr = (const u8_t*)src;
19     if (dest_ptr < src_ptr) {
20         for (unsigned long i = 0; i < num; i++) {
21             *(dest_ptr + i) = *(src_ptr + i);
22         }
23     } else {
24         for (unsigned long i = num; i != 0; i--) {
25             *(dest_ptr + i - 1) = *(src_ptr + i - 1);
26         }
27     }
28     return dest;
29 }
30
31 void* weak
32 memset(void* ptr, int value, unsigned long num)
33 {
34     for (size_t i = 0; i < num; i++) {
35         ((u8_t*)ptr)[i] = 0;
36     }
37
38     return ptr;
39 }
40
41 int weak
42 memcmp(const void* ptr1, const void* ptr2, unsigned long num)
43 {
44     u8_t* p1 = (u8_t*)ptr1;
45     u8_t* p2 = (u8_t*)ptr2;
46     for (unsigned long i = 0; i < num; i++) {
47         int diff = *(p1 + i) - *(p2 + i);
48         if (diff != 0) {
49             return diff;
50         }
51     }
52     return 0;
53 }