return token_;
}
-prefix_ senf::console::ArgumentToken::ArgumentToken(std::string token)
- : token_ (token)
+prefix_ senf::console::ArgumentToken::TokenType senf::console::ArgumentToken::type()
+ const
+{
+ return type_;
+}
+
+prefix_ bool senf::console::ArgumentToken::is(unsigned tokens)
+ const
+{
+ return tokens & type_;
+}
+
+prefix_ senf::console::ArgumentToken::ArgumentToken(TokenType type, std::string token)
+ : type_(type), token_ (token)
{}
///////////////////////////////////////////////////////////////////////////
// senf::console::ParseCommandInfo
-prefix_ std::string const & senf::console::ParseCommandInfo::commandPath()
+prefix_ senf::console::ParseCommandInfo::BuiltinCommand
+senf::console::ParseCommandInfo::builtin()
const
{
- return commandPath_;
+ return builtin_;
}
-prefix_ senf::console::ParseCommandInfo::size_type senf::console::ParseCommandInfo::arguments()
+prefix_ senf::console::ParseCommandInfo::CommandPathRange
+senf::console::ParseCommandInfo::commandPath()
const
{
- return arguments_.size();
+ return boost::make_iterator_range(commandPath_.begin(), commandPath_.end());
}
-prefix_ senf::console::ParseCommandInfo::argument_iterator
-senf::console::ParseCommandInfo::begin_arguments()
+prefix_ senf::console::ParseCommandInfo::ArgumentsRange
+senf::console::ParseCommandInfo::arguments()
const
{
- return arguments_.begin();
+ return boost::make_iterator_range( ArgumentIterator(tokens_.begin()),
+ ArgumentIterator(tokens_.end()) );
}
-prefix_ senf::console::ParseCommandInfo::argument_iterator
-senf::console::ParseCommandInfo::end_arguments()
+prefix_ senf::console::ParseCommandInfo::TokensRange senf::console::ParseCommandInfo::tokens()
const
{
- return arguments_.end();
+ return boost::make_iterator_range(tokens_.begin(), tokens_.end());
+}
+
+////////////////////////////////////////
+// private members
+
+prefix_ void senf::console::ParseCommandInfo::init()
+{
+ builtin_ = NoBuiltin;
+ commandPath_.clear();
+ tokens_.clear();
+}
+
+prefix_ void senf::console::ParseCommandInfo::setBuiltin(BuiltinCommand builtin)
+{
+ builtin_ = builtin;
+}
+
+prefix_ void
+senf::console::ParseCommandInfo::setCommand(std::vector<std::string> & commandPath)
+{
+ commandPath_.clear();
+ commandPath_.swap(commandPath);
+}
+
+prefix_ void senf::console::ParseCommandInfo::addToken(ArgumentToken const & token)
+{
+ tokens_.push_back(token);
}
-prefix_ senf::console::ParseCommandInfo::size_type senf::console::ParseCommandInfo::tokens()
+///////////////////////////////////////////////////////////////////////////
+// senf::console::ParseCommandInfo::ArgumentIterator
+
+prefix_ senf::console::ParseCommandInfo::ArgumentIterator::ArgumentIterator()
+{}
+
+prefix_ senf::console::ParseCommandInfo::ArgumentIterator::
+ArgumentIterator(ParseCommandInfo::TokensRange::iterator i)
+ : b_(i), e_(i)
+{}
+
+prefix_ senf::console::ParseCommandInfo::ArgumentIterator::reference
+senf::console::ParseCommandInfo::ArgumentIterator::dereference()
const
{
- return tokens_.size();
+ if (b_ == e_) setRange();
+ return b_->is(ArgumentToken::ArgumentGroupOpen)
+ ? boost::make_iterator_range(boost::next(b_), boost::prior(e_))
+ : boost::make_iterator_range(b_, e_);
}
-prefix_ senf::console::ParseCommandInfo::token_iterator
-senf::console::ParseCommandInfo::begin_tokens()
+prefix_ bool
+senf::console::ParseCommandInfo::ArgumentIterator::equal(ArgumentIterator const & other)
const
{
- return tokens_.begin();
+ return b_ == other.b_;
+}
+
+prefix_ void senf::console::ParseCommandInfo::ArgumentIterator::increment()
+{
+ if (b_ == e_) setRange();
+ b_ = e_;
+}
+
+///////////////////////////////////////////////////////////////////////////
+
+prefix_ senf::console::CheckedArgumentIteratorWrapper::
+CheckedArgumentIteratorWrapper(ParseCommandInfo::ArgumentsRange const & range,
+ std::string const & msg)
+ : i_ (range.begin()), e_ (range.end()), msg_ (msg)
+{}
+
+prefix_ senf::console::CheckedArgumentIteratorWrapper::
+CheckedArgumentIteratorWrapper(ParseCommandInfo::TokensRange const & range,
+ std::string const & msg)
+ : i_ (range.begin()), e_ (range.end()), msg_ (msg)
+{}
+
+prefix_ senf::console::CheckedArgumentIteratorWrapper::~CheckedArgumentIteratorWrapper()
+{
+ if (i_ != e_ && ! std::uncaught_exception())
+ throw SyntaxErrorException(msg_);
+}
+
+prefix_ senf::console::CheckedArgumentIteratorWrapper::operator ParseCommandInfo::ArgumentIterator()
+{
+ return i_;
}
-prefix_ senf::console::ParseCommandInfo::token_iterator
-senf::console::ParseCommandInfo::end_tokens()
+prefix_ bool senf::console::CheckedArgumentIteratorWrapper::boolean_test()
const
{
- return tokens_.end();
+ return i_ != e_;
}
-////////////////////////////////////////
-// private members
+prefix_ bool senf::console::CheckedArgumentIteratorWrapper::done()
+ const
+{
+ return i_ == e_;
+}
-prefix_ void senf::console::ParseCommandInfo::init()
+prefix_ void senf::console::CheckedArgumentIteratorWrapper::clear()
{
- commandPath_ = "";
- tokens_.clear();
- arguments_.clear();
- tempArguments_.clear();
+ i_ = e_;
}
-prefix_ void senf::console::ParseCommandInfo::setCommand(std::string const & commandPath)
+prefix_ senf::console::CheckedArgumentIteratorWrapper::reference
+senf::console::CheckedArgumentIteratorWrapper::dereference()
+ const
{
- commandPath_ = commandPath;
+ if (i_ == e_)
+ throw SyntaxErrorException(msg_);
+ return *i_;
}
-prefix_ void senf::console::ParseCommandInfo::startArgument()
+prefix_ void senf::console::CheckedArgumentIteratorWrapper::increment()
{
- tempArguments_.push_back( TempArgumentRange( tokens_.size(), tokens_.size() ) );
+ if (i_ == e_)
+ throw SyntaxErrorException(msg_);
+ ++ i_;
}
-prefix_ void senf::console::ParseCommandInfo::endArgument()
+prefix_ bool senf::console::CheckedArgumentIteratorWrapper::
+operator==(ParseCommandInfo::ArgumentIterator const & other)
+ const
{
- tempArguments_.back().second = tokens_.size();
+ return i_ == other;
}
-prefix_ void senf::console::ParseCommandInfo::addToken(ArgumentToken const & token)
+prefix_ bool senf::console::CheckedArgumentIteratorWrapper::
+operator!=(ParseCommandInfo::ArgumentIterator const & other)
+ const
{
- tokens_.push_back(token);
+ return i_ != other;
+}
+
+prefix_ senf::console::ParseCommandInfo::ArgumentIterator
+senf::console::CheckedArgumentIteratorWrapper::operator++(int)
+{
+ ParseCommandInfo::ArgumentIterator i (i_);
+ increment();
+ return i;
}
///////////////////////////////////////////////////////////////////////////
// senf::console::SingleCommandParser
-prefix_ senf::console::SingleCommandParser::Impl & senf::console::SingleCommandParser::impl()
+prefix_ senf::console::CommandParser::Impl & senf::console::CommandParser::impl()
{
SENF_ASSERT(impl_);
return *impl_;