144 lines
		
	
	
		
			4.0 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			144 lines
		
	
	
		
			4.0 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 : common code used by any agent serving as OF_XML printer | ||
|  | // *************************************************************************** | ||
|  | 
 | ||
|  | #ifndef BOOST_TEST_UTILS_XML_PRINTER_HPP | ||
|  | #define BOOST_TEST_UTILS_XML_PRINTER_HPP | ||
|  | 
 | ||
|  | // Boost.Test | ||
|  | #include <boost/test/utils/basic_cstring/basic_cstring.hpp> | ||
|  | #include <boost/test/utils/custom_manip.hpp> | ||
|  | #include <boost/test/utils/foreach.hpp> | ||
|  | #include <boost/test/utils/basic_cstring/io.hpp> | ||
|  | 
 | ||
|  | // Boost | ||
|  | #include <boost/config.hpp> | ||
|  | 
 | ||
|  | // STL | ||
|  | #include <iostream> | ||
|  | 
 | ||
|  | #include <boost/test/detail/suppress_warnings.hpp> | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace unit_test { | ||
|  | namespace utils { | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************               xml print helpers              ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | inline void | ||
|  | print_escaped( std::ostream& where_to, const_string value ) | ||
|  | { | ||
|  | #if !defined(BOOST_NO_CXX11_HDR_INITIALIZER_LIST) && !defined(BOOST_NO_CXX11_UNIFIED_INITIALIZATION_SYNTAX) | ||
|  |     static std::map<char,char const*> const char_type{{ | ||
|  |         {'<' , "lt"}, | ||
|  |         {'>' , "gt"}, | ||
|  |         {'&' , "amp"}, | ||
|  |         {'\'', "apos"}, | ||
|  |         {'"' , "quot"} | ||
|  |     }}; | ||
|  | #else | ||
|  |     static std::map<char,char const*> char_type; | ||
|  | 
 | ||
|  |     if( char_type.empty() ) { | ||
|  |         char_type['<'] = "lt"; | ||
|  |         char_type['>'] = "gt"; | ||
|  |         char_type['&'] = "amp"; | ||
|  |         char_type['\'']= "apos"; | ||
|  |         char_type['"'] = "quot"; | ||
|  |     } | ||
|  | #endif | ||
|  | 
 | ||
|  |     BOOST_TEST_FOREACH( char, c, value ) { | ||
|  |         std::map<char,char const*>::const_iterator found_ref = char_type.find( c ); | ||
|  | 
 | ||
|  |         if( found_ref != char_type.end() ) | ||
|  |             where_to << '&' << found_ref->second << ';'; | ||
|  |         else | ||
|  |             where_to << c; | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | inline void | ||
|  | print_escaped( std::ostream& where_to, std::string const& value ) | ||
|  | { | ||
|  |     print_escaped( where_to, const_string( value ) ); | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | inline void | ||
|  | print_escaped( std::ostream& where_to, T const& value ) | ||
|  | { | ||
|  |     where_to << value; | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | inline void | ||
|  | print_escaped_cdata( std::ostream& where_to, const_string value ) | ||
|  | { | ||
|  |     static const_string cdata_end( "]]>" ); | ||
|  | 
 | ||
|  |     const_string::size_type pos = value.find( cdata_end ); | ||
|  |     if( pos == const_string::npos ) | ||
|  |         where_to << value; | ||
|  |     else { | ||
|  |         where_to << value.substr( 0, pos+2 ) << cdata_end | ||
|  |                  << BOOST_TEST_L( "<![CDATA[" ) << value.substr( pos+2 ); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | typedef custom_manip<struct attr_value_t> attr_value; | ||
|  | 
 | ||
|  | template<typename T> | ||
|  | inline std::ostream& | ||
|  | operator<<( custom_printer<attr_value> const& p, T const& value ) | ||
|  | { | ||
|  |     *p << "=\""; | ||
|  |     print_escaped( *p, value ); | ||
|  |     *p << '"'; | ||
|  | 
 | ||
|  |     return *p; | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | typedef custom_manip<struct cdata_t> cdata; | ||
|  | 
 | ||
|  | inline std::ostream& | ||
|  | operator<<( custom_printer<cdata> const& p, const_string value ) | ||
|  | { | ||
|  |     *p << BOOST_TEST_L( "<![CDATA[" ); | ||
|  |     print_escaped_cdata( *p, value ); | ||
|  |     return  *p << BOOST_TEST_L( "]]>" ); | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | } // namespace utils | ||
|  | } // namespace unit_test | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #include <boost/test/detail/enable_warnings.hpp> | ||
|  | 
 | ||
|  | #endif // BOOST_TEST_UTILS_XML_PRINTER_HPP |