#include <cerrno>
#include <sys/stat.h>
#include <boost/iterator/transform_iterator.hpp>
-#include <boost/spirit/iterator/file_iterator.hpp>
-#include <boost/spirit/iterator/position_iterator.hpp>
+#include <senf/config.hh>
+
+#if HAVE_BOOST_SPIRIT_INCLUDE_CLASSIC_HPP
+# include <boost/spirit/include/classic_file_iterator.hpp>
+# include <boost/spirit/include/classic_position_iterator.hpp>
+#else
+# include <boost/spirit/iterator/file_iterator.hpp>
+# include <boost/spirit/iterator/position_iterator.hpp>
+#endif
+
#include <senf/Utils/Exception.hh>
#include <senf/Utils/senfassert.hh>
//#include "Parse.mpp"
#define prefix_
-///////////////////////////////cc.p////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
namespace senf {
namespace console {
}}}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::console::Token
prefix_ senf::console::Token::Token(TokenType type, std::string token,
return os;
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::console::ParseCommandInfo
prefix_ std::ostream & senf::console::operator<<(std::ostream & stream,
return stream;
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::console::ParseCommandInfo::ArgumentIterator
prefix_ void senf::console::ParseCommandInfo::ArgumentIterator::setRange()
}
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// senf::console::CommandParser
#ifndef DOXYGEN
namespace boost {
namespace spirit {
+#if HAVE_BOOST_SPIRIT_INCLUDE_CLASSIC_HPP
+namespace classic {
+#endif
template <>
struct position_policy<senf::console::detail::FilePositionWithIndex>
}
};
+#if HAVE_BOOST_SPIRIT_INCLUDE_CLASSIC_HPP
+}
+#endif
}}
prefix_ senf::console::CommandParser::CommandParser()
prefix_ Iterator senf::console::CommandParser::parseLoop(Iterator npb, Iterator npe,
std::string const & source, Callback cb)
{
- typedef boost::spirit::position_iterator<
+ typedef detail::boost_spirit::position_iterator<
Iterator, detail::FilePositionWithIndex> PositionIterator;
PositionIterator b (npb, npe, source);
PositionIterator e (npe, npe, source);
ParseCommandInfo info;
detail::ParseDispatcher::BindInfo bind (impl().dispatcher, info);
- boost::spirit::parse_info<PositionIterator> result;
+ detail::boost_spirit::parse_info<PositionIterator> result;
for(;;) {
- result = boost::spirit::parse(
+ result = detail::boost_spirit::parse(
b, e, * impl().grammar.use_parser<Impl::Grammar::SkipParser>());
b = result.stop;
if (b == e)
return e.base();
info.clear();
try {
- result = boost::spirit::parse(b, e,
+ result = detail::boost_spirit::parse(b, e,
impl().grammar.use_parser<Impl::Grammar::CommandParser>(),
impl().grammar.use_parser<Impl::Grammar::SkipParser>());
}
- catch (boost::spirit::parser_error<Impl::Grammar::Errors, PositionIterator> & ex) {
+ catch (detail::boost_spirit::parser_error<Impl::Grammar::Errors, PositionIterator> & ex) {
if (impl().grammar.incremental && ex.where == e)
return b.base();
else
throwParserError(ex);
}
// Otherwise the error handling in the parser is broken
- SENF_ASSERT( result.hit );
+ SENF_ASSERT( result.hit, "Internal parser failure (error handling broken?)" );
if (! info.empty())
try {
cb(info);
if (stat( filename.c_str(), &statBuf) != 0)
throw SystemException(filename, errno SENF_EXC_DEBUGINFO);
if (statBuf.st_size == 0) return;
- boost::spirit::file_iterator<> i (filename);
+ detail::boost_spirit::file_iterator<> i (filename);
if (!i) {
if (errno == 0)
// hmm.. errno==0 but the file_iterator is false; something is wrong but we
else
throw SystemException(filename, errno SENF_EXC_DEBUGINFO);
}
- boost::spirit::file_iterator<> const i_end (i.make_end());
+ detail::boost_spirit::file_iterator<> const i_end (i.make_end());
parseLoop(i, i_end, filename, cb);
}
prefix_ void senf::console::CommandParser::parseArguments(std::string const & arguments,
ParseCommandInfo & info)
{
- typedef boost::spirit::position_iterator<
+ typedef detail::boost_spirit::position_iterator<
std::string::const_iterator, detail::FilePositionWithIndex> PositionIterator;
PositionIterator b (arguments.begin(), arguments.end(), std::string("<unknown>"));
PositionIterator e (arguments.end(), arguments.end(), std::string("<unknown>"));
detail::ParseDispatcher::BindInfo bind (impl().dispatcher, info);
- boost::spirit::parse_info<PositionIterator> result;
+ detail::boost_spirit::parse_info<PositionIterator> result;
try {
- result = boost::spirit::parse( b, e,
+ result = detail::boost_spirit::parse( b, e,
impl().grammar.use_parser<Impl::Grammar::ArgumentsParser>(),
impl().grammar.use_parser<Impl::Grammar::SkipParser>() );
}
- catch (boost::spirit::parser_error<Impl::Grammar::Errors, PositionIterator> & ex) {
+ catch (detail::boost_spirit::parser_error<Impl::Grammar::Errors, PositionIterator> & ex) {
throwParserError(ex);
}
if (! result.full) {
prefix_ void senf::console::CommandParser::parsePath(std::string const & path,
ParseCommandInfo & info)
{
- typedef boost::spirit::position_iterator<
+ typedef detail::boost_spirit::position_iterator<
std::string::const_iterator, detail::FilePositionWithIndex> PositionIterator;
PositionIterator b (path.begin(), path.end(), std::string("<unknown>"));
PositionIterator e (path.end(), path.end(), std::string("<unknown>"));
detail::ParseDispatcher::BindInfo bind (impl().dispatcher, info);
- boost::spirit::parse_info<PositionIterator> result;
+ detail::boost_spirit::parse_info<PositionIterator> result;
try {
- result = boost::spirit::parse( b, e,
+ result = detail::boost_spirit::parse( b, e,
impl().grammar.use_parser<Impl::Grammar::PathParser>(),
impl().grammar.use_parser<Impl::Grammar::SkipParser>() );
}
- catch (boost::spirit::parser_error<Impl::Grammar::Errors, PositionIterator> & ex) {
+ catch (detail::boost_spirit::parser_error<Impl::Grammar::Errors, PositionIterator> & ex) {
throwParserError(ex);
}
if (! result.full) {
parseLoop(commands.begin(), commands.end(), "<unknown>", cb) );
}
-///////////////////////////////////////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
// Character sets
prefix_ bool senf::console::CommandParser::isSpecialChar(char ch)
return Impl::Grammar::word_p.test(ch);
}
-/////////////////////////////cc.e////////////////////////////////////////
+//-/////////////////////////////////////////////////////////////////////////////////////////////////
#undef prefix_
//#include "Parse.mpp"