[Base/Core] Work on config/cvars. Properly escape string values when saving config.
This commit is contained in:
@@ -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)) {
|
||||
|
||||
Reference in New Issue
Block a user