|
13 | 13 | #include <cstddef> |
14 | 14 | #include <type_traits> |
15 | 15 | #include <string> |
16 | | -#include <string.h> |
17 | 16 |
|
18 | 17 | #include <catch2/internal/catch_compiler_capabilities.hpp> |
19 | 18 | #include <catch2/internal/catch_config_wchar.hpp> |
@@ -41,6 +40,13 @@ namespace Catch { |
41 | 40 |
|
42 | 41 | namespace Detail { |
43 | 42 |
|
| 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 | + } |
44 | 50 |
|
45 | 51 | constexpr StringRef unprintableString = "{?}"_sr; |
46 | 52 |
|
@@ -208,28 +214,24 @@ namespace Catch { |
208 | 214 | template<size_t SZ> |
209 | 215 | struct StringMaker<char[SZ]> { |
210 | 216 | 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. |
213 | 217 | return Detail::convertIntoString( |
214 | | - StringRef( str, strnlen( str, SZ ) ) ); |
| 218 | + StringRef( str, Detail::catch_strnlen( str, SZ ) ) ); |
215 | 219 | } |
216 | 220 | }; |
217 | 221 | template<size_t SZ> |
218 | 222 | struct StringMaker<signed char[SZ]> { |
219 | 223 | static std::string convert(signed char const* str) { |
220 | | - // See the plain `char const*` overload |
221 | 224 | auto reinterpreted = reinterpret_cast<char const*>(str); |
222 | 225 | return Detail::convertIntoString( |
223 | | - StringRef(reinterpreted, strnlen(reinterpreted, SZ))); |
| 226 | + StringRef(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ))); |
224 | 227 | } |
225 | 228 | }; |
226 | 229 | template<size_t SZ> |
227 | 230 | struct StringMaker<unsigned char[SZ]> { |
228 | 231 | static std::string convert(unsigned char const* str) { |
229 | | - // See the plain `char const*` overload |
230 | 232 | auto reinterpreted = reinterpret_cast<char const*>(str); |
231 | 233 | return Detail::convertIntoString( |
232 | | - StringRef(reinterpreted, strnlen(reinterpreted, SZ))); |
| 234 | + StringRef(reinterpreted, Detail::catch_strnlen(reinterpreted, SZ))); |
233 | 235 | } |
234 | 236 | }; |
235 | 237 |
|
|
0 commit comments