And handle empty arguments and NULL_terminated arguments. This is a better API than require the user to pass empty strings, especially since in some cases an empty string may be a valid argument.
Signed-off-by: Peter Hutterer <peter.hutte...@who-t.net> --- include/xorg/gtest/xorg-gtest-process.h | 7 ++++--- src/process.cpp | 13 ++++++++----- 2 files changed, 12 insertions(+), 8 deletions(-) diff --git a/include/xorg/gtest/xorg-gtest-process.h b/include/xorg/gtest/xorg-gtest-process.h index 48f387b..b4ac0d9 100644 --- a/include/xorg/gtest/xorg-gtest-process.h +++ b/include/xorg/gtest/xorg-gtest-process.h @@ -30,6 +30,7 @@ #define XORG_GTEST_PROCESS_H #include <stdarg.h> +#include <X11/Xfuncproto.h> /* for _X_SENTINEL */ #include <memory> #include <string> @@ -114,7 +115,7 @@ class Process { * * @param program The program to start. * @param args Variadic list of arguments passed to the program. This list - * must end in a zero-length string ("", not NULL). + * must end with NULL. * * @throws std::runtime_error on failure. * @@ -127,7 +128,7 @@ class Process { * Starts a program as a child process. * * Takes a variadic list of arguments passed to the program. This list - * must end in a zero-length string ("", not NULL). + * must end with NULL. * See 'man execvp' for further information on the variadic argument list. * * @param program The program to start. @@ -137,7 +138,7 @@ class Process { * @post If successful: Child process forked and program started. * @post If successful: Subsequent calls to Pid() return child process pid. */ - void Start(const std::string& program, ...); + void Start(const std::string& program, ...) _X_SENTINEL(0); /** * Terminates (SIGTERM) this child process and waits a given timeout for diff --git a/src/process.cpp b/src/process.cpp index 03dbc42..b85170b 100644 --- a/src/process.cpp +++ b/src/process.cpp @@ -69,7 +69,6 @@ void xorg::testing::Process::Start(const std::string &program, const std::vector args.push_back(strdup(program.c_str())); for (it = argv.begin(); it != argv.end(); it++) - if (!it->empty()) args.push_back(strdup(it->c_str())); args.push_back(NULL); @@ -82,10 +81,14 @@ void xorg::testing::Process::Start(const std::string &program, const std::vector void xorg::testing::Process::Start(const std::string& program, va_list args) { std::vector<std::string> argv; - do { - std::string arg(va_arg(args, char*)); - argv.push_back(arg); - } while (!argv.back().empty()); + if (args) { + char *arg; + do { + arg = va_arg(args, char*); + if (arg) + argv.push_back(std::string(arg)); + } while (arg); + } Start(program, argv); } -- 1.7.11.2 _______________________________________________ xorg-devel@lists.x.org: X.Org development Archives: http://lists.x.org/archives/xorg-devel Info: http://lists.x.org/mailman/listinfo/xorg-devel