diff options
author | dzwdz | 2023-08-14 18:51:07 +0200 |
---|---|---|
committer | dzwdz | 2023-08-14 18:51:07 +0200 |
commit | 642b5fb0007b64c77d186fcb018d571152ee1d47 (patch) | |
tree | 1c466461f3602d306be309a053edae558ef2568e /src/libk/mem.c | |
parent | 8050069c57b729c18c19b1a03ab6e4bf63b4735e (diff) |
reorganization: first steps
Diffstat (limited to 'src/libk/mem.c')
-rw-r--r-- | src/libk/mem.c | 82 |
1 files changed, 82 insertions, 0 deletions
diff --git a/src/libk/mem.c b/src/libk/mem.c new file mode 100644 index 0000000..14dd6bd --- /dev/null +++ b/src/libk/mem.c @@ -0,0 +1,82 @@ +#include <assert.h> +#include <shared/mem.h> +#include <stdint.h> + +union dualptr_const { const uintptr_t *w; const char *c; uintptr_t u; }; +union dualptr { uintptr_t *w; char *c; uintptr_t u; }; + +void *memchr(const void *s, int c, size_t n) { + const unsigned char *s2 = s; + for (size_t i = 0; i < n; i++) { + if (s2[i] == (unsigned char)c) + return (void*)&s2[i]; + } + return NULL; +} + +int memcmp(const void *s1, const void *s2, size_t n) { + const unsigned char *c1 = s1, *c2 = s2; + for (size_t i = 0; i < n; i++) { + if (c1[i] != c2[i]) { + if (c1[i] < c2[i]) return -1; + else return 1; + } + } + return 0; +} + +void *memcpy(void *dest, const void *src, size_t n) { + // TODO erms, rep movsb + union dualptr_const s = {.c = src}; + union dualptr d = {.c = dest}; + if (dest == src) return dest; + // assert(src >= dest || src + n < dest); + + for (; (d.u & 7) && n != 0; n--) { + *(d.c)++ = *(s.c)++; + } + while (n >= sizeof(uintptr_t)) { + *(d.w)++ = *(s.w)++; + n -= sizeof(uintptr_t); + } + while (n-- != 0) { + *(d.c)++ = *(s.c)++; + } + return dest; +} + +void *memmove(void *dest, const void *src, size_t n) { + if (src >= dest || src + n < dest) + return memcpy(dest, src, n); + for (; n; n--) /* naive reverse copy */ + ((uint8_t*)dest)[n-1] = ((uint8_t*)src)[n-1]; + return dest; +} + +void *memset(void *s, int c, size_t n) { + union dualptr d = {.c = s}; + + uintptr_t fill = (c & 0xff) * 0x0101010101010101; + while (n >= sizeof(uintptr_t)) { + *(d.w)++ = fill; + n -= sizeof(uintptr_t); + } + while (n-- != 0) + *(d.c)++ = c; + return s; +} + +int strcmp(const char *s1, const char *s2) { + while (*s1 && *s1 == *s2) { + s1++; s2++; + } + if (*s1 == *s2) return 0; + if (*s1 < *s2) return -1; + else return 1; +} + +size_t strlen(const char *s) { + size_t c = 0; + while (*s++) c++; + return c; +} |