aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-07-24 13:26:45 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-07-24 13:26:45 -0700
commit11f540d7e9a3f43614196f45ab7e82ab3fbed03e (patch)
tree93ebfb8a4e4c470c91f105a9bc2aa609101a5e6c
parente9ba08be3aeaaea3cfc5a8455fac41384e2d7f93 (diff)
downloadvcpkg-11f540d7e9a3f43614196f45ab7e82ab3fbed03e.tar.gz
vcpkg-11f540d7e9a3f43614196f45ab7e82ab3fbed03e.zip
[vcpkg] Use _vsnprintf_s_l on Windows for locale-insensitivity. Avoid manual buffer management.
-rw-r--r--toolsrc/src/vcpkg_Strings.cpp43
1 files changed, 31 insertions, 12 deletions
diff --git a/toolsrc/src/vcpkg_Strings.cpp b/toolsrc/src/vcpkg_Strings.cpp
index 77ff1a106..36d017f54 100644
--- a/toolsrc/src/vcpkg_Strings.cpp
+++ b/toolsrc/src/vcpkg_Strings.cpp
@@ -11,27 +11,49 @@ namespace vcpkg::Strings::details
// Avoids C4244 warnings because of char<->int conversion that occur when using std::tolower()
static char tolower_char(const char c) { return static_cast<char>(std::tolower(c)); }
+#if defined(_WIN32)
static _locale_t& c_locale()
{
static _locale_t c_locale_impl = _create_locale(LC_ALL, "C");
return c_locale_impl;
}
+ static int plat_vsnprintf(_Out_writes_z_(bufsz) char* const buffer,
+ _In_ size_t const bufsz,
+ _In_z_ _Printf_format_string_params_(1) char const* const fmtstr,
+ va_list args)
+ {
+ return _vsnprintf_s_l(buffer, bufsz, bufsz, fmtstr, c_locale(), args);
+ }
+ static int plat_vswprintf(_Out_writes_z_(bufsz) wchar_t* const buffer,
+ _In_ size_t const bufsz,
+ _In_z_ _Printf_format_string_params_(1) wchar_t const* const fmtstr,
+ va_list args)
+ {
+ return _vsnwprintf_s_l(buffer, bufsz, bufsz, fmtstr, c_locale(), args);
+ }
+#else
+ static int plat_vsnprintf(char* buffer, size_t bufsz, const char* fmtstr, va_list args)
+ {
+ return vsnprintf(buffer, bufsz, fmtstr, args);
+ }
+ static int plat_vswprintf(char* buffer, size_t bufsz, const char* fmtstr, va_list args)
+ {
+ return vswprintf(buffer, bufsz, fmtstr, args);
+ }
+#endif
std::string format_internal(const char* fmtstr, ...)
{
va_list args;
va_start(args, fmtstr);
- int sz = vsnprintf(nullptr, 0, fmtstr, args) + 1;
+ int sz = plat_vsnprintf(nullptr, 0, fmtstr, args);
- char* buffer = new char[sz];
+ std::string output(sz, '\0');
- vsnprintf(buffer, sz, fmtstr, args);
+ plat_vsnprintf(&output.at(0), output.size() + 1, fmtstr, args);
va_end(args);
- std::string output(buffer);
- delete[] buffer;
-
return output;
}
@@ -40,16 +62,13 @@ namespace vcpkg::Strings::details
va_list args;
va_start(args, fmtstr);
- int sz = vswprintf(nullptr, 0, fmtstr, args) + 1;
+ int sz = plat_vswprintf(nullptr, 0, fmtstr, args);
- wchar_t* buffer = new wchar_t[sz];
+ std::wstring output(sz, L'\0');
- vswprintf(buffer, sz, fmtstr, args);
+ plat_vswprintf(&output.at(0), output.size() + 1, fmtstr, args);
va_end(args);
- std::wstring output(buffer);
- delete[] buffer;
-
return output;
}
}