blob: fda0d0c1528edbedbcc50bd600f0a43879d50be0 [file] [log] [blame]
/*=============================================================================
Copyright (c) 2001-2009 Hartmut Kaiser
Copyright (c) 2001-2007 Joel de Guzman
Copyright (c) 2003 Gustavo Guerra
Distributed under the Boost Software License, Version 1.0. (See accompanying
file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt)
==============================================================================*/
#if !defined(BOOST_SPIRIT_PRINT_NODE_INFO_NOV_12_2007_1045AM)
#define BOOST_SPIRIT_PRINT_NODE_INFO_NOV_12_2007_1045AM
#include <cctype> // iscntrl
#include <iostream>
#include <iomanip>
#include <boost/type_traits/is_convertible.hpp>
#include <boost/mpl/if.hpp>
#include <boost/mpl/and.hpp>
namespace boost { namespace spirit { namespace qi { namespace debug
{
namespace detail
{
struct token_printer_aux_for_chars
{
template<typename Char>
static void print(std::ostream& o, Char c)
{
using namespace std; // allow for ADL to find the proper iscntrl
if (c == static_cast<Char>('\a'))
o << "\\a";
else if (c == static_cast<Char>('\b'))
o << "\\b";
else if (c == static_cast<Char>('\f'))
o << "\\f";
else if (c == static_cast<Char>('\n'))
o << "\\n";
else if (c == static_cast<Char>('\r'))
o << "\\r";
else if (c == static_cast<Char>('\t'))
o << "\\t";
else if (c == static_cast<Char>('\v'))
o << "\\v";
else if (iscntrl(c))
o << "\\" << std::oct << static_cast<int>(c);
else
o << static_cast<char>(c);
}
};
// for token types where the comparison with char constants wouldn't work
struct token_printer_aux_for_other_types
{
template<typename Char>
static void print(std::ostream& o, Char c)
{
o << c;
}
};
template <typename Char>
struct token_printer_aux
: mpl::if_<
mpl::and_<
is_convertible<Char, char>,
is_convertible<char, Char>
>,
token_printer_aux_for_chars,
token_printer_aux_for_other_types
>::type
{};
template<typename Char>
inline void token_printer(std::ostream& o, Char c)
{
// allow to customize the token printer routine
#if !defined(BOOST_SPIRIT_DEBUG_TOKEN_PRINTER)
token_printer_aux<Char>::print(o, c);
#else
BOOST_SPIRIT_DEBUG_TOKEN_PRINTER(o, c);
#endif
}
///////////////////////////////////////////////////////////////////////////
template <typename Iterator>
inline void
print_node_info(bool hit, int level, bool close, std::string const& name,
Iterator /*first*/, Iterator const& /*last*/)
{
if (!name.empty())
{
for (int i = 0; i < level; ++i)
BOOST_SPIRIT_DEBUG_OUT << " ";
if (close) {
if (hit)
BOOST_SPIRIT_DEBUG_OUT << "/";
else
BOOST_SPIRIT_DEBUG_OUT << "#";
}
// BOOST_SPIRIT_DEBUG_OUT << name << ":\t\"";
// for (int j = 0; j < BOOST_SPIRIT_DEBUG_PRINT_SOME; ++j)
// {
// if (first == last)
// break;
//
// token_printer(BOOST_SPIRIT_DEBUG_OUT, *first);
// ++first;
// }
// BOOST_SPIRIT_DEBUG_OUT << "\"\n";
BOOST_SPIRIT_DEBUG_OUT << name << "\n";
}
}
}
}}}}
#endif