:: limine / test / memory.c 1.0 KB raw

1
#include <stddef.h>
2
#include <stdint.h>
3
4
void *memcpy(void *dest, const void *src, size_t n) {
5
    uint8_t *pdest = dest;
6
    const uint8_t *psrc = src;
7
8
    for (size_t i = 0; i < n; i++) {
9
        pdest[i] = psrc[i];
10
    }
11
12
    return dest;
13
}
14
15
void *memset(void *s, int c, size_t n) {
16
    uint8_t *p = s;
17
18
    for (size_t i = 0; i < n; i++) {
19
        p[i] = (uint8_t)c;
20
    }
21
22
    return s;
23
}
24
25
void *memmove(void *dest, const void *src, size_t n) {
26
    uint8_t *pdest = dest;
27
    const uint8_t *psrc = src;
28
29
    if ((uintptr_t)src > (uintptr_t)dest) {
30
        for (size_t i = 0; i < n; i++) {
31
            pdest[i] = psrc[i];
32
        }
33
    } else if ((uintptr_t)src < (uintptr_t)dest) {
34
        for (size_t i = n; i > 0; i--) {
35
            pdest[i-1] = psrc[i-1];
36
        }
37
    }
38
39
    return dest;
40
}
41
42
int memcmp(const void *s1, const void *s2, size_t n) {
43
    const uint8_t *p1 = s1;
44
    const uint8_t *p2 = s2;
45
46
    for (size_t i = 0; i < n; i++) {
47
        if (p1[i] != p2[i])
48
            return p1[i] < p2[i] ? -1 : 1;
49
    }
50
51
    return 0;
52
}
tab: 248 wrap: offon