*o++ = '\0';
}
+/** Once we see a standalone double dash, '--', we stop looking for any
+ * other options and flags. */
+static bool handle_double_dash(std::vector<const char*> &args,
+ std::vector<const char*>::iterator &i)
+{
+ if (*i == "--") {
+ i = args.end();
+ return true;
+ }
+ return false;
+}
+
bool ceph_argparse_flag(std::vector<const char*> &args,
std::vector<const char*>::iterator &i, ...)
{
const char *a;
va_list ap;
+ if (handle_double_dash(args, i))
+ return false;
va_start(ap, i);
while (1) {
a = va_arg(ap, char*);
va_list ap;
int strlen_a;
+ if (handle_double_dash(args, i))
+ return false;
// does this argument match any of the possibilities?
va_start(ap, oss);
while (1) {
va_list ap;
int strlen_a;
+ if (handle_double_dash(args, i))
+ return false;
// does this argument match any of the possibilities?
va_start(ap, ret);
while (1) {
// observer notifications later.
std::string val;
for (std::vector<const char*>::iterator i = args.begin(); i != args.end(); ) {
- if (strcmp(*i, "--") == 0) {
- i = args.erase(i);
- break;
- }
if (ceph_argparse_flag(args, i, "--show_conf", (char*)NULL)) {
cerr << cf << std::endl;
_exit(0);
ASSERT_EQ(found_bar, "");
}
+TEST(CephArgParse, DoubleDash) {
+ const char *ARGS[] = { "./myprog", "--foo", "5", "--", "--bar", "6", NULL };
+
+ int foo = -1, bar = -1;
+ VectorContainer args(ARGS);
+ for (std::vector<const char*>::iterator i = args.arr.begin();
+ i != args.arr.end(); )
+ {
+ std::string myarg;
+ if (ceph_argparse_witharg(args.arr, i, &myarg, "--foo", (char*)NULL)) {
+ foo = atoi(myarg.c_str());
+ }
+ else if (ceph_argparse_witharg(args.arr, i, &myarg, "--bar", (char*)NULL)) {
+ bar = atoi(myarg.c_str());
+ }
+ else
+ ++i;
+ }
+ ASSERT_EQ(foo, 5);
+ ASSERT_EQ(bar, -1);
+}
+
TEST(CephArgParse, WithDashesAndUnderscores) {
const char *BAZSTUFF1[] = { "./myprog", "--goo", "--baz-stuff", "50", "--end", NULL };