From bec5746fddcd5097f6b75d887c193a60a491af42 Mon Sep 17 00:00:00 2001 From: Capostrophic Date: Thu, 26 Mar 2020 23:30:08 +0300 Subject: [PATCH] Improve blank line handling in settings writer (bug #5326) --- CHANGELOG.md | 1 + components/settings/parser.cpp | 42 +++++++++++++++++++++++++--------- 2 files changed, 32 insertions(+), 11 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 0101587fab..985c49c093 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -207,6 +207,7 @@ Bug #5300: NPCs don't switch from torch to shield when starting combat Bug #5308: World map copying makes save loading much slower Bug #5313: Node properties of identical type are not applied in the correct order + Bug #5326: Formatting issues in the settings.cfg Bug #5328: Skills aren't properly reset for dead actors Feature #1774: Handle AvoidNode Feature #2229: Improve pathfinding AI diff --git a/components/settings/parser.cpp b/components/settings/parser.cpp index e256da0d6e..1dcb0fd8d6 100644 --- a/components/settings/parser.cpp +++ b/components/settings/parser.cpp @@ -77,6 +77,9 @@ void Settings::SettingsFileParser::saveSettingsFile(const std::string& file, con // Were there any lines at all in the file? bool existing = false; + // Is an entirely blank line queued to be added? + bool emptyLineQueued = false; + // The category/section we're currently in. std::string currentCategory; @@ -103,9 +106,19 @@ void Settings::SettingsFileParser::saveSettingsFile(const std::string& file, con // Don't add additional newlines at the end of the file. if (istream.eof()) continue; - // Copy entirely blank lines. - if (!skipWhiteSpace(i, line)) { - ostream << line << std::endl; + // An empty line was queued. + if (emptyLineQueued) + { + emptyLineQueued = false; + // We're still going through the current category, so we should copy it. + if (currentCategory.empty() || line[i] != '[') + ostream << std::endl; + } + + // Queue entirely blank lines to add them if desired. + if (!skipWhiteSpace(i, line)) + { + emptyLineQueued = true; continue; } @@ -128,15 +141,22 @@ void Settings::SettingsFileParser::saveSettingsFile(const std::string& file, con continue; } - // Ensure that all options in the current category have been written. - for (CategorySettingStatusMap::iterator mit = written.begin(); mit != written.end(); ++mit) { - if (mit->second == false && mit->first.first == currentCategory) { - Log(Debug::Verbose) << "Added new setting: [" << currentCategory << "] " - << mit->first.second << " = " << settings.at(mit->first); - ostream << mit->first.second << " = " << settings.at(mit->first) << std::endl; - mit->second = true; - changed = true; + if (!currentCategory.empty()) + { + // Ensure that all options in the current category have been written. + for (CategorySettingStatusMap::iterator mit = written.begin(); mit != written.end(); ++mit) + { + if (mit->second == false && mit->first.first == currentCategory) + { + Log(Debug::Verbose) << "Added new setting: [" << currentCategory << "] " + << mit->first.second << " = " << settings.at(mit->first); + ostream << mit->first.second << " = " << settings.at(mit->first) << std::endl; + mit->second = true; + changed = true; + } } + // Add an empty line after the last option in a category. + ostream << std::endl; } // Update the current category.