diff --git a/userspace/libraries/LibC/wchar.cpp b/userspace/libraries/LibC/wchar.cpp index 2b5b2c31..a03d97ff 100644 --- a/userspace/libraries/LibC/wchar.cpp +++ b/userspace/libraries/LibC/wchar.cpp @@ -24,3 +24,161 @@ int wcsncmp(const wchar_t* ws1, const wchar_t* ws2, size_t n) break; return *ws1 - *ws2; } + +size_t wcslen(const wchar_t* ws) +{ + size_t len = 0; + for (; ws[len]; len++) + continue; + return len; +} + +size_t wcsnlen(const wchar_t* ws, size_t maxlen) +{ + size_t len = 0; + for (; ws[len] && len < maxlen; len++) + continue; + return len; +} + +wchar_t* wcpcpy(wchar_t* __restrict ws1, const wchar_t* __restrict ws2) +{ + while (*ws2) + *ws1++ = *ws2++; + *ws1 = L'\0'; + return ws1; +} + +wchar_t* wcscpy(wchar_t* __restrict ws1, const wchar_t* __restrict ws2) +{ + wcpcpy(ws1, ws2); + return ws1; +} + +wchar_t* wcpncpy(wchar_t* __restrict ws1, const wchar_t* __restrict ws2, size_t n) +{ + size_t i = 0; + for (; ws2[i] && i < n; i++) + ws1[i] = ws2[i]; + for (; i < n; i++) + ws1[i] = L'\0'; + return &ws1[i]; +} + +wchar_t* wcsncpy(wchar_t* __restrict ws1, const wchar_t* __restrict ws2, size_t n) +{ + wcpncpy(ws1, ws2, n); + return ws1; +} + +wchar_t* wcscat(wchar_t* __restrict ws1, const wchar_t* __restrict ws2) +{ + wcscpy(ws1 + wcslen(ws1), ws2); + return ws1; +} + +wchar_t* wcsncat(wchar_t* __restrict ws1, const wchar_t* __restrict ws2, size_t n) +{ + size_t i = 0; + for (; ws2[i] && i < n; i++) + ws1[i] = ws2[i]; + ws1[i] = L'\0'; + return ws1; +} + +static size_t wcsspn_impl(const wchar_t* ws1, const wchar_t* ws2, bool accept) +{ + size_t len = 0; + for (; ws1[len]; len++) + { + bool found = false; + for (size_t i = 0; ws2[i] && !found; i++) + if (ws1[len] == ws2[i]) + found = true; + if (found != accept) + break; + } + return len; +} + +size_t wcsspn(const wchar_t* ws1, const wchar_t* ws2) +{ + return wcsspn_impl(ws1, ws2, true); +} + +size_t wcscspn(const wchar_t* ws1, const wchar_t* ws2) +{ + return wcsspn_impl(ws1, ws2, false); +} + +wchar_t* wcschr(const wchar_t* ws, wchar_t wc) +{ + for (size_t i = 0; ws[i]; i++) + if (ws[i] == wc) + return const_cast(&ws[i]); + return nullptr; +} + +wchar_t* wcsrchr(const wchar_t* ws, wchar_t wc) +{ + wchar_t* result = nullptr; + for (size_t i = 0; ws[i]; i++) + if (ws[i] == wc) + result = const_cast(&ws[i]); + return result; +} + +wchar_t* wcsdup(const wchar_t* string) +{ + const size_t len = wcslen(string); + wchar_t* result = static_cast(malloc((len + 1) * sizeof(wchar_t))); + if (result == nullptr) + return nullptr; + wmemcpy(result, string, len + 1); + return result; +} + +wchar_t* wmemchr(const wchar_t* ws, wchar_t wc, size_t n) +{ + for (size_t i = 0; i < n; i++) + if (ws[i] == wc) + return const_cast(&ws[i]); + return nullptr; +} + +int wmemcmp(const wchar_t* ws1, const wchar_t* ws2, size_t n) +{ + for (size_t i = 0; i < n; i++) + if (ws1[i] != ws2[i]) + return ws1[i] - ws2[i]; + return 0; +} + +wchar_t* wmemcpy(wchar_t* __restrict ws1, const wchar_t* __restrict ws2, size_t n) +{ + for (size_t i = 0; i < n; i++) + ws1[i] = ws2[i]; + return ws1; +} + +wchar_t* wmemmove(wchar_t* ws1, const wchar_t* ws2, size_t n) +{ + if (ws1 < ws2) + { + for (size_t i = 0; i < n; i++) + ws1[i] = ws2[i]; + } + else + { + for (size_t i = 1; i <= n; i++) + ws1[n - i] = ws2[n - i]; + } + return ws1; +} + +wchar_t* wmemset(wchar_t* ws, wchar_t wc, size_t n) +{ + for (size_t i = 0; i < n; i++) + ws[i] = wc; + return ws; +}