diff --git a/src/kernel/include/memory.h b/src/kernel/include/memory.h index 8af8e45..17cb7a4 100644 --- a/src/kernel/include/memory.h +++ b/src/kernel/include/memory.h @@ -21,3 +21,12 @@ #define PAGE_SIZE 0x1000 #define ENTRIES_PER_PT 512 + +#ifndef __ASSEMBLER__ +#include +void *memcpy(void *dst, const void *src, size_t n); +void *memset(void *s, int c, size_t n); +void *memmove(void *dest, const void *src, size_t n); +int memcmp(const void *s1, const void *s2, size_t n); +size_t strlen(const char *s); +#endif diff --git a/src/kernel/memory/string.c b/src/kernel/memory/string.c new file mode 100644 index 0000000..7625e46 --- /dev/null +++ b/src/kernel/memory/string.c @@ -0,0 +1,43 @@ +#include +#include +#include + +void *memcpy(void *dst, const void *src, size_t n) +{ + char *dp = dst; + const char *sp = src; + while(n--) *dp++ = *sp++; + return dst; +} + +void *memset(void *s, int c, size_t n) +{ + unsigned char *p = s; + while(n--) *p++ = (unsigned char)c; + return s; +} + +void *memmove(void *dest, const void *src, size_t n) +{ + // Since our memcpy implementation copies one char* at a time, this is safe + memcpy(dest, src, n); + return dest; +} + +int memcmp(const void *s1, const void *s2, size_t n) +{ + const unsigned char *p1 = s1, *p2 = s2; + for(; n--; p1++, p2++) + { + if(*p1 != *p2) + return *p1 - *p2; + } + return 0; +} + +size_t strlen(const char *s) +{ + size_t len = 0; + while(*s++) len++; + return len; +}