summaryrefslogtreecommitdiffhomepage
path: root/src/neboot-string.c
diff options
context:
space:
mode:
authorAmlal El Mahrouss <amlal@nekernel.org>2025-07-31 08:57:14 +0100
committerAmlal El Mahrouss <amlal@nekernel.org>2025-07-31 08:57:14 +0100
commit1891d7343a9ac25ab157c4495581a0fcbd7fbcbf (patch)
treec6da72fdf5db30c67c28e968883f869ee57600d0 /src/neboot-string.c
parent18d33e155d2f56e59eb49dadbb30ab2f7ac3e852 (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.c153
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;
+}