aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorNeil MacIntosh <neilmac@microsoft.com>2016-09-29 12:51:37 -0700
committerGitHub <noreply@github.com>2016-09-29 12:51:37 -0700
commit3e5af6dc4028416603e5d7a4adc93995eb34345f (patch)
tree9291c59e4ef904e4ac0cce49e734a22ab42bb98c
parente898a890e097598009c2c079a0254f9823d2d93b (diff)
parent9e055be6593e11849d4fa7966847054372d025b1 (diff)
downloadplatform_external_Microsoft-GSL-3e5af6dc4028416603e5d7a4adc93995eb34345f.tar.gz
platform_external_Microsoft-GSL-3e5af6dc4028416603e5d7a4adc93995eb34345f.tar.bz2
platform_external_Microsoft-GSL-3e5af6dc4028416603e5d7a4adc93995eb34345f.zip
Fix compilation issues with Cygwin
-rw-r--r--gsl/string_span26
1 files changed, 22 insertions, 4 deletions
diff --git a/gsl/string_span b/gsl/string_span
index cd49998..768bfd5 100644
--- a/gsl/string_span
+++ b/gsl/string_span
@@ -118,6 +118,24 @@ namespace details
return len;
#endif
}
+
+ inline std::size_t wstring_length(const wchar_t *str, std::size_t n)
+ {
+#ifdef GSL_PLATFORM_HAS_STRNLEN
+ return wcsnlen(str, n);
+#else
+ if (str == nullptr || n == 0)
+ return 0;
+
+ std::size_t len = 0;
+ span<const wchar_t> str_span{str, n};
+
+ while (len < n && str_span[len])
+ len++;
+
+ return len;
+#endif
+ }
}
//
@@ -166,14 +184,14 @@ inline span<const char, dynamic_extent> ensure_z(const char* const& sz, std::ptr
inline span<wchar_t, dynamic_extent> ensure_z(wchar_t* const& sz, std::ptrdiff_t max)
{
- auto len = wcsnlen(sz, narrow_cast<size_t>(max));
+ auto len = details::wstring_length(sz, narrow_cast<size_t>(max));
Ensures(sz[len] == 0);
return {sz, static_cast<std::ptrdiff_t>(len)};
}
inline span<const wchar_t, dynamic_extent> ensure_z(const wchar_t* const& sz, std::ptrdiff_t max)
{
- auto len = wcsnlen(sz, narrow_cast<size_t>(max));
+ auto len = details::wstring_length(sz, narrow_cast<size_t>(max));
Ensures(sz[len] == 0);
return {sz, static_cast<std::ptrdiff_t>(len)};
}
@@ -230,7 +248,7 @@ namespace details
{
std::ptrdiff_t operator()(wchar_t* const ptr, std::ptrdiff_t length) noexcept
{
- return narrow_cast<std::ptrdiff_t>(wcsnlen(ptr, narrow_cast<size_t>(length)));
+ return narrow_cast<std::ptrdiff_t>(details::wstring_length(ptr, narrow_cast<size_t>(length)));
}
};
@@ -248,7 +266,7 @@ namespace details
{
std::ptrdiff_t operator()(const wchar_t* const ptr, std::ptrdiff_t length) noexcept
{
- return narrow_cast<std::ptrdiff_t>(wcsnlen(ptr, narrow_cast<size_t>(length)));
+ return narrow_cast<std::ptrdiff_t>(details::wstring_length(ptr, narrow_cast<size_t>(length)));
}
};
}