diff options
Diffstat (limited to 'src')
-rw-r--r-- | src/common/Utilities/StartProcess.cpp | 73 | ||||
-rw-r--r-- | src/tools/vmap4_assembler/VMapAssembler.cpp | 4 |
2 files changed, 17 insertions, 60 deletions
diff --git a/src/common/Utilities/StartProcess.cpp b/src/common/Utilities/StartProcess.cpp index 37c41f73a95..bc188a3f29e 100644 --- a/src/common/Utilities/StartProcess.cpp +++ b/src/common/Utilities/StartProcess.cpp @@ -18,10 +18,8 @@ #include "StartProcess.h" #include "Errors.h" #include "Log.h" +#include "Memory.h" #include "Optional.h" - -#include <boost/algorithm/string/join.hpp> -#include <boost/iostreams/copy.hpp> #include <boost/process/args.hpp> #include <boost/process/child.hpp> #include <boost/process/env.hpp> @@ -29,51 +27,12 @@ #include <boost/process/io.hpp> #include <boost/process/pipe.hpp> #include <boost/process/search_path.hpp> +#include <fmt/ranges.h> using namespace boost::process; -using namespace boost::iostreams; namespace Trinity { - -template<typename T> -class TCLogSink -{ - T callback_; - -public: - typedef char char_type; - typedef sink_tag category; - - // Requires a callback type which has a void(std::string) signature - TCLogSink(T callback) - : callback_(std::move(callback)) { } - - std::streamsize write(char const* str, std::streamsize size) - { - std::string_view consoleStr(str, size); - size_t lineEnd = consoleStr.find_first_of("\r\n"); - std::streamsize processedCharacters = size; - if (lineEnd != std::string_view::npos) - { - consoleStr = consoleStr.substr(0, lineEnd); - processedCharacters = lineEnd + 1; - } - - if (!consoleStr.empty()) - callback_(consoleStr); - - return processedCharacters; - } -}; - -template<typename T> -auto MakeTCLogSink(T&& callback) - -> TCLogSink<typename std::decay<T>::type> -{ - return { std::forward<T>(callback) }; -} - template<typename T> static int CreateChildProcess(T waiter, std::string const& executable, std::vector<std::string> const& argsVector, @@ -101,15 +60,11 @@ static int CreateChildProcess(T waiter, std::string const& executable, if (!secure) { TC_LOG_TRACE(logger, "Starting process \"{}\" with arguments: \"{}\".", - executable, boost::algorithm::join(argsVector, " ")); + executable, fmt::join(argsVector, " ")); } // prepare file with only read permission (boost process opens with read_write) - std::shared_ptr<FILE> inputFile(!input.empty() ? fopen(input.c_str(), "rb") : nullptr, [](FILE* ptr) - { - if (ptr != nullptr) - fclose(ptr); - }); + auto inputFile = Trinity::make_unique_ptr_with_deleter(!input.empty() ? fopen(input.c_str(), "rb") : nullptr, &::fclose); // Start the child process child c = [&]() @@ -140,18 +95,20 @@ static int CreateChildProcess(T waiter, std::string const& executable, } }(); - auto outInfo = MakeTCLogSink([&](std::string_view msg) + std::string line; + while (std::getline(outStream, line, '\n')) { - TC_LOG_INFO(logger, "{}", msg); - }); + std::erase(line, '\r'); + if (!line.empty()) + TC_LOG_INFO(logger, "{}", line); + } - auto outError = MakeTCLogSink([&](std::string_view msg) + while (std::getline(errStream, line, '\n')) { - TC_LOG_ERROR(logger, "{}", msg); - }); - - copy(outStream, outInfo); - copy(errStream, outError); + std::erase(line, '\r'); + if (!line.empty()) + TC_LOG_ERROR(logger, "{}", line); + } // Call the waiter in the current scope to prevent // the streams from closing too early on leaving the scope. diff --git a/src/tools/vmap4_assembler/VMapAssembler.cpp b/src/tools/vmap4_assembler/VMapAssembler.cpp index a61d7341d22..444f748753c 100644 --- a/src/tools/vmap4_assembler/VMapAssembler.cpp +++ b/src/tools/vmap4_assembler/VMapAssembler.cpp @@ -97,13 +97,13 @@ Optional<int> HandleArgs(int argc, char* argv[], std::string* src, std::string* return 1; } - if (variablesMap.contains("help")) + if (variablesMap.find("help") != variablesMap.end()) { std::cout << visible << '\n'; return 0; } - if (variablesMap.contains("version")) + if (variablesMap.find("version") != variablesMap.end()) { std::cout << GitRevision::GetFullVersion() << '\n'; return 0; |