int Program::run(int argc, char **argv) { setLocale(); #ifdef WIN32 auto command_line = po::split_winmain(ucsToUtf8(wstring(GetCommandLine()))); command_line.erase(command_line.begin()); #else vector<string> command_line; command_line.resize(argc - 1); for (int i = 1; i < argc; i++) { command_line[i - 1] = argv[i]; } #endif auto command_name = getCommandName(command_line); if (!command_name.first) return EXIT_FAILURE; if (command_name.first && command_name.second == ""){ printHelp(); return EXIT_FAILURE; } auto command = findCommand(command_name.second.c_str()); if (!command){ cerr << program_name << ": " << "unknown command '" << command_name.second << "'" << "\n"; printHelp(); return EXIT_FAILURE; } try{ po::options_description all_options, global_options, options, hidden_options; po::positional_options_description positional_options; string command_confirm; addGlobalOptions(global_options); hidden_options.add_options() ("command", po::value<string>(&command_confirm), "") ; positional_options.add("command", 1); command->addOptions(options, hidden_options); command->addPositionalOptions(positional_options); all_options.add(global_options).add(options).add(hidden_options); auto parsed = po::command_line_parser(command_line).options(all_options).positional(positional_options).run(); po::variables_map vm; po::store(parsed, vm); po::notify(vm); if (vm.count("help")) { printHelp(*command); return EXIT_SUCCESS; } if (!command->checkOptions(vm)){ printHelp(*command); return EXIT_FAILURE; } return command->run(); }catch(const exception &e){ cerr << program_name << ": " << e.what() << "\n"; return EXIT_FAILURE; } }
std::string errnoToUtf8(int errorNumber) { LPWSTR lpMsgBuf; FormatMessageW(FORMAT_MESSAGE_ALLOCATE_BUFFER | FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_IGNORE_INSERTS, NULL, errorNumber, MAKELANGID(LANG_NEUTRAL, SUBLANG_DEFAULT), (LPWSTR)&lpMsgBuf, 0, NULL); std::wstring s(lpMsgBuf); LocalFree(lpMsgBuf); return ucsToUtf8(s); }