|
|
@@ -98,8 +98,6 @@ template <typename Impl> bool Arguments<Impl>::Option::primed() const {
|
|
|
|
|
|
}
|
|
|
|
|
|
-#define arg_equals(str) !strncmp(argv[i], str, sizeof(str))
|
|
|
-#define arg_starts_with(str) !strncmp(argv[i], str, strlen(str))
|
|
|
namespace program {
|
|
|
|
|
|
template <typename Impl>
|
|
|
@@ -114,25 +112,34 @@ Arguments<Impl>::Arguments(int argc, char const * const * const argv) {
|
|
|
primed_ = true;
|
|
|
program = argv[0];
|
|
|
for (size_t i = 1; i < argc; ++i) {
|
|
|
- if (arg_equals("--help")) {
|
|
|
+ std::string arg = argv[i];
|
|
|
+ char abbrev = arg[1];
|
|
|
+ if (arg == "--help") {
|
|
|
usage();
|
|
|
- std::exit(0); // TODO: ???
|
|
|
- } else if (arg_equals("--")) {
|
|
|
- // TODO: Special arguments store for passthroughs
|
|
|
+ std::exit(0);
|
|
|
+ } else if (arg == "--") {
|
|
|
arguments.insert(arguments.end(), &argv[i + 1], &argv[argc]);
|
|
|
break;
|
|
|
- } else if (argv[i][0] != '-') {
|
|
|
- arguments.emplace_back(argv[i]);
|
|
|
- } else if (!is_flag(argv[i])) {
|
|
|
- options[id(argv[i])].emplace_back(argv[i]);
|
|
|
- ++i;
|
|
|
- } else {
|
|
|
- // TODO: Flag handling for e.g. -v2 -vv
|
|
|
- if (arg_starts_with("--no-")) {
|
|
|
- flags[id(argv[i])] = 0;
|
|
|
+ } else if (arg[0] != '-') {
|
|
|
+ arguments.emplace_back(arg);
|
|
|
+ } else if (is_flag(arg)) {
|
|
|
+ if (arg.substr(0, 4) == "--no-") {
|
|
|
+ flags[id(arg)] = 0;
|
|
|
} else {
|
|
|
- ++flags[id(argv[i])];
|
|
|
+ ++flags[id(arg)];
|
|
|
}
|
|
|
+ } else if (is_option(arg)) {
|
|
|
+ options[id(arg)].emplace_back(arg);
|
|
|
+ ++i;
|
|
|
+ } else if (is_flag(abbrev)) {
|
|
|
+ for (auto c : arg.substr(1)) {
|
|
|
+ if (!is_flag(c)) { throw NotAnArgumentError({'-', c}); }
|
|
|
+ ++flags[id(c)];
|
|
|
+ }
|
|
|
+ } else if (is_option(abbrev)) {
|
|
|
+ options[id(abbrev)].emplace_back(arg.substr(2));
|
|
|
+ } else {
|
|
|
+ throw NotAnArgumentError(arg);
|
|
|
}
|
|
|
}
|
|
|
}
|
|
|
@@ -217,5 +224,3 @@ auto Arguments<Impl>::option(std::string const & name, char abbrev,
|
|
|
}
|
|
|
|
|
|
}
|
|
|
-#undef arg_equals
|
|
|
-#undef arg_starts_with
|