diff --git a/include/boost/gil/io/path_spec.hpp b/include/boost/gil/io/path_spec.hpp index 7b0c91d2f..0dd499b04 100644 --- a/include/boost/gil/io/path_spec.hpp +++ b/include/boost/gil/io/path_spec.hpp @@ -1,5 +1,6 @@ // // Copyright 2007-2008 Andreas Pokorny, Christian Henning +// Copyright 2024 Dirk Stolle // // Distributed under the Boost Software License, Version 1.0 // See accompanying file LICENSE_1_0.txt or copy at @@ -11,6 +12,7 @@ #include #include +#include #include #include @@ -41,11 +43,13 @@ inline std::string convert_to_string( std::string const& obj) inline std::string convert_to_string( std::wstring const& s ) { - std::size_t len = wcslen( s.c_str() ); - char* c = reinterpret_cast( alloca( len )); - wcstombs( c, s.c_str(), len ); + std::mbstate_t state = std::mbstate_t(); + const wchar_t* str = s.c_str(); + const std::size_t len = std::wcsrtombs(nullptr, &str, 0, &state); + std::string result(len, '\0'); + std::wcstombs( &result[0], s.c_str(), len ); - return std::string( c, c + len ); + return result; } inline std::string convert_to_string( char const* str ) @@ -80,18 +84,21 @@ inline char const* convert_to_native_string( const std::string& str ) inline char const* convert_to_native_string( const wchar_t* str ) { - std::size_t len = wcslen( str ) + 1; + std::mbstate_t state = std::mbstate_t(); + const std::size_t len = std::wcsrtombs(nullptr, &str, 0, &state) + 1; char* c = new char[len]; - wcstombs( c, str, len ); + std::wcstombs( c, str, len ); return c; } inline char const* convert_to_native_string( std::wstring const& str ) { - std::size_t len = wcslen( str.c_str() ) + 1; + std::mbstate_t state = std::mbstate_t(); + const wchar_t* wstr = str.c_str(); + const std::size_t len = std::wcsrtombs(nullptr, &wstr, 0, &state) + 1; char* c = new char[len]; - wcstombs( c, str.c_str(), len ); + std::wcstombs( c, str.c_str(), len ); return c; }