From 521217f2b59e408e564aab87bb224423d7ea38f8 Mon Sep 17 00:00:00 2001 From: Imbus <> Date: Thu, 26 Jun 2025 12:01:53 +0200 Subject: [PATCH] String.[ch]: memset, memcpy, memmove, memcmph and strlen, strnlen --- lib/string.c | 60 ++++++++++++++++++++++++++++++++++++++++++++++++++++ lib/string.h | 33 +++++++++++++++++++++++++++++ 2 files changed, 93 insertions(+) diff --git a/lib/string.c b/lib/string.c index 8057811..69fb5c7 100644 --- a/lib/string.c +++ b/lib/string.c @@ -1,3 +1,5 @@ +#include + char *itoa(int value, char *str, int base) { char *p = str; char *p1, *p2; @@ -37,3 +39,61 @@ char *itoa(int value, char *str, int base) { return str; } + +void *memset(void *dst, int c, size_t length) { + u8 *ptr = (u8 *)dst; + const u8 value = (u8)c; + + while (length--) *(ptr++) = value; + + return dst; +} + +void *memcpy(void *dst, const void *src, size_t len) { + u8 *d = (u8 *)dst; + const u8 *s = (const u8 *)src; + for (size_t i = 0; i < len; i++) { + d[i] = s[i]; + } + return dst; +} + +void *memmove(void *dst, const void *src, size_t len) { + u8 *d = (u8 *)dst; + const u8 *s = (const u8 *)src; + if (d < s) { + for (size_t i = 0; i < len; i++) { + d[i] = s[i]; + } + } else if (d > s) { + for (size_t i = len; i > 0; i--) { + d[i - 1] = s[i - 1]; + } + } + return dst; +} + +int memcmp(const void *s1, const void *s2, size_t len) { + const u8 *a = (const u8 *)s1; + const u8 *b = (const u8 *)s2; + for (size_t i = 0; i < len; i++) { + if (a[i] != b[i]) { + return (int)a[i] - (int)b[i]; + } + } + return 0; +} + +size_t strlen(const char *s) { + const char *p = s; + while (*p) ++p; + return (size_t)(p - s); +} + +size_t strnlen(const char *s, size_t maxlen) { + size_t len = 0; + while (len < maxlen && s[len] != '\0') { + len++; + } + return len; +} diff --git a/lib/string.h b/lib/string.h index ceeb2a8..00805c7 100644 --- a/lib/string.h +++ b/lib/string.h @@ -1,7 +1,40 @@ #ifndef KERNEL_STRING_H #define KERNEL_STRING_H +#include + /** Integer to ascii */ char *itoa(int value, char *str, int base); +/** Fill memory with constant byte */ +void *memset(void *dst, int c, size_t len); + +/** Copy `len` bytes from `src` to `dst`. Undefined if regions overlap. */ +void *memcpy(void *dst, const void *src, size_t len); + +/** Copy `len` bytes from `src` to `dst`, safe for overlapping regions. */ +void *memmove(void *dst, const void *src, size_t len); + +/** Compare `len` bytes of `s1` and `s2`. + * Returns 0 if equal, <0 if s1 < s2, >0 if s1 > s2. */ +int memcmp(const void *s1, const void *s2, size_t len); + +/** Returns the length of a null-terminated string */ +size_t strlen(const char *s); + +/** Return length of string `s`, up to a max of `maxlen` bytes */ +size_t strnlen(const char *s, size_t maxlen); + +// TODO: These: +/* +int strcmp(const char *s1, const char *s2); +int strncmp(const char *s1, const char *s2, size_t n); + +char *strcpy(char *dst, const char *src); +char *strncpy(char *dst, const char *src, size_t n); + +char *strchr(const char *s, int c); +char *strrchr(const char *s, int c); +*/ + #endif