mirror of
https://github.com/catchorg/Catch2.git
synced 2025-02-16 19:43:28 +01:00
fix compilation on cygwin
Use std::char_traits<char>::find instead of strnlen for better portability.
This commit is contained in:
parent
6a9bf2e0af
commit
97313f9033
@ -13,7 +13,6 @@
|
|||||||
#include <cstddef>
|
#include <cstddef>
|
||||||
#include <type_traits>
|
#include <type_traits>
|
||||||
#include <string>
|
#include <string>
|
||||||
#include <string.h>
|
|
||||||
|
|
||||||
#include <catch2/internal/catch_compiler_capabilities.hpp>
|
#include <catch2/internal/catch_compiler_capabilities.hpp>
|
||||||
#include <catch2/internal/catch_config_wchar.hpp>
|
#include <catch2/internal/catch_config_wchar.hpp>
|
||||||
@ -41,6 +40,13 @@ namespace Catch {
|
|||||||
|
|
||||||
namespace Detail {
|
namespace Detail {
|
||||||
|
|
||||||
|
inline std::size_t catch_strnlen(const char *str, std::size_t n) {
|
||||||
|
auto ret = std::char_traits<char>::find(str, n, '\0');
|
||||||
|
if (ret != nullptr) {
|
||||||
|
return ret - str;
|
||||||
|
}
|
||||||
|
return n;
|
||||||
|
}
|
||||||
|
|
||||||
constexpr StringRef unprintableString = "{?}"_sr;
|
constexpr StringRef unprintableString = "{?}"_sr;
|
||||||
|
|
||||||
@ -208,28 +214,24 @@ namespace Catch {
|
|||||||
template<size_t SZ>
|
template<size_t SZ>
|
||||||
struct StringMaker<char[SZ]> {
|
struct StringMaker<char[SZ]> {
|
||||||
static std::string convert(char const* str) {
|
static std::string convert(char const* str) {
|
||||||
// Note that `strnlen` is not actually part of standard C++,
|
|
||||||
// but both POSIX and Windows cstdlib provide it.
|
|
||||||
return Detail::convertIntoString(
|
return Detail::convertIntoString(
|
||||||
StringRef( str, strnlen( str, SZ ) ) );
|
StringRef( str, Detail::catch_strnlen( str, SZ ) ) );
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<size_t SZ>
|
template<size_t SZ>
|
||||||
struct StringMaker<signed char[SZ]> {
|
struct StringMaker<signed char[SZ]> {
|
||||||
static std::string convert(signed char const* str) {
|
static std::string convert(signed char const* str) {
|
||||||
// See the plain `char const*` overload
|
|
||||||
auto reinterpreted = reinterpret_cast<char const*>(str);
|
auto reinterpreted = reinterpret_cast<char const*>(str);
|
||||||
return Detail::convertIntoString(
|
return Detail::convertIntoString(
|
||||||
StringRef(reinterpreted, strnlen(reinterpreted, SZ)));
|
StringRef(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
template<size_t SZ>
|
template<size_t SZ>
|
||||||
struct StringMaker<unsigned char[SZ]> {
|
struct StringMaker<unsigned char[SZ]> {
|
||||||
static std::string convert(unsigned char const* str) {
|
static std::string convert(unsigned char const* str) {
|
||||||
// See the plain `char const*` overload
|
|
||||||
auto reinterpreted = reinterpret_cast<char const*>(str);
|
auto reinterpreted = reinterpret_cast<char const*>(str);
|
||||||
return Detail::convertIntoString(
|
return Detail::convertIntoString(
|
||||||
StringRef(reinterpreted, strnlen(reinterpreted, SZ)));
|
StringRef(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ)));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user