// Copyright 2020 The Fuchsia Authors // // Use of this source code is governed by a MIT-style // license that can be found in the LICENSE file or at // https://opensource.org/licenses/MIT #ifndef ZIRCON_KERNEL_LIB_KTL_INCLUDE_CWCHAR #define ZIRCON_KERNEL_LIB_KTL_INCLUDE_CWCHAR // The kernel doesn't want this file but some libc++ headers we need // wind up including it and they need these declarations. #include #include <__config> _LIBCPP_BEGIN_NAMESPACE_STD using ::wmemcpy; using ::wmemmove; using ::wmemset; // These are called by libc++ header code. The first two should never actually // be called by anything that really gets instantiated in kernel code since // wchar_t is never used. However, __constexpr_wmemchr is used by places like // std::find not just for wchar_t per se but for any trivial type of the same // size, e.g. uint32_t. So its code must be correct. The other two are filled // out just in case of an unexpected use. constexpr size_t __constexpr_wcslen(const wchar_t* str) { size_t len = 0; while (*str++ != L'\0') { ++len; } return len; } constexpr int __constexpr_wmemcmp(const wchar_t* lhs, const wchar_t* rhs, size_t count) { while (count-- > 0) { if (*lhs != *rhs) { return static_cast(*lhs - *rhs); } ++lhs; ++rhs; } return 0; } template constexpr Tp* __constexpr_wmemchr(Tp* str, Up wc, size_t count) { while (count-- > 0) { if (*str == wc) { return str; } ++str; } return nullptr; } _LIBCPP_END_NAMESPACE_STD #endif // ZIRCON_KERNEL_LIB_KTL_INCLUDE_CWCHAR