bool ConfigSettings::readSettings(const char* path) { std::ifstream config(path); std::string line; size_t line_number = 0; if(!config.good()) return false; while(config.good()) { size_t pos = std::string::npos; std::getline(config, line); line_number += 1; // De-comment and trim, skipping anything that shows up empty pos = line.find_first_of('#'); if(pos != std::string::npos) line.erase(pos); TRIM_STRING(line); if(line.length() == 0) continue; // Split into key = val std::string key(""), val(""); pos = line.find_first_of('='); if(pos != std::string::npos && line.length() > (pos + 1)) { key = line.substr(0, pos); val = line.substr(pos + 1); TRIM_STRING(key); TRIM_STRING(val); } // Fail if we don't get a key and val if(key.length() == 0 || val.length() == 0) { logError("Config(%s): Line %zd: No key value pair found\n", path, line_number); return false; } // Set a config setting for the current K=V if(!setSetting(key.c_str(), val.c_str())) { logError("Config(%s):L%zd: Failed to set '%s' to '%s'\n", path, line_number, key.c_str(), val.c_str()); return false; } } return true; }
bool ConfigSettings::readSettings(const char* path) { std::ifstream config(path); std::string line; size_t line_number = 0; if(!config.good()) return false; while(config.good()) { size_t pos = std::string::npos; std::getline(config, line); line_number += 1; // De-comment and trim, skipping anything that shows up empty pos = line.find_first_of('#'); if(pos != std::string::npos) line.erase(pos); TRIM_STRING(line); if(line.length() == 0) continue; // Split into key = val std::string key(""), val(""); pos = line.find_first_of('='); if(pos != std::string::npos && line.length() > (pos + 1)) { key = line.substr(0, pos); val = line.substr(pos + 1); TRIM_STRING(key); TRIM_STRING(val); } // Are we about to read a multiline string? if(val == CONFIG_MULTILINE_SEPARATOR) { val = ""; bool done_multiline = false; while(config.good() && !done_multiline) { std::getline(config, line); line_number += 1; // We RTRIM the line for two reasons: // // 1) Make sure that a direct == comparison with '"""' works without // worrying about trailing space. // 2) Nobody likes trailing whitespace anyway RTRIM_STRING(line); // Either accumuliate or terminate if(line == CONFIG_MULTILINE_SEPARATOR) { done_multiline = true; // Make sure we don't add an extra trailing newline // to the parsed value RTRIM_STRING(val); } else { line += "\n"; val += line; } } // If we drop out but didn't finish reading, something failed if(!done_multiline) { cura::logError("Config(%s):L%zd: Failed while reading multiline string.\n", path, line_number); return false; } } // Fail if we don't get a key and val if(key.length() == 0 || val.length() == 0) { cura::logError("Config(%s): Line %zd: No key value pair found\n", path, line_number); return false; } // Set a config setting for the current K=V if(!setSetting(key.c_str(), val.c_str())) { cura::logError("Config(%s):L%zd: Failed to set '%s' to '%s'\n", path, line_number, key.c_str(), val.c_str()); return false; } } return true; }