From 98f6e50af9d888c0d37fbb68ec2d5ead95956a55 Mon Sep 17 00:00:00 2001 From: Julian Schiedel Date: Wed, 15 Feb 2023 15:48:37 +0100 Subject: [PATCH] Added preprocesser fork to account for missing mbstowcs_s on linux --- include/indicators/display_width.hpp | 37 +++++++++++++++++++--------- 1 file changed, 26 insertions(+), 11 deletions(-) diff --git a/include/indicators/display_width.hpp b/include/indicators/display_width.hpp index c97a2ee..9003b3b 100644 --- a/include/indicators/display_width.hpp +++ b/include/indicators/display_width.hpp @@ -309,18 +309,33 @@ static inline int mk_wcswidth_cjk(const wchar_t *pwcs, size_t n) { } // convert UTF-8 string to wstring -static inline std::wstring utf8_decode(const std::string &s) { - std::string curLocale = setlocale(LC_ALL, ""); - const char *_Source = s.c_str(); - size_t _Dsize = strlen(_Source) + 1; - wchar_t *_Dest = new wchar_t[_Dsize]; - size_t _Osize; - mbstowcs_s(&_Osize, _Dest, _Dsize, _Source, _Dsize); - std::wstring result = _Dest; - delete[] _Dest; - setlocale(LC_ALL, curLocale.c_str()); - return result; +#ifdef _MSC_VER +static inline std::wstring utf8_decode(const std::string& s) { + std::string curLocale = setlocale(LC_ALL, ""); + const char* _Source = s.c_str(); + size_t _Dsize = std::strlen(_Source) + 1; + wchar_t* _Dest = new wchar_t[_Dsize]; + size_t _Osize; + mbstowcs_s(&_Osize, _Dest, _Dsize, _Source, _Dsize); + std::wstring result = _Dest; + delete[] _Dest; + setlocale(LC_ALL, curLocale.c_str()); + return result; } +#else +static inline std::wstring utf8_decode(const std::string& s) { + std::string curLocale = setlocale(LC_ALL, ""); + const char* _Source = s.c_str(); + size_t _Dsize = mbstowcs(NULL, _Source, 0) + 1; + wchar_t* _Dest = new wchar_t[_Dsize]; + wmemset(_Dest, 0, _Dsize); + mbstowcs(_Dest, _Source, _Dsize); + std::wstring result = _Dest; + delete[] _Dest; + setlocale(LC_ALL, curLocale.c_str()); + return result; +} +#endif } // namespace details