js8call/.svn/pristine/db/db72b3cb45d82dac0e2b255dbee8ea51a11b4650.svn-base
2018-02-08 21:28:33 -05:00

127 lines
3.9 KiB
Plaintext

// (C) Copyright Gennadiy Rozental 2001.
// 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)
// See http://www.boost.org/libs/test for the library home page.
//
// File : $RCSfile$
//
// Version : $Revision$
//
// Description : contains definition for setcolor iostream manipulator
// ***************************************************************************
#ifndef BOOST_TEST_UTILS_SETCOLOR_HPP
#define BOOST_TEST_UTILS_SETCOLOR_HPP
// Boost.Test
#include <boost/test/detail/config.hpp>
// STL
#include <iostream>
#include <cstdio>
#include <boost/test/detail/suppress_warnings.hpp>
//____________________________________________________________________________//
namespace boost {
namespace unit_test {
namespace utils {
// ************************************************************************** //
// ************** term_attr ************** //
// ************************************************************************** //
struct term_attr { enum _ {
NORMAL = 0,
BRIGHT = 1,
DIM = 2,
UNDERLINE = 4,
BLINK = 5,
REVERSE = 7,
CROSSOUT = 9
}; };
// ************************************************************************** //
// ************** term_color ************** //
// ************************************************************************** //
struct term_color { enum _ {
BLACK = 0,
RED = 1,
GREEN = 2,
YELLOW = 3,
BLUE = 4,
MAGENTA = 5,
CYAN = 6,
WHITE = 7,
ORIGINAL = 9
}; };
// ************************************************************************** //
// ************** setcolor ************** //
// ************************************************************************** //
class setcolor {
public:
// Constructor
explicit setcolor( term_attr::_ attr = term_attr::NORMAL,
term_color::_ fg = term_color::ORIGINAL,
term_color::_ bg = term_color::ORIGINAL )
{
m_command_size = std::sprintf( m_control_command, "%c[%d;%d;%dm", 0x1B, attr, fg + 30, bg + 40 );
}
friend std::ostream&
operator<<( std::ostream& os, setcolor const& sc )
{
return os.write( sc.m_control_command, sc.m_command_size );
}
private:
// Data members
char m_control_command[13];
int m_command_size;
};
// ************************************************************************** //
// ************** scope_setcolor ************** //
// ************************************************************************** //
struct scope_setcolor {
scope_setcolor() : m_os( 0 ) {}
explicit scope_setcolor( std::ostream& os,
term_attr::_ attr = term_attr::NORMAL,
term_color::_ fg = term_color::ORIGINAL,
term_color::_ bg = term_color::ORIGINAL )
: m_os( &os )
{
os << setcolor( attr, fg, bg );
}
~scope_setcolor()
{
if( m_os )
*m_os << setcolor();
}
private:
// Data members
std::ostream* m_os;
};
#define BOOST_TEST_SCOPE_SETCOLOR( is_color_output, os, attr, color ) \
utils::scope_setcolor const& sc = is_color_output \
? utils::scope_setcolor( os, utils::attr, utils::color ) \
: utils::scope_setcolor(); \
ut_detail::ignore_unused_variable_warning( sc ) \
/**/
} // namespace utils
} // namespace unit_test
} // namespace boost
#include <boost/test/detail/enable_warnings.hpp>
#endif // BOOST_TEST_UTILS_SETCOLOR_HPP