diff options
| author | Amlal El Mahrouss <amlal@nekernel.org> | 2025-07-31 08:57:14 +0100 |
|---|---|---|
| committer | Amlal El Mahrouss <amlal@nekernel.org> | 2025-07-31 08:57:14 +0100 |
| commit | 1891d7343a9ac25ab157c4495581a0fcbd7fbcbf (patch) | |
| tree | c6da72fdf5db30c67c28e968883f869ee57600d0 /src/neboot-string.c | |
| parent | 18d33e155d2f56e59eb49dadbb30ab2f7ac3e852 (diff) | |
feat! refactor NeBoot for NeKernel.org v1.0.0
Signed-off-by: Amlal El Mahrouss <amlal@nekernel.org>
Diffstat (limited to 'src/neboot-string.c')
| -rw-r--r-- | src/neboot-string.c | 153 |
1 files changed, 153 insertions, 0 deletions
diff --git a/src/neboot-string.c b/src/neboot-string.c new file mode 100644 index 0000000..0c249a4 --- /dev/null +++ b/src/neboot-string.c @@ -0,0 +1,153 @@ +/* ------------------------------------------- + + Copyright (C) 2024, Amlal EL Mahrouss, all rights reserved. + +------------------------------------------- */ + +/** + * @file neboot-string.c + * @author Amlal EL Mahrouss (amlal@nekernel.org) + * @brief string library. + * @version 0.1 + * @date 2024-01-16 + * + * @copyright Copyright (c) 2024 Amlal EL Mahrouss + * + */ + +#include <lib/string.h> + +/// BUGS: 0 + +size_t strncmp(const char* src, const char* cmp, size_t size) { + if (src == nil) return 0; + + int32_t counter = 0; + + for (size_t index = 0; index < size; ++index) { + if (src[index] != cmp[index]) ++counter; + } + + return counter; +} + +void* memset(void* ptr, const char value, size_t len) { + if (ptr == nil) return nil; + + char* start = ptr; + + while (len) { + *start = value; + ++start; + + --len; + } + + return (void*) start; +} + +void* memmove(void* dest, const void* src, size_t len) { + memncpy(dest, src, len); + return dest; +} + +size_t memcpy(void* dst, const void* src) { + if (src == nil || dst == nil) return 0; + + const char* src_chr = src; + char* dst_chr = dst; + size_t index = 0; + size_t len = strlen(src); + + while (index < len) { + dst_chr[index] = src_chr[index]; + ++index; + } + + return 0; +} + +/* @brief unoptimized memcpy, TODO: use isa specific memcpy. */ +size_t memncpy(void* dst, const void* src, size_t len) { +#if __OL == 3 && defined(__riscv) + riscv_memncpy(dst, src, len); +#else + + if (src == nil || dst == nil) return 0; + + const char* src_chr = src; + char* dst_chr = dst; + size_t index = 0; + + while (index < len) { + dst_chr[index] = src_chr[index]; + ++index; + } + + return 0; +#endif +} + +size_t strlen(const char* str) { + if (*str == 0) return 0; + + size_t len = 0; + while (str[len] != '\0') ++len; + + return len; +} + +size_t strnlen(const char* str, size_t len) { + size_t cnt = 0; + + while (len > cnt) { + ++cnt; + + if (str[cnt] == '\0') return (size_t) -1; + } + + return len; +} + +void strreverse(char* s) { + if (s == nil) return; + if (*s == '\0') return; + + char *first, *last, temp; + + first = s; + last = s + strlen(s) - 1; + + while (first != last) { + temp = *first; + *(first++) = *last; + *(last--) = temp; + } +} + +char* strchr(char* str, const char chr) { + while (*str != chr) { + ++str; + + if (*str == 0) return nil; + } + + return str; +} + +/// @brief Compare two strings. +/// @param src source string +/// @param cmp string to compare. +/// @return +size_t strcmp(caddr_t src, caddr_t cmp) { + if (src == null || *src == 0) return 1; + if (cmp == null || *cmp == 0) return 1; + + int32_t counter = 0; + + for (size_t index = 0; src[index] != 0; ++index) { + if (cmp[index] != src[index]) ++counter; + } + + return counter; +} |
