}
}
std::vector<char *> argv = GetArgvForParsing(args);
+ // If the last option requires an argument but doesn't have one,
+ // some implementations of getopt_long will still try to read it.
+ char overflow = 0;
+ argv.push_back(&overflow);
std::unique_lock<std::mutex> lock;
OptionParser::Prepare(lock);
int val;
while (true) {
int long_options_index = -1;
- val = OptionParser::Parse(argv.size(), &*argv.begin(), sstr.GetString(),
+ val = OptionParser::Parse(argv.size() - 1, &*argv.begin(), sstr.GetString(),
long_options, &long_options_index);
+
+ if ((size_t)OptionParser::GetOptionIndex() > argv.size() - 1) {
+ error.SetErrorStringWithFormat("last option requires an argument");
+ break;
+ }
+
if (val == -1)
break;
if (error.Fail())
return error.ToError();
+ argv.pop_back();
argv.erase(argv.begin(), argv.begin() + OptionParser::GetOptionIndex());
return ReconstituteArgsAfterParsing(argv, args);
}