/** * Parses a config file with lines of the form * * flag = value * * and sets flags as appropriate. */ Status ParseConfigFile() { Trace(); if (!g_configFile.wasSet()) { Log(LL::Trace) << "No flag config file specified."; return Status::ok(); } const std::string &filename = g_configFile.get(); Log(LL::Trace) << "Begining parse of config file: " << filename; std::ifstream ifile(filename.c_str()); if (!ifile.is_open()) { Log(LL::Trace) << "Config file " << filename << " not found."; return Status(Status::NOT_FOUND); } std::string line; int lineno = 0; while (std::getline(ifile, line)) { if (line.empty()) { lineno++; continue; } std::vector< std::string > argstr = Splitter().on('=').trimWhitespace().split(line, 2); RET_SM( argstr.size() == 2, Status::BAD_INPUT, "Error in config file \"" << filename << "\" " << "on line " << lineno << " is not a valid flag=value pair"); tFlagIter itr = GetGlobalFlags().find(argstr[0]); RET_SM( itr != GetGlobalFlags().end(), Status::BAD_INPUT, "Unknown flag: " << argstr[0] << " @ line " << lineno); iFlagBase *pFlag = itr->second; RET_SM( pFlag->fromString(TrimQuotes(argstr[1])), Status::BAD_INPUT, "Invalid flag value for " << argstr[0] << " at line " << lineno << ". can't parse: " << argstr[1]); lineno++; } return Status::ok(); }
Status ParseFlags(const int argc, const char **argv) { Trace(); for (int i = 0; i < argc; ++i) { Log(LL::Info) << "argv[" << i << "] = " << argv[i]; } for (int i = 1; i < argc; ++i) { const char *arg = argv[i]; if ((arg[0] != '-') || (arg[0] != '\0' && arg[1] != '-')) { Log(LL::Error) << "Unknown commandline input #" << i << ": " << arg; return Status::BAD_ARGUMENT; } std::vector< std::string > argstr = Splitter().on('=').trimWhitespace().split(std::string(arg + 2), 2); RET_SM(!argstr.empty(), Status::BAD_ARGUMENT, "Unknown flag: " << arg); tFlagIter itr = GetGlobalFlags().find(argstr[0]); RET_SM( itr != GetGlobalFlags().end(), Status::BAD_ARGUMENT, "Unknown flag: " << arg); iFlagBase *pFlag = itr->second; if (argstr.size() == 2) { // Parse case where we have [flag][=][value] RET_SM( pFlag->fromString(argstr.at(1)), Status::BAD_ARGUMENT, "Invalid flag value for " << argstr[0] << " can't parse " << argstr[1]); } else if (i + 1 < argc) { // Parse case where we have [flag][space][value] ++i; RET_SM( pFlag->fromString(std::string(argv[i])), Status::BAD_ARGUMENT, "Invalid flag value for " << argstr[0] << " can't parse " << argv[i]); } else { // Error on case where we have [flag] alone. Booleans must be specified // as [flag][=][true] Log(LL::Error) << "Found flag with no value: " << argstr[0]; return Status::BAD_ARGUMENT; } } return ParseConfigFile(); }
bool ParseFlags(const int argc, const char **argv) { Trace("Parsing " << argc << " flags from the cli"); for (int i = 0; i < argc; ++i) { Log(LL::Info) << "argv[" << i << "] = " << argv[i] << std::endl; } for (int i = 1; i < argc; ++i) { const char *arg = argv[i]; if ((arg[0] != '-') || (argv[0] != '\0' && arg[1] != '-')) { Log(LL::Error) << "Unknown commandline input #" << i << ": " << arg << std::endl; return false; } std::vector<std::string> argstr = core::util::Splitter() .on('=') .trimWhitespace() .split(std::string(arg + 2), 2); RET_M(!argstr.empty(), "Unknown flag: " << arg); tFlagIter itr = GetGlobalFlags().find(argstr[0]); RET_M(itr != GetGlobalFlags().end(), "Unknown flag: " << arg); iFlagBase *pFlag = itr->second; if (argstr.size() == 2) { // Parse case where we have [flag][=][value] RET_M(pFlag->fromString(argstr.at(1)), "Invalid flag value for " << argstr[0] << " can't parse " << argstr[1]); } else if (i + 1 < argc) { // Parse case where we have [flag][space][value] ++i; RET_M(pFlag->fromString(std::string(argv[i])), "Invalid flag value for " << argstr[0] << " can't parse " << argv[i]); } else { // Error on case where we have [flag] alone. Booleans must be specified as [flag][=][true] Log(LL::Error) << "Found flag with no value: " << argstr[0] << std::endl; return false; } } Trace("Finished parsing cli flags"); return ParseConfigFile(g_configFile.get()); }
/** * Parses a config file with lines of the form * * flag = value * * and sets flags as appropriate. */ bool ParseConfigFile(const std::string &filename) { Trace("Begining parse of config file: " << filename); std::ifstream ifile(filename.c_str()); if (!ifile.is_open()) { Log(LL::Info) << "Config file " << filename << " not found." << std::endl; return true; } std::string line; int lineno = 0; while (std::getline(ifile, line)) { if (line.empty()) { lineno++; continue; } std::vector<std::string> argstr = core::util::Splitter() .on('=') .trimWhitespace() .split(line, 2); RET_M(argstr.size() == 2, "Error in config file \"" << filename << "\" " << "on line " << lineno << " is not a valid flag=value pair"); tFlagIter itr = GetGlobalFlags().find(argstr[0]); RET_M(itr != GetGlobalFlags().end(), "Unknown flag: " << argstr[0]); iFlagBase *pFlag = itr->second; RET_M(pFlag->fromString(core::util::trimQuotes(argstr[1])), "Invalid flag value for " << argstr[0] << " can't parse " << argstr[1]); lineno++; } Trace("Finished parsing config file of length: " << lineno); return true; }