Blame examples/cppunittest/XmlUniformiser.cpp

Packit Service e31359
#include "XmlUniformiser.h"
Packit Service e31359
Packit Service e31359
Packit Service e31359
int 
Packit Service e31359
notEqualIndex( std::string expectedXml,
Packit Service e31359
               std::string actualXml )
Packit Service e31359
{
Packit Service e31359
  unsigned int index = 0;
Packit Service e31359
  while ( index < actualXml.length()  &&  
Packit Service e31359
          index < expectedXml.length()  &&
Packit Service e31359
          actualXml[index] == expectedXml[index] )
Packit Service e31359
    ++index;
Packit Service e31359
Packit Service e31359
  return index;
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
/// Asserts that two XML string are equivalent.
Packit Service e31359
void 
Packit Service e31359
checkXmlEqual( std::string expectedXml,
Packit Service e31359
               std::string actualXml,
Packit Service e31359
               CPPUNIT_NS::SourceLine sourceLine )
Packit Service e31359
{
Packit Service e31359
  std::string expected = XmlUniformiser( expectedXml ).stripped();
Packit Service e31359
  std::string actual = XmlUniformiser( actualXml ).stripped();
Packit Service e31359
Packit Service e31359
  if ( expected == actual )
Packit Service e31359
    return;
Packit Service e31359
Packit Service e31359
  int index = notEqualIndex( expected, actual );
Packit Service e31359
  CPPUNIT_NS::OStringStream message;
Packit Service e31359
  message  <<  "differ at index: "  <<  index  << "\n"
Packit Service e31359
           <<  "expected: "  <<  expected.substr(index) << "\n"
Packit Service e31359
           <<  "but was : "  <<  actual.substr( index );
Packit Service e31359
  CPPUNIT_NS::Asserter::failNotEqual( expected,
Packit Service e31359
                                      actual,
Packit Service e31359
                                      sourceLine,
Packit Service e31359
                                      message.str() );
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
Packit Service e31359
XmlUniformiser::XmlUniformiser( const std::string &xml ) :
Packit Service e31359
    m_index( 0 ),
Packit Service e31359
    m_xml( xml )
Packit Service e31359
{
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
std::string 
Packit Service e31359
XmlUniformiser::stripped()
Packit Service e31359
{
Packit Service e31359
  while ( isValidIndex() )
Packit Service e31359
  {
Packit Service e31359
    skipSpaces();
Packit Service e31359
    if ( startsWith( "
Packit Service e31359
      skipProcessed();
Packit Service e31359
    else if ( startsWith( "
Packit Service e31359
      skipComment();
Packit Service e31359
    else if ( startsWith( "<" ) )
Packit Service e31359
      copyElement();
Packit Service e31359
    else
Packit Service e31359
      copyElementContent();
Packit Service e31359
  }
Packit Service e31359
  return m_stripped;
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::skipSpaces()
Packit Service e31359
{
Packit Service e31359
  while ( isSpace() )
Packit Service e31359
    skipNext();
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
bool 
Packit Service e31359
XmlUniformiser::isSpace( char c )
Packit Service e31359
{
Packit Service e31359
  return c < 33;
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
bool 
Packit Service e31359
XmlUniformiser::isSpace()
Packit Service e31359
{
Packit Service e31359
  return isValidIndex()  &&  isSpace( m_xml[m_index] );
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
bool 
Packit Service e31359
XmlUniformiser::isValidIndex()
Packit Service e31359
{
Packit Service e31359
  return m_index < m_xml.length();
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::skipNext( int count )
Packit Service e31359
{
Packit Service e31359
  while ( count-- > 0 )
Packit Service e31359
    ++m_index;
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::copyNext( int count )
Packit Service e31359
{
Packit Service e31359
  while ( count-- > 0  &&  isValidIndex() )
Packit Service e31359
    m_stripped += m_xml[ m_index++ ];
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
bool 
Packit Service e31359
XmlUniformiser::startsWith( std::string expected )
Packit Service e31359
{
Packit Service e31359
  std::string actual = m_xml.substr( m_index, expected.length() );
Packit Service e31359
  return actual == expected;
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::skipProcessed()
Packit Service e31359
{
Packit Service e31359
  while ( isValidIndex()  &&  !startsWith( "?>" ) )
Packit Service e31359
    skipNext();
Packit Service e31359
  if ( isValidIndex() )
Packit Service e31359
    skipNext( 2 );
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::skipComment()
Packit Service e31359
{
Packit Service e31359
  while ( isValidIndex()  &&  !startsWith( "-->" ) )
Packit Service e31359
    skipNext();
Packit Service e31359
  if ( isValidIndex() )
Packit Service e31359
    skipNext( 3 );
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::copyElement()
Packit Service e31359
{
Packit Service e31359
  copyElementName();
Packit Service e31359
  copyElementAttributes();
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::copyElementName()
Packit Service e31359
{
Packit Service e31359
  while ( isValidIndex()  &&
Packit Service e31359
          !( isSpace()  ||  startsWith( ">" ) ) )
Packit Service e31359
    copyNext();
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::copyElementAttributes()
Packit Service e31359
{
Packit Service e31359
  do
Packit Service e31359
  {
Packit Service e31359
    bool hadSpace = isSpace();
Packit Service e31359
    skipSpaces();
Packit Service e31359
    if ( startsWith( ">" ) )
Packit Service e31359
      break;
Packit Service e31359
Packit Service e31359
    if ( hadSpace )
Packit Service e31359
      m_stripped += ' ';
Packit Service e31359
Packit Service e31359
    copyAttributeName();
Packit Service e31359
    skipSpaces();
Packit Service e31359
    if ( startsWith( "=" ) )
Packit Service e31359
    {
Packit Service e31359
      copyNext();
Packit Service e31359
      copyAttributeValue();
Packit Service e31359
    }
Packit Service e31359
    else    // attribute should always be valued, ne ?
Packit Service e31359
      m_stripped += ' ';
Packit Service e31359
  }
Packit Service e31359
  while ( isValidIndex() );
Packit Service e31359
  copyNext();
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::copyAttributeName()
Packit Service e31359
{
Packit Service e31359
  while ( isValidIndex()  &&  !isEndOfAttributeName() )
Packit Service e31359
    copyNext();
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
bool 
Packit Service e31359
XmlUniformiser::isEndOfAttributeName()
Packit Service e31359
{
Packit Service e31359
  return isSpace()  ||  startsWith( ">" )  ||  startsWith( "=" );
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::copyAttributeValue()
Packit Service e31359
{
Packit Service e31359
  skipSpaces();
Packit Service e31359
  copyUntilDoubleQuote();
Packit Service e31359
  copyUntilDoubleQuote();
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::copyUntilDoubleQuote()
Packit Service e31359
{
Packit Service e31359
  while ( isValidIndex()  &&  !startsWith("\"") )
Packit Service e31359
    copyNext();
Packit Service e31359
  copyNext();   // '"'
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::copyElementContent()
Packit Service e31359
{
Packit Service e31359
  while ( isValidIndex()  &&  !startsWith( "<" ) )
Packit Service e31359
    copyNext();
Packit Service e31359
  removeTrailingSpaces();
Packit Service e31359
}
Packit Service e31359
Packit Service e31359
Packit Service e31359
void 
Packit Service e31359
XmlUniformiser::removeTrailingSpaces()
Packit Service e31359
{
Packit Service e31359
  int index = m_stripped.length();
Packit Service e31359
  while ( index-1 > 0  &&  isSpace( m_stripped[index-1] ) )
Packit Service e31359
    --index;
Packit Service e31359
  m_stripped.resize( index );
Packit Service e31359
}