diff --git a/opm/parser/eclipse/Parser/ParserKeyword.cpp b/opm/parser/eclipse/Parser/ParserKeyword.cpp index 52867e69d..486c390e5 100644 --- a/opm/parser/eclipse/Parser/ParserKeyword.cpp +++ b/opm/parser/eclipse/Parser/ParserKeyword.cpp @@ -146,6 +146,27 @@ namespace Opm { initSizeKeyword(sizeKeyword, sizeItem); } + + bool ParserKeyword::wildCardName(const std::string& name) { + if (name.length() > ParserConst::maxKeywordLength) + return false; + + if (!isupper(name[0])) + return false; + + for (unsigned int i = 1; i < name.length(); i++) { + char c = name[i]; + if (!(isupper(c) || isdigit(c))) { + if ((i == (name.length() - 1)) && (c == '*')) + return true; + else + return false; + } + } + return false; + } + + bool ParserKeyword::validName(const std::string& name) { if (name.length() > ParserConst::maxKeywordLength) return false; @@ -155,8 +176,8 @@ namespace Opm { for (unsigned int i = 1; i < name.length(); i++) { char c = name[i]; - if (!(isupper(c) || isdigit(c))) - return false; + if (!(isupper(c) || isdigit(c))) + return wildCardName(name); } return true; } @@ -318,6 +339,20 @@ namespace Opm { return m_isDataKeyword; } + + bool ParserKeyword::matches(const std::string& keyword) const { + size_t cmpLength = m_name.find('*'); + if (cmpLength == std::string::npos) + return (keyword == m_name); + else { + if (keyword.length() < cmpLength) + return false; + + return (m_name.compare( 0 , cmpLength , keyword , 0 , cmpLength) == 0); + } + } + + bool ParserKeyword::equal(const ParserKeyword& other) const { if ((m_name == other.m_name) && (m_record->equal(*(other.m_record))) && diff --git a/opm/parser/eclipse/Parser/ParserKeyword.hpp b/opm/parser/eclipse/Parser/ParserKeyword.hpp index 117202f81..966a932bb 100644 --- a/opm/parser/eclipse/Parser/ParserKeyword.hpp +++ b/opm/parser/eclipse/Parser/ParserKeyword.hpp @@ -42,7 +42,9 @@ namespace Opm { ParserKeyword(const Json::JsonObject& jsonConfig); static bool validName(const std::string& name); - + static bool wildCardName(const std::string& name); + bool matches(const std::string& keyword) const; + ParserRecordPtr getRecord() const; const std::string& getName() const; ParserKeywordActionEnum getAction() const; diff --git a/opm/parser/eclipse/Parser/tests/ParserKeywordTests.cpp b/opm/parser/eclipse/Parser/tests/ParserKeywordTests.cpp index f42e9d1a1..be38ec4c4 100644 --- a/opm/parser/eclipse/Parser/tests/ParserKeywordTests.cpp +++ b/opm/parser/eclipse/Parser/tests/ParserKeywordTests.cpp @@ -67,6 +67,16 @@ BOOST_AUTO_TEST_CASE(ParserKeyword_withOtherSize_SizeTypeOTHER) { +BOOST_AUTO_TEST_CASE(ParserKeyword_wildCardName) { + BOOST_CHECK_EQUAL( true , ParserKeyword::wildCardName("SUM*")); + BOOST_CHECK_EQUAL( false , ParserKeyword::wildCardName("SUM*X")); + BOOST_CHECK_EQUAL( false , ParserKeyword::wildCardName("sUM*")); + BOOST_CHECK_EQUAL( false , ParserKeyword::wildCardName("5UM*")); + BOOST_CHECK_EQUAL( true , ParserKeyword::wildCardName("U5M*")); + BOOST_CHECK_EQUAL( false , ParserKeyword::wildCardName("ABCDEFGH*")); +} + + BOOST_AUTO_TEST_CASE(ParserKeyword_validName) { BOOST_CHECK_EQUAL( true , ParserKeyword::validName("SUMMARY")); BOOST_CHECK_EQUAL( false , ParserKeyword::validName("MixeCase")); @@ -75,6 +85,19 @@ BOOST_AUTO_TEST_CASE(ParserKeyword_validName) { BOOST_CHECK_EQUAL( false , ParserKeyword::validName("88STRING")); BOOST_CHECK_EQUAL( false , ParserKeyword::validName("KEY.EXT")); BOOST_CHECK_EQUAL( false , ParserKeyword::validName("STRING~")); + + BOOST_CHECK_EQUAL( true , ParserKeyword::validName("TVDP*")); + BOOST_CHECK_EQUAL( false , ParserKeyword::validName("*")); +} + + +BOOST_AUTO_TEST_CASE(ParserKeywordMathces) { + ParserKeyword parserKeyword("TVDP*" , (size_t) 1); + BOOST_CHECK_EQUAL( true , parserKeyword.matches("TVDP")); + BOOST_CHECK_EQUAL( true , parserKeyword.matches("TVDPX")); + BOOST_CHECK_EQUAL( true , parserKeyword.matches("TVDPXY")); + BOOST_CHECK_EQUAL( false , parserKeyword.matches("TVD")); + BOOST_CHECK_EQUAL( false , parserKeyword.matches("ATVDP")); }