diff options
Diffstat (limited to 'boost/process/detail/windows/search_path.hpp')
-rw-r--r-- | boost/process/detail/windows/search_path.hpp | 45 |
1 files changed, 35 insertions, 10 deletions
diff --git a/boost/process/detail/windows/search_path.hpp b/boost/process/detail/windows/search_path.hpp index 53fb966784..7c589a720c 100644 --- a/boost/process/detail/windows/search_path.hpp +++ b/boost/process/detail/windows/search_path.hpp @@ -19,9 +19,8 @@ #include <array> #include <atomic> #include <cstdlib> -#include <boost/detail/winapi/shell.hpp> - - +#include <boost/winapi/shell.hpp> +#include <boost/process/environment.hpp> namespace boost { namespace process { namespace detail { namespace windows { @@ -29,20 +28,46 @@ inline boost::filesystem::path search_path( const boost::filesystem::path &filename, const std::vector<boost::filesystem::path> &path) { + const ::boost::process::wnative_environment ne{}; + typedef typename ::boost::process::wnative_environment::const_entry_type value_type; + const auto id = L"PATHEXT"; + + auto itr = std::find_if(ne.cbegin(), ne.cend(), + [&](const value_type & e) + {return id == ::boost::to_upper_copy(e.get_name(), ::boost::process::detail::process_locale());}); + + auto extensions_in = itr->to_vector(); + + std::vector<std::wstring> extensions((extensions_in.size() * 2) + 1); + + auto it_ex = extensions.begin(); + it_ex++; + it_ex = std::transform(extensions_in.begin(), extensions_in.end(), it_ex, + [](const std::wstring & ws){return boost::to_lower_copy(ws, ::boost::process::detail::process_locale());}); + + std::transform(extensions_in.begin(), extensions_in.end(), it_ex, + [](const std::wstring & ws){return boost::to_upper_copy(ws, ::boost::process::detail::process_locale());}); + + + std::copy(std::make_move_iterator(extensions_in.begin()), std::make_move_iterator(extensions_in.end()), extensions.begin() + 1); + + + for (auto & ext : extensions) + boost::to_lower(ext); + for (const boost::filesystem::path & pp : path) { - auto full = pp / filename; - std::array<std::string, 4> extensions {{ "", ".exe", ".com", ".bat" }}; + auto p = pp / filename; for (boost::filesystem::path ext : extensions) { - auto p = full; - p += ext; + boost::filesystem::path pp = p; + pp += ext; boost::system::error_code ec; - bool file = boost::filesystem::is_regular_file(p, ec); + bool file = boost::filesystem::is_regular_file(pp, ec); if (!ec && file && - ::boost::detail::winapi::sh_get_file_info(p.string().c_str(), 0, 0, 0, ::boost::detail::winapi::SHGFI_EXETYPE_)) + ::boost::winapi::sh_get_file_info(pp.native().c_str(), 0, 0, 0, ::boost::winapi::SHGFI_EXETYPE_)) { - return p; + return pp; } } } |