Integrating option parsing in TestCase for added convenience
To hook it up to individual test cases:
- define GetLongOptions() in your test case class to return something other than NULL (hopefully an array of options :-)
- implement ParseOption() to check for the short option char and do the right thing - return true at the end if you want more options to come your way or false if you don’t
- make sure that your Setup() call takes int& and char**& so that optind post-processing can happen - and call TestCase::Setup from your setup
git-svn-id: https://llvm.org/svn/llvm-project/lldb/trunk@178482 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/tools/lldb-perf/common/clang/lldb_perf_clang.cpp b/tools/lldb-perf/common/clang/lldb_perf_clang.cpp
index ef9697a..a4eb4c6 100644
--- a/tools/lldb-perf/common/clang/lldb_perf_clang.cpp
+++ b/tools/lldb-perf/common/clang/lldb_perf_clang.cpp
@@ -68,7 +68,7 @@
}
virtual bool
- Setup (int argc, const char** argv)
+ Setup (int& argc, const char**& argv)
{
if (m_exe_path.empty())
return false;
diff --git a/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp b/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp
index 3fa21b0..cf7964b 100644
--- a/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp
+++ b/tools/lldb-perf/common/stepping/lldb-perf-stepping.cpp
@@ -28,7 +28,7 @@
~StepTest() {}
virtual bool
- Setup (int argc, const char **argv)
+ Setup (int& argc, const char**& argv)
{
TestCase::Setup (argc, argv);
diff --git a/tools/lldb-perf/darwin/formatters/formatters.cpp b/tools/lldb-perf/darwin/formatters/formatters.cpp
index ff4931e..91bfc85 100644
--- a/tools/lldb-perf/darwin/formatters/formatters.cpp
+++ b/tools/lldb-perf/darwin/formatters/formatters.cpp
@@ -71,7 +71,7 @@
}
virtual bool
- Setup (int argc, const char** argv)
+ Setup (int& argc, const char**& argv)
{
m_app_path.assign(argv[1]);
m_out_path.assign(argv[2]);
diff --git a/tools/lldb-perf/darwin/sketch/sketch.cpp b/tools/lldb-perf/darwin/sketch/sketch.cpp
index 86c4366..c92de0a 100644
--- a/tools/lldb-perf/darwin/sketch/sketch.cpp
+++ b/tools/lldb-perf/darwin/sketch/sketch.cpp
@@ -62,7 +62,7 @@
}
virtual bool
- Setup (int argc, const char** argv)
+ Setup (int& argc, const char**& argv)
{
//SetVerbose(true);
m_app_path.assign(argv[1]);
diff --git a/tools/lldb-perf/lib/TestCase.cpp b/tools/lldb-perf/lib/TestCase.cpp
index 7a7c48a..c4b0199 100644
--- a/tools/lldb-perf/lib/TestCase.cpp
+++ b/tools/lldb-perf/lib/TestCase.cpp
@@ -28,9 +28,77 @@
m_listener = m_debugger.GetListener();
}
-bool
-TestCase::Setup (int argc, const char** argv)
+static std::string
+GetShortOptionString (struct option *long_options)
{
+ std::string option_string;
+ for (int i = 0; long_options[i].name != NULL; ++i)
+ {
+ if (long_options[i].flag == NULL)
+ {
+ option_string.push_back ((char) long_options[i].val);
+ switch (long_options[i].has_arg)
+ {
+ default:
+ case no_argument:
+ break;
+ case required_argument:
+ option_string.push_back (':');
+ break;
+ case optional_argument:
+ option_string.append (2, ':');
+ break;
+ }
+ }
+ }
+ return option_string;
+}
+
+bool
+TestCase::Setup (int& argc, const char**& argv)
+{
+ bool done = false;
+
+ struct option* long_options = GetLongOptions();
+
+ if (long_options)
+ {
+ std::string short_option_string (GetShortOptionString(long_options));
+
+ #if __GLIBC__
+ optind = 0;
+ #else
+ optreset = 1;
+ optind = 1;
+ #endif
+ while (!done)
+ {
+ int long_options_index = -1;
+ const int short_option = ::getopt_long_only (argc,
+ const_cast<char **>(argv),
+ short_option_string.c_str(),
+ long_options,
+ &long_options_index);
+
+ switch (short_option)
+ {
+ case 0:
+ // Already handled
+ break;
+
+ case -1:
+ done = true;
+ break;
+
+ default:
+ done = !ParseOption(short_option, optarg);
+ break;
+ }
+ }
+ argc -= optind;
+ argv += optind;
+ }
+
return false;
}
diff --git a/tools/lldb-perf/lib/TestCase.h b/tools/lldb-perf/lib/TestCase.h
index cc376c8..d9a7c9f 100644
--- a/tools/lldb-perf/lib/TestCase.h
+++ b/tools/lldb-perf/lib/TestCase.h
@@ -12,6 +12,7 @@
#include "lldb/API/LLDB.h"
#include "Measurement.h"
+#include <getopt.h>
namespace lldb_perf {
@@ -74,7 +75,7 @@
}
virtual bool
- Setup (int argc, const char** argv);
+ Setup (int& argc, const char**& argv);
virtual void
TestStep (int counter, ActionWanted &next_action) = 0;
@@ -115,6 +116,18 @@
static void
Run (TestCase& test, int argc, const char** argv);
+ virtual bool
+ ParseOption (int short_option, const char* optarg)
+ {
+ return false;
+ }
+
+ virtual struct option*
+ GetLongOptions ()
+ {
+ return NULL;
+ }
+
lldb::SBDebugger &
GetDebugger()
{