diff options
| -rw-r--r-- | qpid/cpp/src/qpid/broker/Selector.cpp | 5 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/SelectorExpression.cpp | 12 | ||||
| -rw-r--r-- | qpid/cpp/src/qpid/broker/SelectorToken.cpp | 11 | ||||
| -rw-r--r-- | qpid/cpp/src/tests/Selector.cpp | 3 |
4 files changed, 15 insertions, 16 deletions
diff --git a/qpid/cpp/src/qpid/broker/Selector.cpp b/qpid/cpp/src/qpid/broker/Selector.cpp index 5bee0b5714..21247e125c 100644 --- a/qpid/cpp/src/qpid/broker/Selector.cpp +++ b/qpid/cpp/src/qpid/broker/Selector.cpp @@ -229,13 +229,8 @@ bool Selector::filter(const Message& msg) return eval(env); } -namespace { -const boost::shared_ptr<Selector> NULL_SELECTOR = boost::shared_ptr<Selector>(); -} - boost::shared_ptr<Selector> returnSelector(const string& e) { - if (e.empty()) return NULL_SELECTOR; return boost::shared_ptr<Selector>(new Selector(e)); } diff --git a/qpid/cpp/src/qpid/broker/SelectorExpression.cpp b/qpid/cpp/src/qpid/broker/SelectorExpression.cpp index 4efb91acf8..8b74ac4667 100644 --- a/qpid/cpp/src/qpid/broker/SelectorExpression.cpp +++ b/qpid/cpp/src/qpid/broker/SelectorExpression.cpp @@ -728,6 +728,16 @@ friend TopExpression* TopExpression::parse(const string&); string error; +Expression* selectorExpression(Tokeniser& tokeniser) +{ + if ( tokeniser.nextToken().type==T_EOS ) { + return (new Literal(true)); + } + tokeniser.returnTokens(); + std::auto_ptr<Expression> e(orExpression(tokeniser)); + return e.release(); +} + Expression* orExpression(Tokeniser& tokeniser) { std::auto_ptr<Expression> e(andExpression(tokeniser)); @@ -991,7 +1001,7 @@ TopExpression* TopExpression::parse(const string& exp) string::const_iterator e = exp.end(); Tokeniser tokeniser(s,e); Parse parse; - std::auto_ptr<Expression> b(parse.orExpression(tokeniser)); + std::auto_ptr<Expression> b(parse.selectorExpression(tokeniser)); if (!b.get()) { throwParseError(tokeniser, parse.error); } diff --git a/qpid/cpp/src/qpid/broker/SelectorToken.cpp b/qpid/cpp/src/qpid/broker/SelectorToken.cpp index eb56833178..d69267b2e5 100644 --- a/qpid/cpp/src/qpid/broker/SelectorToken.cpp +++ b/qpid/cpp/src/qpid/broker/SelectorToken.cpp @@ -44,14 +44,6 @@ TokenException::TokenException(const std::string& msg) : range_error(msg) {} -// Not much of a parser... -void skipWS(std::string::const_iterator& s, std::string::const_iterator& e) -{ - while ( s!=e && std::isspace(*s) ) { - ++s; - } -} - // Lexically, reserved words are a subset of identifiers // so we parse an identifier first then check if it is a reserved word and // convert it if it is a reserved word @@ -173,6 +165,7 @@ bool tokenise(std::string::const_iterator& s, std::string::const_iterator& e, To switch (state) { case START: if (t==e) {tok = Token(T_EOS, s, END); return true;} + else if (std::isspace(*t)) {++t; ++s; continue;} else switch (*t) { case '(': tokType = T_LPAREN; state = ACCEPT_INC; continue; case ')': tokType = T_RPAREN; state = ACCEPT_INC; continue; @@ -281,8 +274,6 @@ const Token& Tokeniser::nextToken() // Don't extend stream of tokens further than the end of stream; if ( tokp>0 && tokens[tokp-1].type==T_EOS ) return tokens[tokp-1]; - skipWS(inp, inEnd); - tokens.push_back(Token()); Token& tok = tokens[tokp++]; diff --git a/qpid/cpp/src/tests/Selector.cpp b/qpid/cpp/src/tests/Selector.cpp index 23c192bc63..73af1a9623 100644 --- a/qpid/cpp/src/tests/Selector.cpp +++ b/qpid/cpp/src/tests/Selector.cpp @@ -151,6 +151,7 @@ void verifyTokeniserFail(TokeniseF t, const char* c) { QPID_AUTO_TEST_CASE(tokeniseSuccess) { verifyTokeniserSuccess(&tokenise, "", qb::T_EOS, "", ""); + verifyTokeniserSuccess(&tokenise, " ", qb::T_EOS, "", ""); verifyTokeniserSuccess(&tokenise, "null_123+blah", qb::T_IDENTIFIER, "null_123", "+blah"); verifyTokeniserSuccess(&tokenise, "\"null-123\"+blah", qb::T_IDENTIFIER, "null-123", "+blah"); verifyTokeniserSuccess(&tokenise, "\"This is an \"\"odd!\"\" identifier\"+blah", qb::T_IDENTIFIER, "This is an \"odd!\" identifier", "+blah"); @@ -344,6 +345,8 @@ QPID_AUTO_TEST_CASE(simpleEval) env.set("A", "Bye, bye cruel world"); env.set("B", "hello kitty"); + BOOST_CHECK(qb::Selector("").eval(env)); + BOOST_CHECK(qb::Selector(" ").eval(env)); BOOST_CHECK(qb::Selector("A is not null").eval(env)); BOOST_CHECK(!qb::Selector("A is null").eval(env)); BOOST_CHECK(!qb::Selector("A = C").eval(env)); |
