diff --git a/include/boost/process/detail/posix/cmd.hpp b/include/boost/process/detail/posix/cmd.hpp index 33449b68..4786d1a4 100644 --- a/include/boost/process/detail/posix/cmd.hpp +++ b/include/boost/process/detail/posix/cmd.hpp @@ -63,8 +63,22 @@ struct cmd_setter_ : handler_base_ext { exec.cmd_line = &_cmd_impl.front(); } - const string_type & str() const {return _cmd_line;} + string_type str() const + { + string_type ret; + std::size_t size = 0; + for (auto & cmd : _cmd_line) + size += cmd.size() + 1; + ret.reserve(size -1); + for (auto & cmd : _cmd_line) + { + if (!ret.empty()) + ret += equal_sign(); + ret += cmd; + } + return ret; + } private: static inline std::vector make_cmd(std::vector & args); std::vector _cmd_line; diff --git a/include/boost/process/detail/posix/environment.hpp b/include/boost/process/detail/posix/environment.hpp index b699f7bb..50944c0f 100644 --- a/include/boost/process/detail/posix/environment.hpp +++ b/include/boost/process/detail/posix/environment.hpp @@ -37,7 +37,7 @@ class native_environment_impl std::vector val; val.resize(vec.size() + 1); std::transform(vec.begin(), vec.end(), val.begin(), - [](auto & str) + [](std::basic_string & str) { return &str.front(); }); @@ -185,8 +185,16 @@ public: explicit inline basic_environment_impl( const basic_environment_impl& rhs, const ::boost::process::codecvt_type & cv = ::boost::process::codecvt()) - : _data(::boost::process::detail::convert(rhs._data, cv)) + : _data(rhs._data.size()) { + std::transform(rhs._data.begin(), rhs._data.end(), _data.begin(), + [&](const std::basic_string & st) + { + return ::boost::process::detail::convert(st, cv); + } + + ); + } template diff --git a/include/boost/process/detail/posix/executor.hpp b/include/boost/process/detail/posix/executor.hpp index 2ac03153..b503de1e 100644 --- a/include/boost/process/detail/posix/executor.hpp +++ b/include/boost/process/detail/posix/executor.hpp @@ -462,7 +462,7 @@ child executor::invoke(boost::mpl::false_, boost::mpl::true_) #endif -template +template inline executor make_executor(Tup & tup) { return executor(tup); diff --git a/include/boost/process/detail/posix/start_dir.hpp b/include/boost/process/detail/posix/start_dir.hpp index 35894b5d..f7468e5f 100644 --- a/include/boost/process/detail/posix/start_dir.hpp +++ b/include/boost/process/detail/posix/start_dir.hpp @@ -21,7 +21,7 @@ struct start_dir_init : handler_base_ext { typedef Char value_type; typedef std::basic_string string_type; - explicit start_dir_init(const string_type &s) : s_(s) {} + start_dir_init(const string_type &s) : s_(s) {} template void on_exec_setup(PosixExecutor&) const diff --git a/include/boost/process/detail/traits/wchar_t.hpp b/include/boost/process/detail/traits/wchar_t.hpp index 751a433f..e7eb6255 100644 --- a/include/boost/process/detail/traits/wchar_t.hpp +++ b/include/boost/process/detail/traits/wchar_t.hpp @@ -128,6 +128,14 @@ struct char_converter } }; +template<> +struct char_converter +{ + static std::string conv(const std::wstring & in) + { + return ::boost::process::detail::convert(in); + } +}; template<> struct char_converter> diff --git a/include/boost/process/environment.hpp b/include/boost/process/environment.hpp index 2ffc498d..ed66e800 100644 --- a/include/boost/process/environment.hpp +++ b/include/boost/process/environment.hpp @@ -639,15 +639,17 @@ inline std::vector path() { #if defined(BOOST_WINDOWS_API) const ::boost::process::wnative_environment ne; + typedef typename ::boost::process::wnative_environment::const_entry_type value_type; const auto id = L"PATH"; #else const ::boost::process::native_environment ne; + typedef typename ::boost::process::native_environment::const_entry_type value_type; const auto id = "path"; #endif auto itr = std::find_if(ne.cbegin(), ne.cend(), - [&](const auto & e) - {return id == ::boost::to_upper_copy(e.get_name());}); + [&](const value_type & e) + {return id == ::boost::to_upper_copy(e.get_name(), ::boost::process::detail::process_locale());}); if (itr == ne.cend()) return {};