#include "ConfigFile.h" #include "Util.h" #include #include #include #include const char SEPERATOR = '/'; std::string trim(std::string const& source, char const* delims = " \t\r\n") { std::string result(source); std::string::size_type index = result.find_last_not_of(delims); if (index != std::string::npos) result.erase(++index); index = result.find_first_not_of(delims); if (index != std::string::npos) result.erase(0, index); else result.erase(); return result; } ConfigFile::ConfigFile() { } ConfigFile::ConfigFile(std::string const& configFile) : filename_(configFile) { Open(); } bool ConfigFile::Reload() { content_.clear(); return Open(); } bool ConfigFile::Open(std::string const& configFile) { content_.clear(); filename_ = configFile; return Open(); } bool ConfigFile::Open() { std::ifstream file( filename_.c_str() ); std::string line; std::string name; std::string value; std::string inSection; int posEqual; if (!file) { return false; } while (std::getline(file,line)) { if (! line.length()) continue; if (line[0] == '#') continue; if (line[0] == ';') continue; if (line[0] == '[') { inSection=trim(line.substr(1,line.find(']')-1)); continue; } posEqual=line.find('='); name = trim(line.substr(0,posEqual)); value = trim(line.substr(posEqual+1)); content_.insert(std::make_pair(inSection+SEPERATOR+name,Value(value))); } return true; } Value const& ConfigFile::GetValue(std::string const& section, std::string const& entry) const { content_iterator ci = content_.find(section + SEPERATOR + entry); if (ci == content_.end()) throw "does not exist"; return ci->second; } std::vector ConfigFile::GetValues(std::string const& section, std::string const& entry) const { std::vector values; std::string search = section + SEPERATOR + entry; std::pair range = content_.equal_range(search); for (content_iterator it=range.first; it != range.second; ++it) { values.push_back( it->second ); } return values; } Value const& ConfigFile::GetValue(std::string const& section, std::string const& entry, double value) { try { return GetValue(section, entry); } catch (const char *) { return content_.insert(std::make_pair(section+SEPERATOR+entry, Value(value)))->second; } } Value const& ConfigFile::GetValue(std::string const& section, std::string const& entry, std::string const& value) { try { return GetValue(section, entry); } catch (const char *) { return content_.insert(std::make_pair(section+SEPERATOR+entry, Value(value)))->second; } } std::string ConfigFile::DumpConfig() const { std::ostringstream ss; for (content_iterator it=content_.begin(); it!=content_.end(); ++it) { ss << it->first << "=" << it->second.StringValue() << std::endl; } return ss.str(); } namespace ConfigHelper { std::map ParseArguments(const std::string& args) { std::map config; std::vector sections = Util::str_split(args, ";"); for (unsigned i=0; i params = Util::str_split( current, "="); if (params.size() != 2) throw std::runtime_error(std::string("syntax error in config line: ") + args); std::string key = Util::str_tolower(Util::str_trim(params[0])); std::string val = Util::str_trim(params[1]); config[key] = val; } return config; } int StringToInt(const std::string& input) { char* endptr = (char*) input.c_str(); int retval = strtol(input.c_str(), &endptr, 10); if ( *endptr != 0) throw std::runtime_error( std::string("Error: can not convert this to a number: ") + input); return retval; } }