diff --git a/libluna/include/luna/CString.h b/libluna/include/luna/CString.h index 3765c45a..7b607e71 100644 --- a/libluna/include/luna/CString.h +++ b/libluna/include/luna/CString.h @@ -13,6 +13,11 @@ extern "C" int strcmp(const char* a, const char* b); + usize strspn(const char* str, const char* accept); + usize strcspn(const char* str, const char* reject); + + char* strtok(char* str, const char* delim); + usize wcslen(const wchar_t* str); char* strdup(const char* str); diff --git a/libluna/src/CString.cpp b/libluna/src/CString.cpp index e9a9fefc..d3fef924 100644 --- a/libluna/src/CString.cpp +++ b/libluna/src/CString.cpp @@ -136,4 +136,71 @@ extern "C" dest[copy_len] = 0; return src_len; } + + usize strcspn(const char* str, const char* reject) + { + const char* s = str; + while (*s) + { + const char* rp = reject; + while (*rp) + { + if (*s == *rp) return (usize)(s - str); + rp++; + } + s++; + } + return (usize)(s - str); + } + + usize strspn(const char* str, const char* accept) + { + const char* s = str; + while (*s) + { + const char* ap = accept; + bool match = false; + while (*ap) + { + if (*s == *ap) + { + match = true; + break; + } + ap++; + } + if (!match) return (usize)(s - str); + s++; + } + return (usize)(s - str); + } + + char* strtok(char* str, const char* delim) + { + static char* s = nullptr; + if (str) s = str; + if (!s) return nullptr; + + if (*s) + { + usize skip = strspn(s, delim); + s += skip; + + if (*s == 0) return nullptr; + + usize use = strcspn(s, delim); + char* result = s; + + if (s[use] != 0) + { + s[use] = 0; + s += (use + 1); + } + else { s = nullptr; } + + return result; + } + + return nullptr; + } }