From cc292a3ee15253d09cb5cb0a24ea143a4423be13 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Christian=20Gl=C3=B6ckner?= Date: Tue, 29 Mar 2016 11:32:00 +0200 Subject: Made API of class ConfigFile more consistent --- src/configfile.cc | 491 ++++++++++++++++++++++++++++++------------------------ 1 file changed, 271 insertions(+), 220 deletions(-) (limited to 'src/configfile.cc') diff --git a/src/configfile.cc b/src/configfile.cc index fc1611e..7fe095a 100644 --- a/src/configfile.cc +++ b/src/configfile.cc @@ -44,11 +44,11 @@ #endif #include - + #ifdef WIN32 - #define SEP "\\" +#define SEP "\\" #else - #define SEP "/" +#define SEP "/" #endif #define CONFIGDIRNAME ".drumgizmo" @@ -56,22 +56,23 @@ /** * Return the path containing the config files. */ -static std::string configPath() +static std::string getConfigPath() { #ifdef WIN32 - std::string configpath; - TCHAR szPath[256]; - if(SUCCEEDED(SHGetFolderPath(NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, - NULL, 0, szPath))) { - configpath = szPath; - } + std::string configpath; + TCHAR szPath[256]; + if(SUCCEEDED(SHGetFolderPath( + NULL, CSIDL_APPDATA | CSIDL_FLAG_CREATE, NULL, 0, szPath))) + { + configpath = szPath; + } #else - std::string configpath = getenv("HOME"); + std::string configpath = getenv("HOME"); #endif - configpath += SEP; - configpath += CONFIGDIRNAME; + configpath += SEP; + configpath += CONFIGDIRNAME; - return configpath; + return configpath; } /** @@ -79,270 +80,320 @@ static std::string configPath() */ static bool createConfigPath() { - std::string configpath = configPath(); + std::string configpath = getConfigPath(); - struct stat st; - if(stat(configpath.c_str(), &st) == 0) { - DEBUG(configfile, "No configuration exists, creating directory '%s'\n", - configpath.c_str()); + struct stat st; + if(stat(configpath.c_str(), &st) == 0) + { + DEBUG(configfile, "No configuration exists, creating directory '%s'\n", + configpath.c_str()); #ifdef WIN32 - if(mkdir(configpath.c_str()) < 0) { + if(mkdir(configpath.c_str()) < 0) + { #else - if(mkdir(configpath.c_str(), 0755) < 0) { + if(mkdir(configpath.c_str(), 0755) < 0) + { #endif - DEBUG(configfile, "Could not create config directory\n"); - } + DEBUG(configfile, "Could not create config directory\n"); + } - return false; - } + return false; + } - return true; + return true; } -ConfigFile::ConfigFile(std::string filename) - : filename(filename) - , fp(NULL) +ConfigFile::ConfigFile(std::string const& filename) + : filename(filename) + , fp(nullptr) { } ConfigFile::~ConfigFile() { + if (fp != nullptr) + { + DEBUG(configfile, "File has not been closed by the client...\n"; + } } bool ConfigFile::load() { - DEBUG(configfile, "Loading config file...\n"); - if(!open("r")) { - return false; - } + DEBUG(configfile, "Loading config file...\n"); + if(!open("r")) + { + return false; + } + + values.clear(); - values.clear(); + std::string line; + while(true) + { + line = readLine(); - std::string line; - while(true) { - line = readLine(); + if(line == "") + break; - if(line == "") break; - - if(!parseLine(line)) { - return false; - } - } + if(!parseLine(line)) + { + return false; + } + } - close(); + close(); - return true; + return true; } bool ConfigFile::save() { - DEBUG(configfile, "Saving configuration...\n"); + DEBUG(configfile, "Saving configuration...\n"); - createConfigPath(); + createConfigPath(); - if(!open("w")) { - return false; - } + if(!open("w")) + { + return false; + } - std::map::iterator v = values.begin(); - for(; v != values.end(); ++v) { - fprintf(fp, "%s:%s\n", v->first.c_str(), v->second.c_str()); - } + std::map::iterator v = values.begin(); + for(; v != values.end(); ++v) + { + fprintf(fp, "%s:%s\n", v->first.c_str(), v->second.c_str()); + } - close(); + close(); - return true; + return true; } -std::string ConfigFile::getValue(const std::string& key) +std::string ConfigFile::getValue(const std::string& key) const { - if(values.find(key) != values.end()) { - return values[key]; - } + auto i = values.find(key); + if (i != values.end()) + { + return i->second; + } - return ""; + return ""; } void ConfigFile::setValue(const std::string& key, const std::string& value) { - values[key] = value; + values[key] = value; } bool ConfigFile::open(std::string mode) { - if(fp) close(); + if(fp) + { + close(); + } - std::string configpath = configPath(); + std::string configpath = getConfigPath(); - std::string configfile = configpath; - configfile += SEP; - configfile += filename; + std::string configfile = configpath; + configfile += SEP; + configfile += filename; - DEBUG(configfile, "Opening config file '%s'\n", configfile.c_str()); - fp = fopen(configfile.c_str(), mode.c_str()); + DEBUG(configfile, "Opening config file '%s'\n", configfile.c_str()); + fp = fopen(configfile.c_str(), mode.c_str()); - if(!fp) return false; + if(!fp) + { + return false; + } - return true; + return true; } void ConfigFile::close() { - fclose(fp); - fp = NULL; + fclose(fp); + fp = nullptr; } std::string ConfigFile::readLine() { - if(!fp) return ""; - - std::string line; - - char buf[1024]; - while(!feof(fp)) { - char *s = fgets(buf, sizeof(buf), fp); - if(s) { - line += buf; - if(buf[strlen(buf) - 1] == '\n') break; - } - } - - return line; + if(!fp) + { + return ""; + } + + std::string line; + + char buf[1024]; + while(!feof(fp)) + { + char* s = fgets(buf, sizeof(buf), fp); + if(s) + { + line += buf; + if(buf[strlen(buf) - 1] == '\n') + break; + } + } + + return line; } bool ConfigFile::parseLine(const std::string& line) { - std::string key; - std::string value; - enum { - before_key, - in_key, - after_key, - before_value, - in_value, - in_value_single_quoted, - in_value_double_quoted, - after_value, - } state = before_key; - - for(std::size_t p = 0; p < line.size(); ++p) { - switch(state) { - case before_key: - if(line[p] == '#') { - // Comment: Ignore line. - p = line.size(); - continue; - } - if(std::isspace(line[p])) { - continue; - } - key += line[p]; - state = in_key; - break; - - case in_key: - if(std::isspace(line[p])) { - state = after_key; - continue; - } - if(line[p] == ':' || line[p] == '=') { - state = before_value; - continue; - } - key += line[p]; - break; - - case after_key: - if(std::isspace(line[p])) { - continue; - } - if(line[p] == ':' || line[p] == '=') { - state = before_value; - continue; - } - ERR(configfile, "Bad symbol." - " Expecting only whitespace or key/value seperator: '%s'", - line.c_str()); - return false; - - case before_value: - if(std::isspace(line[p])) { - continue; - } - if(line[p] == '\'') { - state = in_value_single_quoted; - continue; - } - if(line[p] == '"') { - state = in_value_double_quoted; - continue; - } - value += line[p]; - state = in_value; - break; - - case in_value: - if(std::isspace(line[p])) { - state = after_value; - continue; - } - if(line[p] == '#') { - // Comment: Ignore the rest of the line. - p = line.size(); - state = after_value; - continue; - } - value += line[p]; - break; - - case in_value_single_quoted: - if(line[p] == '\'') { - state = after_value; - continue; - } - value += line[p]; - break; - - case in_value_double_quoted: - if(line[p] == '"') { - state = after_value; - continue; - } - value += line[p]; - break; - - case after_value: - if(std::isspace(line[p])) { - continue; - } - if(line[p] == '#') { - // Comment: Ignore the rest of the line. - p = line.size(); - continue; - } - ERR(configfile, "Bad symbol." - " Expecting only whitespace or key/value seperator: '%s'", - line.c_str()); - return false; - } - } - - if(state == before_key) { - // Line did not contain any data (empty or comment) - return true; - } - - // If state == in_value_XXX_quoted here, the string was not terminated. - if(state != after_value && state != in_value) { - ERR(configfile,"Malformed line: '%s'", line.c_str()); - return false; - } - - DEBUG(configfile, "key['%s'] value['%s']\n", key.c_str(), value.c_str()); - - if(key != "") { - values[key] = value; - } - - return true; + std::string key; + std::string value; + enum + { + before_key, + in_key, + after_key, + before_value, + in_value, + in_value_single_quoted, + in_value_double_quoted, + after_value, + } state = before_key; + + for(std::size_t p = 0; p < line.size(); ++p) + { + switch(state) + { + case before_key: + if(line[p] == '#') + { + // Comment: Ignore line. + p = line.size(); + continue; + } + if(std::isspace(line[p])) + { + continue; + } + key += line[p]; + state = in_key; + break; + + case in_key: + if(std::isspace(line[p])) + { + state = after_key; + continue; + } + if(line[p] == ':' || line[p] == '=') + { + state = before_value; + continue; + } + key += line[p]; + break; + + case after_key: + if(std::isspace(line[p])) + { + continue; + } + if(line[p] == ':' || line[p] == '=') + { + state = before_value; + continue; + } + ERR(configfile, + "Bad symbol." + " Expecting only whitespace or key/value seperator: '%s'", + line.c_str()); + return false; + + case before_value: + if(std::isspace(line[p])) + { + continue; + } + if(line[p] == '\'') + { + state = in_value_single_quoted; + continue; + } + if(line[p] == '"') + { + state = in_value_double_quoted; + continue; + } + value += line[p]; + state = in_value; + break; + + case in_value: + if(std::isspace(line[p])) + { + state = after_value; + continue; + } + if(line[p] == '#') + { + // Comment: Ignore the rest of the line. + p = line.size(); + state = after_value; + continue; + } + value += line[p]; + break; + + case in_value_single_quoted: + if(line[p] == '\'') + { + state = after_value; + continue; + } + value += line[p]; + break; + + case in_value_double_quoted: + if(line[p] == '"') + { + state = after_value; + continue; + } + value += line[p]; + break; + + case after_value: + if(std::isspace(line[p])) + { + continue; + } + if(line[p] == '#') + { + // Comment: Ignore the rest of the line. + p = line.size(); + continue; + } + ERR(configfile, + "Bad symbol." + " Expecting only whitespace or key/value seperator: '%s'", + line.c_str()); + return false; + } + } + + if(state == before_key) + { + // Line did not contain any data (empty or comment) + return true; + } + + // If state == in_value_XXX_quoted here, the string was not terminated. + if(state != after_value && state != in_value) + { + ERR(configfile, "Malformed line: '%s'", line.c_str()); + return false; + } + + DEBUG(configfile, "key['%s'] value['%s']\n", key.c_str(), value.c_str()); + + if(key != "") + { + values[key] = value; + } + + return true; } -- cgit v1.2.3