Chris@102: /*============================================================================= Chris@102: Copyright (c) 2001-2014 Joel de Guzman Chris@102: Copyright (c) 2001-2011 Hartmut Kaiser Chris@102: Chris@102: Distributed under the Boost Software License, Version 1.0. (See accompanying Chris@102: file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) Chris@102: ==============================================================================*/ Chris@102: #if !defined(BOOST_SPIRIT_X3_SIMPLE_TRACE_DECEMBER_06_2008_1102AM) Chris@102: #define BOOST_SPIRIT_X3_SIMPLE_TRACE_DECEMBER_06_2008_1102AM Chris@102: Chris@102: #if defined(_MSC_VER) Chris@102: #pragma once Chris@102: #endif Chris@102: Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: #include Chris@102: Chris@102: // The stream to use for debug output Chris@102: #if !defined(BOOST_SPIRIT_X3_DEBUG_OUT) Chris@102: #define BOOST_SPIRIT_X3_DEBUG_OUT std::cerr Chris@102: #endif Chris@102: Chris@102: // number of tokens to print while debugging Chris@102: #if !defined(BOOST_SPIRIT_X3_DEBUG_PRINT_SOME) Chris@102: #define BOOST_SPIRIT_X3_DEBUG_PRINT_SOME 20 Chris@102: #endif Chris@102: Chris@102: // number of spaces to indent Chris@102: #if !defined(BOOST_SPIRIT_X3_DEBUG_INDENT) Chris@102: #define BOOST_SPIRIT_X3_DEBUG_INDENT 2 Chris@102: #endif Chris@102: Chris@102: namespace boost { namespace spirit { namespace x3 Chris@102: { Chris@102: namespace detail Chris@102: { Chris@102: template Chris@102: inline void token_printer(std::ostream& o, Char c) Chris@102: { Chris@102: // allow customization of the token printer routine Chris@102: x3::traits::print_token(o, c); Chris@102: } Chris@102: } Chris@102: Chris@102: template Chris@102: struct simple_trace Chris@102: { Chris@102: simple_trace(std::ostream& out) Chris@102: : out(out), indent(0) {} Chris@102: Chris@102: void print_indent(int n) const Chris@102: { Chris@102: n *= IndentSpaces; Chris@102: for (int i = 0; i != n; ++i) Chris@102: out << ' '; Chris@102: } Chris@102: Chris@102: template Chris@102: void print_some( Chris@102: char const* tag Chris@102: , Iterator first, Iterator const& last) const Chris@102: { Chris@102: print_indent(indent); Chris@102: out << '<' << tag << '>'; Chris@102: int const n = CharsToPrint; Chris@102: for (int i = 0; first != last && i != n && *first; ++i, ++first) Chris@102: detail::token_printer(out, *first); Chris@102: out << "' << std::endl; Chris@102: Chris@102: // $$$ FIXME convert invalid xml characters (e.g. '<') to valid Chris@102: // character entities. $$$ Chris@102: } Chris@102: Chris@102: template Chris@102: void operator()( Chris@102: Iterator const& first Chris@102: , Iterator const& last Chris@102: , Attribute const& attr Chris@102: , State state Chris@102: , std::string const& rule_name) const Chris@102: { Chris@102: switch (state) Chris@102: { Chris@102: case pre_parse: Chris@102: print_indent(indent++); Chris@102: out Chris@102: << '<' << rule_name << '>' Chris@102: << std::endl; Chris@102: print_some("try", first, last); Chris@102: break; Chris@102: Chris@102: case successful_parse: Chris@102: print_some("success", first, last); Chris@102: if (!is_same::value) Chris@102: { Chris@102: print_indent(indent); Chris@102: out Chris@102: << ""; Chris@102: traits::print_attribute(out, attr); Chris@102: out Chris@102: << ""; Chris@102: out << std::endl; Chris@102: } Chris@102: //~ if (!fusion::empty(context.locals)) Chris@102: //~ out Chris@102: //~ << "" Chris@102: //~ << context.locals Chris@102: //~ << ""; Chris@102: print_indent(--indent); Chris@102: out Chris@102: << "' Chris@102: << std::endl; Chris@102: break; Chris@102: Chris@102: case failed_parse: Chris@102: print_indent(indent); Chris@102: out << "" << std::endl; Chris@102: print_indent(--indent); Chris@102: out Chris@102: << "' Chris@102: << std::endl; Chris@102: break; Chris@102: } Chris@102: } Chris@102: Chris@102: std::ostream& out; Chris@102: mutable int indent; Chris@102: }; Chris@102: Chris@102: namespace detail Chris@102: { Chris@102: typedef simple_trace< Chris@102: BOOST_SPIRIT_X3_DEBUG_INDENT, BOOST_SPIRIT_X3_DEBUG_PRINT_SOME> Chris@102: simple_trace_type; Chris@102: Chris@102: inline simple_trace_type& Chris@102: get_simple_trace() Chris@102: { Chris@102: static simple_trace_type tracer(BOOST_SPIRIT_X3_DEBUG_OUT); Chris@102: return tracer; Chris@102: } Chris@102: } Chris@102: }}} Chris@102: Chris@102: #endif