From 81abf8eab067eab362f180a418215f9408de41dc Mon Sep 17 00:00:00 2001 From: Boris Kolpackov Date: Fri, 4 Sep 2015 14:15:37 +0200 Subject: Add support for printing process command line --- bpkg/diagnostics | 31 ++++++++++++++++++++++++++++++- bpkg/diagnostics.cxx | 34 ++++++++++++++++++++++++++++++++++ 2 files changed, 64 insertions(+), 1 deletion(-) diff --git a/bpkg/diagnostics b/bpkg/diagnostics index 85eef2b..af9bde0 100644 --- a/bpkg/diagnostics +++ b/bpkg/diagnostics @@ -17,11 +17,41 @@ namespace bpkg { + struct diag_record; + // Throw this exception to terminate the process. The handler should // assume that the diagnostics has already been issued. // class failed: public std::exception {}; + // Print process commmand line. If the number of elements is specified + // (or the second version is used), 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 + // + void + print_process (diag_record&, const char* const* args, std::size_t n = 0); + + void + print_process (const char* const* args, std::size_t n = 0); + + inline void + print_process (diag_record& dr, const cstrings& args) + { + print_process (dr, args.data (), args.size ()); + } + + inline void + print_process (const cstrings& args) + { + print_process (args.data (), args.size ()); + } + // Trace verbosity level. // // 0 - tracing disabled. @@ -45,7 +75,6 @@ namespace bpkg // extern std::ostream* diag_stream; - struct diag_record; template struct diag_prologue; template struct diag_mark; diff --git a/bpkg/diagnostics.cxx b/bpkg/diagnostics.cxx index 2bee18e..4c5e24b 100644 --- a/bpkg/diagnostics.cxx +++ b/bpkg/diagnostics.cxx @@ -10,6 +10,40 @@ using namespace std; namespace bpkg { + // print_process + // + void + print_process (const char* const* args, size_t n) + { + diag_record r (text); + print_process (r, args, n); + } + + void + print_process (diag_record& r, const char* const* args, size_t n) + { + size_t m (0); + const char* const* p (args); + do + { + if (m != 0) + r << " |"; // Trailing space will be added inside the loop. + + for (m++; *p != nullptr; p++, m++) + r << (p != args ? " " : "") + << (**p == '\0' ? "\"" : "") // Quote empty arguments. + << *p + << (**p == '\0' ? "\"" : ""); + + if (m < n) // Can we examine the next element? + { + p++; + m++; + } + + } while (*p != nullptr); + } + // Trace verbosity level. // uint16_t verb; -- cgit v1.1