From dbd4d15144c727f967911d41d798758bfb9bad03 Mon Sep 17 00:00:00 2001 From: Markus Mittendrein Date: Thu, 8 Oct 2015 14:04:04 +0200 Subject: Add config get and config set commands and a -= config syntax to remove elements from a list or map (by key) --- src/CRSMConfig.cpp | 122 +++++++++++++++++++++++++++++++++++++---------------- 1 file changed, 86 insertions(+), 36 deletions(-) (limited to 'src/CRSMConfig.cpp') diff --git a/src/CRSMConfig.cpp b/src/CRSMConfig.cpp index 54b0e8f..5ec0f9b 100644 --- a/src/CRSMConfig.cpp +++ b/src/CRSMConfig.cpp @@ -13,6 +13,44 @@ void CRSMConfigBase::setConfigValue(const QString &name, const QString &value) configValue.setValue(value); } +QString CRSMConfigBase::getConfigValueLine(const QString &name) +{ + if(configValues.contains(name)) + { + CRSMConfigValueBase& value = *configValues[name]; + switch(value.type()) + { + case CRSMConfigValueType::Map: + { + QString ret; + const QMap& values = (dynamic_cast(&value))->getValues(); + foreach(const QString& mapKey, values.keys()) + { + ret += name + "[" + mapKey + "]" + " = " + values.value(mapKey) + "\n"; + } + return ret; + break; + } + case CRSMConfigValueType::List: + { + QString ret; + foreach(const QString& val, (dynamic_cast(&value))->getValues()) + { + ret += name + " += " + val + "\n"; + } + return ret; + break; + } + default: + return name + " = " + value.value() + "\n"; + } + } + else + { + throw CRSMConfigException("Unknown config value \"" + name.toStdString() + "\""); + } +} + void CRSMConfigBase::addConfigListEntry(const QString &name, const QString &value) { CRSMConfigValueBase& configValue = getConfigValue(name); @@ -23,6 +61,23 @@ void CRSMConfigBase::addConfigListEntry(const QString &name, const QString &valu ((CRSMConfigValueList*)&configValue)->append(value); } +void CRSMConfigBase::removeConfigMapListEntry(const QString &name, const QString &value) +{ + CRSMConfigValueBase& configValue = getConfigValue(name); + if(configValue.type() == CRSMConfigValueType::List) + { + ((CRSMConfigValueList*)&configValue)->remove(value); + } + else if(configValue.type() == CRSMConfigValueType::Map) + { + ((CRSMConfigValueMap*)&configValue)->remove(value); + } + else + { + throw CRSMConfigException("Cannot remove a list entry from a value which is neither a list nor a map \"" + name.toStdString() + "\""); + } +} + void CRSMConfigBase::setConfigMapValue(const QString &name, const QString &key, const QString &value) { CRSMConfigValueBase& configValue = getConfigValue(name); @@ -70,27 +125,13 @@ QString CRSMConfigBase::read(const QString &fileName, bool writeDefault) } else if(config.open(QIODevice::ReadOnly | QIODevice::Text)) { - static QRegExp valueExp(R"(^([^=]+)=(.*)$)"); - static QRegExp listExp(R"(^([^=]+)\+=(.*)$)"); - static QRegExp mapExp(R"(^([^\[]+)\[([^\]]+)\]\s*=\s*(.*)$)"); QString line; for(size_t lineNr = 1; !config.atEnd(); ++lineNr) { try { line = config.readLine().trimmed(); - if(listExp.exactMatch(line)) - { - addConfigListEntry(listExp.cap(1).trimmed(), listExp.cap(2).trimmed()); - } - else if(mapExp.exactMatch(line)) - { - setConfigMapValue(mapExp.cap(1).trimmed(), mapExp.cap(2).trimmed(), mapExp.cap(3).trimmed()); - } - else if(valueExp.exactMatch(line)) - { - setConfigValue(valueExp.cap(1).trimmed(), valueExp.cap(2).trimmed()); - } + setConfigLine(line); } catch(CRSMConfigException e) { @@ -113,27 +154,7 @@ bool CRSMConfigBase::write(const QString &fileName) { foreach(const QString& key, configValues.keys()) { - CRSMConfigValueBase& value = *configValues[key]; - switch(value.type()) - { - case CRSMConfigValueType::Map: - { - const QMap values = (dynamic_cast(&value))->getValues(); - foreach(const QString& mapKey, values.keys()) - { - config.write(QString(key + "[" + mapKey + "]" + " = " + values.value(mapKey) + "\n").toUtf8()); - } - break; - } - case CRSMConfigValueType::List: - foreach(const QString& val, (dynamic_cast(&value))->getValues()) - { - config.write(QString(key + " += " + val + "\n").toUtf8()); - } - break; - default: - config.write(QString(key + " = " + value.value() + "\n").toUtf8()); - } + config.write(getConfigValueLine(key).toUtf8()); } return true; @@ -144,6 +165,35 @@ bool CRSMConfigBase::write(const QString &fileName) } } +void CRSMConfigBase::setConfigLine(const QString &line) +{ + static QRegExp valueExp(R"(^([^=]+)=(.*)$)"); + static QRegExp listExp(R"(^([^=]+)\+=(.*)$)"); + static QRegExp listMapRemoveExp(R"(^([^=]+)\-=(.*)$)"); + static QRegExp mapExp(R"(^([^\[]+)\[([^\]]+)\]\s*=\s*(.*)$)"); + + if(listExp.exactMatch(line)) + { + addConfigListEntry(listExp.cap(1).trimmed(), listExp.cap(2).trimmed()); + } + else if(listMapRemoveExp.exactMatch(line)) + { + removeConfigMapListEntry(listMapRemoveExp.cap(1).trimmed(), listMapRemoveExp.cap(2).trimmed()); + } + else if(mapExp.exactMatch(line)) + { + setConfigMapValue(mapExp.cap(1).trimmed(), mapExp.cap(2).trimmed(), mapExp.cap(3).trimmed()); + } + else if(valueExp.exactMatch(line)) + { + setConfigValue(valueExp.cap(1).trimmed(), valueExp.cap(2).trimmed()); + } + else + { + throw CRSMConfigException("Syntax error: unkown syntax"); + } +} + void CRSMConfig::clear() { auto configVals = configValues; -- cgit v1.2.3-54-g00ecf