Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/include
diff options
context:
space:
mode:
authorPhil Nash2017-02-06 16:21:01 +0000
committerPhil Nash2017-02-06 16:21:01 +0000
commit88b760276dc6bcff877dae439998810f189f32ca (patch)
tree2fa112e8fdc0c0e87ee3b58827c87b999c4a4169 /include
parent23eb4cc5804a1cf3a88365c47baf94063f081496 (diff)
downloadcatch3-88b760276dc6bcff877dae439998810f189f32ca.tar.gz
Revert "XmlWriter reverts to XML 1.0."
This reverts commit a189387f49f129a3554c47426a0dfe176c5c0781.
Diffstat (limited to 'include')
-rw-r--r--include/internal/catch_xmlwriter.hpp71
1 files changed, 29 insertions, 42 deletions
diff --git a/include/internal/catch_xmlwriter.hpp b/include/internal/catch_xmlwriter.hpp
index fb11d7d9..e5fe1775 100644
--- a/include/internal/catch_xmlwriter.hpp
+++ b/include/internal/catch_xmlwriter.hpp
@@ -22,12 +22,10 @@ namespace Catch {
class XmlEncode {
public:
enum ForWhat { ForTextNodes, ForAttributes };
- enum XmlVersion { _1_0, _1_1 };
- XmlEncode( XmlVersion xmlVersion, std::string const& str, ForWhat forWhat = ForTextNodes )
+ XmlEncode( std::string const& str, ForWhat forWhat = ForTextNodes )
: m_str( str ),
- m_forWhat( forWhat ),
- m_xmlVersion( xmlVersion )
+ m_forWhat( forWhat )
{}
void encodeTo( std::ostream& os ) const {
@@ -59,15 +57,8 @@ namespace Catch {
default:
// Escape control chars - based on contribution by @espenalb in PR #465 and
// by @mrpi PR #588
- if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' ) {
- if( m_xmlVersion == _1_0 )
- // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0
- os << "\\x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2)
- << static_cast<int>( c );
- else
- os << "&#x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2)
- << static_cast<int>( c ) << ';';
- }
+ if ( ( c >= 0 && c < '\x09' ) || ( c > '\x0D' && c < '\x20') || c=='\x7F' )
+ os << "&#x" << std::uppercase << std::hex << std::setfill('0') << std::setw(2) << static_cast<int>( c ) << ';';
else
os << c;
}
@@ -82,7 +73,6 @@ namespace Catch {
private:
std::string m_str;
ForWhat m_forWhat;
- XmlVersion m_xmlVersion;
};
class XmlWriter {
@@ -122,19 +112,20 @@ namespace Catch {
XmlWriter()
: m_tagIsOpen( false ),
m_needsNewline( false ),
- m_os( Catch::cout() ),
- m_xmlVersion( XmlEncode::_1_0 )
+ m_os( &Catch::cout() )
{
- writeDeclaration();
+ // We encode control characters, which requires
+ // XML 1.1
+ // see http://stackoverflow.com/questions/404107/why-are-control-characters-illegal-in-xml-1-0
+ *m_os << "<?xml version=\"1.1\" encoding=\"UTF-8\"?>\n";
}
XmlWriter( std::ostream& os )
: m_tagIsOpen( false ),
m_needsNewline( false ),
- m_os( os ),
- m_xmlVersion( XmlEncode::_1_0 )
+ m_os( &os )
{
- writeDeclaration();
+ *m_os << "<?xml version=\"1.1\" encoding=\"UTF-8\"?>\n";
}
~XmlWriter() {
@@ -145,7 +136,7 @@ namespace Catch {
XmlWriter& startElement( std::string const& name ) {
ensureTagClosed();
newlineIfNecessary();
- m_os << m_indent << '<' << name;
+ stream() << m_indent << '<' << name;
m_tags.push_back( name );
m_indent += " ";
m_tagIsOpen = true;
@@ -162,11 +153,11 @@ namespace Catch {
newlineIfNecessary();
m_indent = m_indent.substr( 0, m_indent.size()-2 );
if( m_tagIsOpen ) {
- m_os << "/>\n";
+ stream() << "/>\n";
m_tagIsOpen = false;
}
else {
- m_os << m_indent << "</" << m_tags.back() << ">\n";
+ stream() << m_indent << "</" << m_tags.back() << ">\n";
}
m_tags.pop_back();
return *this;
@@ -174,12 +165,12 @@ namespace Catch {
XmlWriter& writeAttribute( std::string const& name, std::string const& attribute ) {
if( !name.empty() && !attribute.empty() )
- m_os << ' ' << name << "=\"" << XmlEncode( m_xmlVersion, attribute, XmlEncode::ForAttributes ) << '"';
+ stream() << ' ' << name << "=\"" << XmlEncode( attribute, XmlEncode::ForAttributes ) << '"';
return *this;
}
XmlWriter& writeAttribute( std::string const& name, bool attribute ) {
- m_os << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"';
+ stream() << ' ' << name << "=\"" << ( attribute ? "true" : "false" ) << '"';
return *this;
}
@@ -195,8 +186,8 @@ namespace Catch {
bool tagWasOpen = m_tagIsOpen;
ensureTagClosed();
if( tagWasOpen && indent )
- m_os << m_indent;
- m_os << XmlEncode( m_xmlVersion, text );
+ stream() << m_indent;
+ stream() << XmlEncode( text );
m_needsNewline = true;
}
return *this;
@@ -204,42 +195,39 @@ namespace Catch {
XmlWriter& writeComment( std::string const& text ) {
ensureTagClosed();
- m_os << m_indent << "<!--" << text << "-->";
+ stream() << m_indent << "<!--" << text << "-->";
m_needsNewline = true;
return *this;
}
XmlWriter& writeBlankLine() {
ensureTagClosed();
- m_os << '\n';
+ stream() << '\n';
return *this;
}
+ void setStream( std::ostream& os ) {
+ m_os = &os;
+ }
+
private:
XmlWriter( XmlWriter const& );
void operator=( XmlWriter const& );
- void writeDeclaration() {
- switch( m_xmlVersion ) {
- case XmlEncode::_1_0:
- m_os << "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n";
- break;
- case XmlEncode::_1_1:
- m_os << "<?xml version=\"1.1\" encoding=\"UTF-8\"?>\n";
- break;
- }
+ std::ostream& stream() {
+ return *m_os;
}
void ensureTagClosed() {
if( m_tagIsOpen ) {
- m_os << ">\n";
+ stream() << ">\n";
m_tagIsOpen = false;
}
}
void newlineIfNecessary() {
if( m_needsNewline ) {
- m_os << '\n';
+ stream() << '\n';
m_needsNewline = false;
}
}
@@ -248,8 +236,7 @@ namespace Catch {
bool m_needsNewline;
std::vector<std::string> m_tags;
std::string m_indent;
- std::ostream& m_os;
- XmlEncode::XmlVersion m_xmlVersion;
+ std::ostream* m_os;
};
}