bool CmdOptions::Parse (int argc, char *argv[]) { try { int a(1); bool keepParsing (true); QString word; while (a < argc) { word = QString (argv[a]); if (word == "--") { keepParsing = false; } else if (keepParsing && word.startsWith("--")) { ParseLong (word, argv, a, argc+1); } else if (keepParsing && word.startsWith("-")) { ParseShort (word, argv, a, argc+1); } else { mArgs += word; } a++; } } catch (...) { bad = true; return false; } bad = false; return true; }
void AppArgs::Parse(int argc, const char* const* argv) { for (int i=1; i<argc; i++) { // this shouldn't occur if (argv[i] == NULL) return; if (IsOption(argv[i])) { if (IsLongOption(argv[i])) { std::string name, val; bool hasVal; if (ParseLong(argv[i], name, val, hasVal)) { AA_LONG_MAP::iterator it = s_longMap.find(name); if (it != s_longMap.end()) { AppArgOption_t* pOpt = (*it).second; pOpt->found = true; pOpt->hasVal = hasVal; pOpt->val = val; } } } else { char name; std::string val; bool hasVal; ParseShort(argv[i], name, val, hasVal); AA_SHORT_MAP::iterator it = s_shortMap.find(name); if (it != s_shortMap.end()) { AppArgOption_t* pOpt = (*it).second; pOpt->found = true; if (hasVal) { pOpt->hasVal = true; pOpt->val = val; } else { if (i+1 < argc && !IsOption(argv[i+1])) { pOpt->hasVal = true; pOpt->val = argv[i+1]; i++; } else { pOpt->hasVal = false; } } } } } else { s_valList.push_back(argv[i]); } } }
void OptionParser::Run_(int& argc, const char** argv) { argv0 = argv[0]; int endp = 1; if (argc == 1) { if (no_opts_help) { ShowHelp(); throw Exit{true}; } else return; } std::array<Option*, 256> short_opts{}; NEPTOOLS_STATIC_ASSERT(CHAR_BIT == 8); std::map<const char*, Option*, OptCmp> long_opts; for (auto g : groups) for (auto o : g->GetOptions()) { if (!o->enabled) continue; if (o->short_name) { if (short_opts[static_cast<unsigned char>(o->short_name)]) NEPTOOLS_THROW(std::logic_error{"Duplicate short option"}); short_opts[static_cast<unsigned char>(o->short_name)] = o; } auto x = long_opts.insert(std::make_pair(o->name, o)); if (!x.second) NEPTOOLS_THROW(std::logic_error{"Duplicate long option"}); } for (int i = 1; i < argc; ++i) { // option: "--"something, "-"something // non option: something, "-" // special: "--" // non option if (argv[i][0] != '-' || (argv[i][0] == '-' && argv[i][1] == '\0')) { if (no_arg_fun) no_arg_fun(argv[i]); else argv[endp++] = argv[i]; } else { if (argv[i][1] != '-') // short i += ParseShort(short_opts, argc, i, argv); else if (argv[i][1] == '-' && argv[i][2] != '\0') // long i += AddInfo(std::bind(ParseLong, long_opts, argc, i, argv), [=](auto& e) { e << ProcessedOption{argv[i]}; }); else // --: end of args { if (no_arg_fun) for (++i; i < argc; ++i) no_arg_fun(argv[i]); else for (++i; i < argc; ++i) argv[endp++] = argv[i]; break; } } } argc = endp; argv[argc] = nullptr; }