Blame examples/cppunittest/XmlUniformiser.cpp

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