diff options
| author | cpplover0 <osdev555@yandex.com> | 2026-03-21 08:33:28 +0300 |
|---|---|---|
| committer | cpplover0 <osdev555@yandex.com> | 2026-03-21 08:33:28 +0300 |
| commit | a66cd5681ab96d66259275f04bbdd2b44fc1d7c4 (patch) | |
| tree | 136a8e7dd9779cd47922f118cf9c9a7833353e8a /kernel/src/klibc/string.cpp | |
| parent | cee3f90d80b84f4171a3603d894ddf1ba1977255 (diff) | |
ext2 support, ext4 read only support
Diffstat (limited to 'kernel/src/klibc/string.cpp')
| -rw-r--r-- | kernel/src/klibc/string.cpp | 106 |
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 |
