Fix: ConfigWriter::EmitScope incorrectly quotes dictionary keys

fixes #12016
This commit is contained in:
Gunnar Beutner 2016-06-22 12:34:11 +02:00
parent 067cb8d283
commit 428850a6b3
2 changed files with 20 additions and 15 deletions

View File

@ -74,7 +74,8 @@ void ConfigWriter::EmitArrayItems(std::ostream& fp, int indentLevel, const Array
}
}
void ConfigWriter::EmitScope(std::ostream& fp, int indentLevel, const Dictionary::Ptr& val, const Array::Ptr& imports)
void ConfigWriter::EmitScope(std::ostream& fp, int indentLevel, const Dictionary::Ptr& val,
const Array::Ptr& imports, bool splitDot)
{
fp << "{";
@ -94,18 +95,21 @@ void ConfigWriter::EmitScope(std::ostream& fp, int indentLevel, const Dictionary
BOOST_FOREACH(const Dictionary::Pair& kv, val) {
fp << "\n";
EmitIndent(fp, indentLevel);
std::vector<String> tokens;
boost::algorithm::split(tokens, kv.first, boost::is_any_of("."));
EmitIdentifier(fp, tokens[0], true);
for (std::vector<String>::size_type i = 1; i < tokens.size(); i++) {
fp << "[";
EmitString(fp, tokens[i]);
fp << "]";
}
if (splitDot) {
std::vector<String> tokens;
boost::algorithm::split(tokens, kv.first, boost::is_any_of("."));
EmitIdentifier(fp, tokens[0], true);
for (std::vector<String>::size_type i = 1; i < tokens.size(); i++) {
fp << "[";
EmitString(fp, tokens[i]);
fp << "]";
}
} else
EmitIdentifier(fp, kv.first, true);
fp << " = ";
EmitValue(fp, indentLevel + 1, kv.second);
}
@ -189,7 +193,7 @@ void ConfigWriter::EmitConfigItem(std::ostream& fp, const String& type, const St
fp << " ignore_on_error";
fp << " ";
EmitScope(fp, 1, attrs, imports);
EmitScope(fp, 1, attrs, imports, true);
}
void ConfigWriter::EmitComment(std::ostream& fp, const String& text)

View File

@ -60,7 +60,8 @@ public:
static void EmitEmpty(std::ostream& fp);
static void EmitArray(std::ostream& fp, int indentLevel, const Array::Ptr& val);
static void EmitArrayItems(std::ostream& fp, int indentLevel, const Array::Ptr& val);
static void EmitScope(std::ostream& fp, int indentLevel, const Dictionary::Ptr& val, const Array::Ptr& imports = Array::Ptr());
static void EmitScope(std::ostream& fp, int indentLevel, const Dictionary::Ptr& val,
const Array::Ptr& imports = Array::Ptr(), bool splitDot = false);
static void EmitValue(std::ostream& fp, int indentLevel, const Value& val);
static void EmitRaw(std::ostream& fp, const String& val);
static void EmitIndent(std::ostream& fp, int indentLevel);