aboutsummaryrefslogtreecommitdiff
path: root/toolsrc/src/vcpkg_Strings.cpp
diff options
context:
space:
mode:
authorRobert Schumacher <roschuma@microsoft.com>2017-07-24 13:59:53 -0700
committerRobert Schumacher <roschuma@microsoft.com>2017-07-24 13:59:53 -0700
commit3c841c6128ebfe8e99a372f2907bd985b533a799 (patch)
tree95028280ec20dca324ec171a1bbae9f1972bccf9 /toolsrc/src/vcpkg_Strings.cpp
parentc0af06a69141b251f84f75588c18013889a99f76 (diff)
downloadvcpkg-3c841c6128ebfe8e99a372f2907bd985b533a799.tar.gz
vcpkg-3c841c6128ebfe8e99a372f2907bd985b533a799.zip
[vcpkg] Revert revert. Bug fixed.
Diffstat (limited to 'toolsrc/src/vcpkg_Strings.cpp')
-rw-r--r--toolsrc/src/vcpkg_Strings.cpp49
1 files changed, 37 insertions, 12 deletions
diff --git a/toolsrc/src/vcpkg_Strings.cpp b/toolsrc/src/vcpkg_Strings.cpp
index aafed5fd3..0c1c1f9f9 100644
--- a/toolsrc/src/vcpkg_Strings.cpp
+++ b/toolsrc/src/vcpkg_Strings.cpp
@@ -1,5 +1,6 @@
#include "pch.h"
+#include "vcpkg_Checks.h"
#include "vcpkg_Strings.h"
#include "vcpkg_Util.h"
@@ -11,34 +12,58 @@ 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;
}
+#endif
std::string format_internal(const char* fmtstr, ...)
{
- va_list lst;
- va_start(lst, fmtstr);
+ va_list args;
+ va_start(args, fmtstr);
+
+#if defined(_WIN32)
+ const int sz = _vscprintf_l(fmtstr, c_locale(), args);
+#else
+ const int sz = vsnprintf(nullptr, 0, fmtstr, args);
+#endif
+ Checks::check_exit(VCPKG_LINE_INFO, sz > 0);
- const int sz = _vscprintf_l(fmtstr, c_locale(), lst);
std::string output(sz, '\0');
- _vsnprintf_s_l(&output[0], output.size() + 1, output.size() + 1, fmtstr, c_locale(), lst);
- va_end(lst);
+
+#if defined(_WIN32)
+ _vsnprintf_s_l(&output.at(0), output.size() + 1, output.size(), fmtstr, c_locale(), args);
+#else
+ vsnprintf(&output.at(0), output.size() + 1, fmtstr, args);
+#endif
+ va_end(args);
return output;
}
std::wstring wformat_internal(const wchar_t* fmtstr, ...)
{
- va_list lst;
- va_start(lst, fmtstr);
-
- const int sz = _vscwprintf_l(fmtstr, c_locale(), lst);
- std::wstring output(sz, '\0');
- _vsnwprintf_s_l(&output[0], output.size() + 1, output.size() + 1, fmtstr, c_locale(), lst);
- va_end(lst);
+ va_list args;
+ va_start(args, fmtstr);
+
+#if defined(_WIN32)
+ const int sz = _vscwprintf_l(fmtstr, c_locale(), args);
+#else
+ const int sz = vswprintf(nullptr, 0, fmtstr, args);
+#endif
+ Checks::check_exit(VCPKG_LINE_INFO, sz > 0);
+
+ std::wstring output(sz, L'\0');
+
+#if defined(_WIN32)
+ _vsnwprintf_s_l(&output.at(0), output.size() + 1, output.size(), fmtstr, c_locale(), args);
+#else
+ vswprintf(&output.at(0), output.size() + 1, fmtstr, args);
+#endif
+ va_end(args);
return output;
}