int argc = Application::GetArgC();
char **argv = Application::GetArgV();
+ bool autocomplete = false;
+ int autoindex = 0;
+
+ if (argc >= 4 && strcmp(argv[1], "--autocomplete") == 0) {
+ autocomplete = true;
+ autoindex = Convert::ToLong(argv[2]);
+ argc -= 3;
+ argv += 3;
+ }
+
Application::SetStartTime(Utility::GetTime());
- Application::SetResourceLimits();
+ if (!autocomplete)
+ Application::SetResourceLimits();
/* Set thread title. */
Utility::SetThreadName("Main Thread", false);
("library,l", po::value<std::vector<std::string> >(), "load a library")
("include,I", po::value<std::vector<std::string> >(), "add include search directory")
("log-level,x", po::value<std::string>(), "specify the log level for the console log")
- ("no-stack-rlimit", "used internally, do not specify manually")
- ("autocomplete", "auto-complete arguments");
+ ("no-stack-rlimit", "used internally, do not specify manually");
String cmdname;
CLICommand::Ptr command;
- bool autocomplete;
po::variables_map vm;
try {
if (!command || vm.count("help")) {
if (!command) {
std::cout << std::endl;
- CLICommand::ShowCommands(argc, argv, NULL, false);
+ CLICommand::ShowCommands(argc, argv, NULL);
}
std::cout << std::endl
int rc = 1;
if (autocomplete) {
- CLICommand::ShowCommands(argc, argv, &desc, true);
+ CLICommand::ShowCommands(argc, argv, &desc, true, autoindex);
rc = 0;
} else if (command)
rc = command->Run(vm);
}
bool CLICommand::ParseCommand(int argc, char **argv, po::options_description& desc, po::variables_map& vm,
- String& cmdname, CLICommand::Ptr& command, bool& autocomplete)
+ String& cmdname, CLICommand::Ptr& command, bool autocomplete)
{
boost::mutex::scoped_lock lock(l_RegistryMutex);
- autocomplete = false;
-
typedef std::map<std::vector<String>, CLICommand::Ptr>::value_type CLIKeyValue;
std::vector<String> best_match;
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) {
- if (strcmp(argv[k], "--autocomplete") == 0) {
- autocomplete = true;
- return false;
- }
-
i--;
continue;
}
if (command)
command->InitParameters(ldesc);
-
+
desc.add(ldesc);
-
+
+ if (autocomplete)
+ return true;
+
po::store(po::parse_command_line(argc - arg_end, argv + arg_end, desc), vm);
po::notify(vm);
return true;
}
-void CLICommand::ShowCommands(int argc, char **argv, po::options_description *desc, bool autocomplete)
+void CLICommand::ShowCommands(int argc, char **argv, po::options_description *desc,
+ bool autocomplete, int autoindex)
{
boost::mutex::scoped_lock lock(l_RegistryMutex);
}
}
- if (!autocomplete)
+ String aword;
+
+ if (autocomplete) {
+ if (autoindex < argc)
+ aword = argv[autoindex];
+ } else
std::cout << "Supported commands: " << std::endl;
-
+
BOOST_FOREACH(const CLIKeyValue& kv, l_Registry) {
const std::vector<String>& vname = kv.first;
-
+
if (vname.size() < best_match.size())
continue;
continue;
if (autocomplete) {
- if (best_match.size() < vname.size()) {
- String cname = vname[best_match.size()];
- String pname;
-
- if (arg_begin + best_match.size() + 1 < argc)
- pname = argv[arg_begin + best_match.size() + 1];
-
- if (cname.Find(pname) == 0)
- std::cout << vname[best_match.size()] << " ";
+ String cname;
+
+ if (autoindex - 1 < vname.size()) {
+ cname = vname[autoindex - 1];
+
+ if (cname.Find(aword) == 0)
+ std::cout << cname << "\n";
}
} else
std::cout << " * " << boost::algorithm::join(vname, " ") << " (" << kv.second->GetShortDescription() << ")" << std::endl;
}
-
+
if (command && autocomplete) {
po::options_description ldesc("Command options");
BOOST_FOREACH(const shared_ptr<po::option_description>& odesc, desc->options()) {
String cname = "--" + odesc->long_name();
- String pname = argv[argc - 1];
-
- if (cname.Find(pname) == 0)
- std::cout << cname << " ";
+
+ if (cname.Find(aword) == 0)
+ std::cout << cname << "\n";
}
}
static void Unregister(const std::vector<String>& name);
static bool ParseCommand(int argc, char **argv, boost::program_options::options_description& desc,
- boost::program_options::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool& autocomplete);
- static void ShowCommands(int argc, char **argv, boost::program_options::options_description *desc, bool autocomplete);
+ boost::program_options::variables_map& vm, String& cmdname, CLICommand::Ptr& command, bool autocomplete);
+ static void ShowCommands(int argc, char **argv, boost::program_options::options_description *desc = NULL, bool autocomplete = false, int autoindex = -1);
};
/**