bool CLICommand::ParseCommand(int argc, char **argv, po::options_description& visibleDesc, po::options_description& hiddenDesc, po::positional_options_description& positionalDesc, po::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool autocomplete) { boost::mutex::scoped_lock lock(GetRegistryMutex()); typedef std::map<std::vector<String>, CLICommand::Ptr>::value_type CLIKeyValue; std::vector<String> best_match; int arg_end = 1; BOOST_FOREACH(const CLIKeyValue& kv, GetRegistry()) { const std::vector<String>& vname = kv.first; for (int i = 0, k = 1; i < vname.size() && k < argc; i++, k++) { if (strcmp(argv[k], "--no-stack-rlimit") == 0 || strcmp(argv[k], "--autocomplete") == 0 || strcmp(argv[k], "--scm") == 0) { i--; continue; } if (vname[i] != argv[k]) break; if (i >= best_match.size()) best_match.push_back(vname[i]); if (i == vname.size() - 1) { cmdname = boost::algorithm::join(vname, " "); command = kv.second; arg_end = k; goto found_command; } } } found_command: lock.unlock(); po::options_description vdesc("Command options"); if (command) command->InitParameters(vdesc, hiddenDesc); visibleDesc.add(vdesc); if (autocomplete) return true; po::options_description adesc; adesc.add(visibleDesc); adesc.add(hiddenDesc); po::store(po::command_line_parser(argc - arg_end, argv + arg_end).options(adesc).positional(positionalDesc).run(), vm); po::notify(vm); return true; }
bool CLICommand::ParseCommand(int argc, char **argv, po::options_description& visibleDesc, po::options_description& hiddenDesc, po::positional_options_description& positionalDesc, po::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool autocomplete) { boost::mutex::scoped_lock lock(GetRegistryMutex()); typedef std::map<std::vector<String>, CLICommand::Ptr>::value_type CLIKeyValue; std::vector<String> best_match; int arg_end = 0; bool tried_command = false; for (const CLIKeyValue& kv : GetRegistry()) { const std::vector<String>& vname = kv.first; std::vector<String>::size_type i; int k; for (i = 0, k = 1; i < vname.size() && k < argc; i++, k++) { if (strncmp(argv[k], "-", 1) == 0 || strncmp(argv[k], "--", 2) == 0) { i--; continue; } tried_command = true; if (vname[i] != argv[k]) break; if (i >= best_match.size()) best_match.push_back(vname[i]); if (i == vname.size() - 1) { cmdname = boost::algorithm::join(vname, " "); command = kv.second; arg_end = k; goto found_command; } } } found_command: lock.unlock(); if (command) { po::options_description vdesc("Command options"); command->InitParameters(vdesc, hiddenDesc); visibleDesc.add(vdesc); } if (autocomplete || (tried_command && !command)) return true; po::options_description adesc; adesc.add(visibleDesc); adesc.add(hiddenDesc); if (command && command->IsDeprecated()) { std::cerr << ConsoleColorTag(Console_ForegroundRed | Console_Bold) << "Warning: CLI command '" << cmdname << "' is DEPRECATED! Please read the Changelog." << ConsoleColorTag(Console_Normal) << std::endl << std::endl; } po::store(po::command_line_parser(argc - arg_end, argv + arg_end).options(adesc).positional(positionalDesc).run(), vm); po::notify(vm); return true; }