| 708 | |
| 709 | |
| 710 | char* XMLDocument::Identify( char* p, XMLNode** node ) |
| 711 | { |
| 712 | TIXMLASSERT( node ); |
| 713 | TIXMLASSERT( p ); |
| 714 | char* const start = p; |
| 715 | int const startLine = _parseCurLineNum; |
| 716 | p = XMLUtil::SkipWhiteSpace( p, &_parseCurLineNum ); |
| 717 | if( !*p ) { |
| 718 | *node = 0; |
| 719 | TIXMLASSERT( p ); |
| 720 | return p; |
| 721 | } |
| 722 | |
| 723 | // These strings define the matching patterns: |
| 724 | static const char* xmlHeader = { "<?" }; |
| 725 | static const char* commentHeader = { "<!--" }; |
| 726 | static const char* cdataHeader = { "<![CDATA[" }; |
| 727 | static const char* dtdHeader = { "<!" }; |
| 728 | static const char* elementHeader = { "<" }; // and a header for everything else; check last. |
| 729 | |
| 730 | static const int xmlHeaderLen = 2; |
| 731 | static const int commentHeaderLen = 4; |
| 732 | static const int cdataHeaderLen = 9; |
| 733 | static const int dtdHeaderLen = 2; |
| 734 | static const int elementHeaderLen = 1; |
| 735 | |
| 736 | TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLUnknown ) ); // use same memory pool |
| 737 | TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) ); // use same memory pool |
| 738 | XMLNode* returnNode = 0; |
| 739 | if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) { |
| 740 | returnNode = CreateUnlinkedNode<XMLDeclaration>( _commentPool ); |
| 741 | returnNode->_parseLineNum = _parseCurLineNum; |
| 742 | p += xmlHeaderLen; |
| 743 | } |
| 744 | else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) { |
| 745 | returnNode = CreateUnlinkedNode<XMLComment>( _commentPool ); |
| 746 | returnNode->_parseLineNum = _parseCurLineNum; |
| 747 | p += commentHeaderLen; |
| 748 | } |
| 749 | else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) { |
| 750 | XMLText* text = CreateUnlinkedNode<XMLText>( _textPool ); |
| 751 | returnNode = text; |
| 752 | returnNode->_parseLineNum = _parseCurLineNum; |
| 753 | p += cdataHeaderLen; |
| 754 | text->SetCData( true ); |
| 755 | } |
| 756 | else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) { |
| 757 | returnNode = CreateUnlinkedNode<XMLUnknown>( _commentPool ); |
| 758 | returnNode->_parseLineNum = _parseCurLineNum; |
| 759 | p += dtdHeaderLen; |
| 760 | } |
| 761 | else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) { |
| 762 | returnNode = CreateUnlinkedNode<XMLElement>( _elementPool ); |
| 763 | returnNode->_parseLineNum = _parseCurLineNum; |
| 764 | p += elementHeaderLen; |
| 765 | } |
| 766 | else { |
| 767 | returnNode = CreateUnlinkedNode<XMLText>( _textPool ); |
no test coverage detected