123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104 |
- // Copyright (c) 2016 Klemens D. Morgenstern
- //
- // Distributed under the Boost Software License, Version 1.0. (See accompanying
- // file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
- #ifndef BOOST_PROCESS_DETAIL_POSIX_CMD_HPP_
- #define BOOST_PROCESS_DETAIL_POSIX_CMD_HPP_
- #include <boost/process/detail/config.hpp>
- #include <boost/process/detail/posix/handler.hpp>
- #include <string>
- #include <vector>
- namespace boost
- {
- namespace process
- {
- namespace detail
- {
- namespace posix
- {
- template<typename Char>
- inline std::vector<std::basic_string<Char>> build_cmd(const std::basic_string<Char> & value)
- {
- std::vector<std::basic_string<Char>> ret;
- bool in_quotes = false;
- auto beg = value.begin();
- for (auto itr = value.begin(); itr != value.end(); itr++)
- {
- if (*itr == quote_sign<Char>())
- in_quotes = !in_quotes;
- if (!in_quotes && (*itr == space_sign<Char>()))
- {
- if (itr != beg)
- {
- ret.emplace_back(beg, itr);
- beg = itr + 1;
- }
- }
- }
- if (beg != value.end())
- ret.emplace_back(beg, value.end());
- return ret;
- }
- template<typename Char>
- struct cmd_setter_ : handler_base_ext
- {
- typedef Char value_type;
- typedef std::basic_string<value_type> string_type;
- cmd_setter_(string_type && cmd_line) : _cmd_line(api::build_cmd(std::move(cmd_line))) {}
- cmd_setter_(const string_type & cmd_line) : _cmd_line(api::build_cmd(cmd_line)) {}
- template <class Executor>
- void on_setup(Executor& exec)
- {
- exec.exe = _cmd_impl.front();
- exec.cmd_line = &_cmd_impl.front();
- exec.cmd_style = true;
- }
- 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<Char>();
- ret += cmd;
- }
- return ret;
- }
- private:
- static inline std::vector<Char*> make_cmd(std::vector<string_type> & args);
- std::vector<string_type> _cmd_line;
- std::vector<Char*> _cmd_impl = make_cmd(_cmd_line);
- };
- template<typename Char>
- std::vector<Char*> cmd_setter_<Char>::make_cmd(std::vector<std::basic_string<Char>> & args)
- {
- std::vector<Char*> vec;
- for (auto & v : args)
- vec.push_back(&v.front());
- vec.push_back(nullptr);
- return vec;
- }
- }}}}
- #endif
|