From f4f6d906733027a7bd802e035b3e9852db7be967 Mon Sep 17 00:00:00 2001 From: Karen Arutyunov Date: Thu, 15 Sep 2016 21:49:24 +0300 Subject: Add process::print() --- butl/process | 15 ++++++++++++++- butl/process.cxx | 38 ++++++++++++++++++++++++++++++++++++++ 2 files changed, 52 insertions(+), 1 deletion(-) (limited to 'butl') diff --git a/butl/process b/butl/process index 96b161f..e1eea29 100644 --- a/butl/process +++ b/butl/process @@ -9,8 +9,9 @@ # include // pid_t #endif +#include #include -#include // uint32_t +#include // uint32_t #include #include @@ -260,6 +261,18 @@ namespace butl static process_path try_path_search (const path&, bool, const dir_path& = dir_path ()); + // Print process commmand line. If the number of elements is specified, + // then it will print the piped multi-process command line, if present. + // In this case, the expected format is as follows: + // + // name1 arg arg ... nullptr + // name2 arg arg ... nullptr + // ... + // nameN arg arg ... nullptr nullptr + // + static void + print (std::ostream&, const char* const args[], size_t n = 0); + public: #ifndef _WIN32 using handle_type = pid_t; diff --git a/butl/process.cxx b/butl/process.cxx index e13a8cd..38948a1 100644 --- a/butl/process.cxx +++ b/butl/process.cxx @@ -37,6 +37,7 @@ #include #include // size_t #include // strlen(), strchr() +#include #include // casecmp() #include // fdnull(), fdclose() @@ -120,6 +121,43 @@ namespace butl return r; } + void process:: + print (ostream& o, const char* const args[], size_t n) + { + size_t m (0); + const char* const* p (args); + do + { + if (m != 0) + o << " |"; // Trailing space will be added inside the loop. + + for (m++; *p != nullptr; p++, m++) + { + if (p != args) + o << ' '; + + // Quote if empty or contains spaces. + // + bool q (**p == '\0' || strchr (*p, ' ') != nullptr); + + if (q) + o << '"'; + + o << *p; + + if (q) + o << '"'; + } + + if (m < n) // Can we examine the next element? + { + p++; + m++; + } + + } while (*p != nullptr); + } + #ifndef _WIN32 static process_path -- cgit v1.1