summaryrefslogtreecommitdiff
path: root/kernel/src/klibc/string.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'kernel/src/klibc/string.cpp')
-rw-r--r--kernel/src/klibc/string.cpp106
1 files changed, 106 insertions, 0 deletions
diff --git a/kernel/src/klibc/string.cpp b/kernel/src/klibc/string.cpp
index e4ead45..4663a1d 100644
--- a/kernel/src/klibc/string.cpp
+++ b/kernel/src/klibc/string.cpp
@@ -76,4 +76,110 @@ int klibc::strlen(const char *str) {
len++;
}
return len;
+}
+
+char* klibc::strchr(const char *s, int c) {
+ while (*s) {
+ if (*s == (char)c) return (char *)s;
+ s++;
+ }
+ return nullptr;
+}
+
+char* klibc::strtok(char **next,char *str, const char *delim) {
+ if (str) *next = str;
+ if (!*next) return nullptr;
+
+ char *start = *next;
+ while (*start && strchr(delim, *start)) {
+ start++;
+ }
+ if (!*start) {
+ *next = nullptr;
+ return nullptr;
+ }
+
+ char *end = start;
+ while (*end && !strchr(delim, *end)) {
+ end++;
+ }
+
+ if (*end) {
+ *end = '\0';
+ *next = end + 1;
+ } else {
+ *next = nullptr;
+ }
+
+ return start;
+}
+
+char* klibc::strrchr(const char* str, int ch) {
+ char* last_occurrence = 0;
+
+ while (*str) {
+ if (*str == ch) {
+ last_occurrence = (char*)str;
+ }
+ str++;
+ }
+
+ return last_occurrence;
+}
+
+char* klibc::strcat(char* dest, const char* src) {
+
+ char* ptr = dest;
+ while(*ptr != '\0') {
+ ptr++;
+ }
+
+ while(*src != '\0') {
+ *ptr = *src;
+ ptr++;
+ src++;
+ }
+
+ *ptr = '\0';
+
+ return dest;
+}
+
+int klibc::strncmp(const char *s1, const char *s2, std::size_t n) {
+ std::size_t i = 0;
+ while (i < n && s1[i] && (s1[i] == s2[i])) {
+ i++;
+ }
+ if (i == n) return 0;
+ return (unsigned char)s1[i] - (unsigned char)s2[i];
+}
+
+// tbh i dont remember from what i took this
+int klibc::strcmp(const char *s1, const char *s2) {
+ const unsigned long *w1 = (const unsigned long *)s1;
+ const unsigned long *w2 = (const unsigned long *)s2;
+ const unsigned long himagic = 0x8080808080808080UL;
+ const unsigned long lomagic = 0x0101010101010101UL;
+
+ while (1) {
+ unsigned long word1 = *w1++;
+ unsigned long word2 = *w2++;
+
+ unsigned long diff = word1 ^ word2;
+ unsigned long zeros = (word1 - lomagic) & ~word1 & himagic;
+
+ if (diff != 0 || zeros != 0) {
+ const char *c1 = (const char *)(w1 - 1);
+ const char *c2 = (const char *)(w2 - 1);
+
+ do {
+ unsigned char ch1 = *c1++;
+ unsigned char ch2 = *c2++;
+ if (ch1 != ch2) return ch1 - ch2;
+ if (ch1 == 0) break;
+ } while (1);
+
+ return 0;
+ }
+ }
} \ No newline at end of file