Skip to content

Commit f5d8a46

Browse files
committed
fix compilation on cygwin
Use std::char_traits<char>::find instead of strnlen for better portability.
1 parent 6a9bf2e commit f5d8a46

File tree

1 file changed

+10
-8
lines changed

1 file changed

+10
-8
lines changed

src/catch2/catch_tostring.hpp

Lines changed: 10 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,6 @@
1313
#include <cstddef>
1414
#include <type_traits>
1515
#include <string>
16-
#include <string.h>
1716

1817
#include <catch2/internal/catch_compiler_capabilities.hpp>
1918
#include <catch2/internal/catch_config_wchar.hpp>
@@ -41,6 +40,13 @@ namespace Catch {
4140

4241
namespace Detail {
4342

43+
inline std::size_t catch_strnlen(const char *str, std::size_t n) {
44+
auto ret = std::char_traits<char>::find(str, n, '\0');
45+
if (ret != nullptr) {
46+
return ret - str;
47+
}
48+
return n;
49+
}
4450

4551
constexpr StringRef unprintableString = "{?}"_sr;
4652

@@ -208,28 +214,24 @@ namespace Catch {
208214
template<size_t SZ>
209215
struct StringMaker<char[SZ]> {
210216
static std::string convert(char const* str) {
211-
// Note that `strnlen` is not actually part of standard C++,
212-
// but both POSIX and Windows cstdlib provide it.
213217
return Detail::convertIntoString(
214-
StringRef( str, strnlen( str, SZ ) ) );
218+
StringRef( str, Detail::catch_strnlen( str, SZ ) ) );
215219
}
216220
};
217221
template<size_t SZ>
218222
struct StringMaker<signed char[SZ]> {
219223
static std::string convert(signed char const* str) {
220-
// See the plain `char const*` overload
221224
auto reinterpreted = reinterpret_cast<char const*>(str);
222225
return Detail::convertIntoString(
223-
StringRef(reinterpreted, strnlen(reinterpreted, SZ)));
226+
StringRef(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ)));
224227
}
225228
};
226229
template<size_t SZ>
227230
struct StringMaker<unsigned char[SZ]> {
228231
static std::string convert(unsigned char const* str) {
229-
// See the plain `char const*` overload
230232
auto reinterpreted = reinterpret_cast<char const*>(str);
231233
return Detail::convertIntoString(
232-
StringRef(reinterpreted, strnlen(reinterpreted, SZ)));
234+
StringRef(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ)));
233235
}
234236
};
235237

0 commit comments

Comments
 (0)