diff options
Diffstat (limited to 'src')
| -rw-r--r-- | src/ConfigBase.cpp | 18 | ||||
| -rw-r--r-- | src/Util.cpp | 68 | ||||
| -rw-r--r-- | src/Util.hpp | 2 |
3 files changed, 77 insertions, 11 deletions
diff --git a/src/ConfigBase.cpp b/src/ConfigBase.cpp index d895e80..9f62d77 100644 --- a/src/ConfigBase.cpp +++ b/src/ConfigBase.cpp @@ -10,7 +10,7 @@ void ConfigBase::addConfigValue(QString name, ConfigValueBase* value) void ConfigBase::setConfigValue(const QString &name, const QString &value) { ConfigValueBase& configValue = getConfigValue(name); - configValue.setValue(value); + configValue.setValue(Util::unescape(value)); } QString ConfigBase::getConfigValueLine(const QString &name) @@ -26,7 +26,7 @@ QString ConfigBase::getConfigValueLine(const QString &name) const QMap<QString, QString>& values = (dynamic_cast<ConfigValueMap*>(&value))->getValues(); foreach(const QString& mapKey, values.keys()) { - ret += name + "[" + mapKey + "]" + " = " + values.value(mapKey) + "\n"; + ret += name + "[" + Util::escape(mapKey, '\\', "]") + "]" + " = " + Util::escape(values.value(mapKey)) + "\n"; } return ret; break; @@ -36,13 +36,13 @@ QString ConfigBase::getConfigValueLine(const QString &name) QString ret; foreach(const QString& val, (dynamic_cast<ConfigValueList*>(&value))->getValues()) { - ret += name + " += " + val + "\n"; + ret += name + " += " + Util::escape(val) + "\n"; } return ret; break; } default: - return name + " = " + value.value() + "\n"; + return name + " = " + Util::escape(value.value()) + "\n"; } } else @@ -58,7 +58,7 @@ void ConfigBase::addConfigListEntry(const QString &name, const QString &value) { throw ConfigException("Cannot add a list entry to a non-list-config value \"" + name.toStdString() + "\""); } - ((ConfigValueList*)&configValue)->append(value); + ((ConfigValueList*)&configValue)->append(Util::unescape(value)); } void ConfigBase::removeConfigMapListEntry(const QString &name, const QString &value) @@ -66,11 +66,11 @@ void ConfigBase::removeConfigMapListEntry(const QString &name, const QString &va ConfigValueBase& configValue = getConfigValue(name); if(configValue.type() == ConfigValueType::List) { - ((ConfigValueList*)&configValue)->remove(value); + ((ConfigValueList*)&configValue)->remove(Util::unescape(value)); } else if(configValue.type() == ConfigValueType::Map) { - ((ConfigValueMap*)&configValue)->remove(value); + ((ConfigValueMap*)&configValue)->remove(Util::unescape(value)); } else { @@ -85,7 +85,7 @@ void ConfigBase::setConfigMapValue(const QString &name, const QString &key, cons { throw ConfigException("Cannot set a map value on a non-map-config value \"" + name.toStdString() + "\""); } - ((ConfigValueMap*)&configValue)->setKeyValue(key, value); + ((ConfigValueMap*)&configValue)->setKeyValue(Util::unescape(key), Util::unescape(value)); } ConfigValueBase& ConfigBase::getConfigValue(const QString& name) @@ -170,7 +170,7 @@ void ConfigBase::setConfigLine(const QString &line) static QRegExp valueExp(R"(^([^=]+)=(.*)$)"); static QRegExp listExp(R"(^([^=]+)\+=(.*)$)"); static QRegExp listMapRemoveExp(R"(^([^=]+)\-=(.*)$)"); - static QRegExp mapExp(R"(^([^\[]+)\[([^\]]+)\]\s*=\s*(.*)$)"); + static QRegExp mapExp(R"(^([^\[]+)\[((?:[^\]\\]|\\\]|\\\\)+)\]\s*=\s*(.*)$)"); if(listExp.exactMatch(line)) { diff --git a/src/Util.cpp b/src/Util.cpp index 78dd8d2..8b5bc67 100644 --- a/src/Util.cpp +++ b/src/Util.cpp @@ -15,8 +15,72 @@ namespace Util { return string; } - QString& trimQuotes(const QString& string, bool& trimmed) + QString unescape(const QString &string, const QChar escapeChar) { - return trimQuotes(QString(string), trimmed); + if(string.isEmpty()) return string; + QString ret; + bool escaped = false; + QChar c = string.at(0); + for(int i = 0; i < string.length(); ++i) + { + c = string.at(i); + if(!escaped) + { + if(c == escapeChar) + { + escaped = true; + continue; + } + else + { + ret.append(c); + } + } + else + { + if(unescapeChars.contains(c)) + { + ret.append(unescapeChars.value(c)); + } + else + { + ret.append(c); + } + escaped = false; + } + } + if(escaped) + { + ret.append(escapeChar); + } + return ret; } + + QString escape(const QString &string, const QChar escapeChar, const QString &escapeChars) + { + QString ret; + + for(int i = 0; i < string.length(); ++i) + { + QChar c = string.at(i); + + if(escapeChars.contains(c)) + { + ret.append(escapeChar); + ret.append(c); + } + else if(unescapeChars.values().contains(c)) + { + ret.append(unescapeChars.key(c)); + } + else + { + ret.append(c); + } + } + + return ret; + } + + } diff --git a/src/Util.hpp b/src/Util.hpp index 5826b1b..ffd2fa3 100644 --- a/src/Util.hpp +++ b/src/Util.hpp @@ -9,4 +9,6 @@ namespace Util { }; QString trimQuotes(QString string, bool& trimmed); + QString unescape(const QString& string, const QChar escapeChar = '\\'); + QString escape(const QString& string, const QChar escapeChar = '\\', const QString& escapeChars = ""); } |
