summaryrefslogtreecommitdiff
path: root/src/libk/mem.c
diff options
context:
space:
mode:
authordzwdz2023-08-14 18:51:07 +0200
committerdzwdz2023-08-14 18:51:07 +0200
commit642b5fb0007b64c77d186fcb018d571152ee1d47 (patch)
tree1c466461f3602d306be309a053edae558ef2568e /src/libk/mem.c
parent8050069c57b729c18c19b1a03ab6e4bf63b4735e (diff)
reorganization: first steps
Diffstat (limited to 'src/libk/mem.c')
-rw-r--r--src/libk/mem.c82
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;
+}