[Base/Core] Work on config/cvars. Properly escape string values when saving config.

This commit is contained in:
gibbed
2019-08-04 07:09:05 -05:00
parent 82f85c98f0
commit bee55ce5bb
3 changed files with 185 additions and 49 deletions

View File

@@ -43,10 +43,10 @@ std::shared_ptr<cpptoml::table> ParseConfig(const std::wstring& config_path) {
void ReadConfig(const std::wstring& file_path) {
const auto config = ParseConfig(file_path);
for (auto& it : *cvar::ConfigVars) {
auto configVar = static_cast<cvar::IConfigVar*>(it.second);
auto configKey = configVar->category() + "." + configVar->name();
if (config->contains_qualified(configKey)) {
configVar->LoadConfigValue(config->get_qualified(configKey));
auto config_var = static_cast<cvar::IConfigVar*>(it.second);
auto config_key = config_var->category() + "." + config_var->name();
if (config->contains_qualified(config_key)) {
config_var->LoadConfigValue(config->get_qualified(config_key));
}
}
XELOGI("Loaded config: %S", file_path.c_str());
@@ -55,10 +55,10 @@ void ReadConfig(const std::wstring& file_path) {
void ReadGameConfig(std::wstring file_path) {
const auto config = ParseConfig(file_path);
for (auto& it : *cvar::ConfigVars) {
auto configVar = static_cast<cvar::IConfigVar*>(it.second);
auto configKey = configVar->category() + "." + configVar->name();
if (config->contains_qualified(configKey)) {
configVar->LoadGameConfigValue(config->get_qualified(configKey));
auto config_var = static_cast<cvar::IConfigVar*>(it.second);
auto config_key = config_var->category() + "." + config_var->name();
if (config->contains_qualified(config_key)) {
config_var->LoadGameConfigValue(config->get_qualified(config_key));
}
}
XELOGI("Loaded game config: %S", file_path.c_str());
@@ -71,22 +71,36 @@ void SaveConfig() {
// we use our own write logic because cpptoml doesn't
// allow us to specify comments :(
std::ostringstream output;
std::string lastCategory;
for (auto configVar : vars) {
if (configVar->is_transient()) {
std::string last_category;
for (auto config_var : vars) {
if (config_var->is_transient()) {
continue;
}
if (lastCategory != configVar->category()) {
if (!lastCategory.empty()) {
if (last_category != config_var->category()) {
if (!last_category.empty()) {
output << std::endl;
}
lastCategory = configVar->category();
output << xe::format_string("[%s]\n", lastCategory.c_str());
last_category = config_var->category();
output << xe::format_string("[%s]\n", last_category.c_str());
}
output << std::left << std::setw(40) << std::setfill(' ')
<< xe::format_string("%s = %s", configVar->name().c_str(),
configVar->config_value().c_str());
output << xe::format_string("\t# %s\n", configVar->description().c_str());
auto value = config_var->config_value();
if (value.find('\n') == std::string::npos) {
output << std::left << std::setw(40) << std::setfill(' ')
<< xe::format_string("%s = %s", config_var->name().c_str(),
config_var->config_value().c_str());
} else {
auto lines = xe::split_string(value, "\n");
auto first_it = lines.cbegin();
output << xe::format_string("%s = %s\n", config_var->name().c_str(),
*first_it);
auto last_it = std::prev(lines.cend());
for (auto it = std::next(first_it); it != last_it; ++it) {
output << *it << "\n";
}
output << std::left << std::setw(40) << std::setfill(' ') << *last_it;
}
output << xe::format_string("\t# %s\n", config_var->description().c_str());
}
if (xe::filesystem::PathExists(config_path)) {