summaryrefslogtreecommitdiff
path: root/boost/process/detail/windows/search_path.hpp
diff options
context:
space:
mode:
Diffstat (limited to 'boost/process/detail/windows/search_path.hpp')
-rw-r--r--boost/process/detail/windows/search_path.hpp45
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;
}
}
}