From e9ba08be3aeaaea3cfc5a8455fac41384e2d7f93 Mon Sep 17 00:00:00 2001 From: atkawa7 Date: Wed, 12 Jul 2017 20:28:14 -0700 Subject: [vcpkg] remove platform dependency of string format --- toolsrc/src/vcpkg_Strings.cpp | 34 ++++++++++++++++++++++------------ 1 file changed, 22 insertions(+), 12 deletions(-) (limited to 'toolsrc/src') diff --git a/toolsrc/src/vcpkg_Strings.cpp b/toolsrc/src/vcpkg_Strings.cpp index aafed5fd3..77ff1a106 100644 --- a/toolsrc/src/vcpkg_Strings.cpp +++ b/toolsrc/src/vcpkg_Strings.cpp @@ -19,26 +19,36 @@ namespace vcpkg::Strings::details std::string format_internal(const char* fmtstr, ...) { - va_list lst; - va_start(lst, fmtstr); + va_list args; + va_start(args, fmtstr); - 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); + int sz = vsnprintf(nullptr, 0, fmtstr, args) + 1; + + char* buffer = new char[sz]; + + vsnprintf(buffer, sz, fmtstr, args); + va_end(args); + + std::string output(buffer); + delete[] buffer; return output; } std::wstring wformat_internal(const wchar_t* fmtstr, ...) { - va_list lst; - va_start(lst, fmtstr); + va_list args; + va_start(args, fmtstr); + + int sz = vswprintf(nullptr, 0, fmtstr, args) + 1; + + wchar_t* buffer = new wchar_t[sz]; + + vswprintf(buffer, sz, fmtstr, args); + va_end(args); - 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); + std::wstring output(buffer); + delete[] buffer; return output; } -- cgit v1.2.3 From 11f540d7e9a3f43614196f45ab7e82ab3fbed03e Mon Sep 17 00:00:00 2001 From: Robert Schumacher Date: Mon, 24 Jul 2017 13:26:45 -0700 Subject: [vcpkg] Use _vsnprintf_s_l on Windows for locale-insensitivity. Avoid manual buffer management. --- toolsrc/src/vcpkg_Strings.cpp | 43 +++++++++++++++++++++++++++++++------------ 1 file changed, 31 insertions(+), 12 deletions(-) (limited to 'toolsrc/src') 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(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; } } -- cgit v1.2.3