| 686 | |
| 687 | |
| 688 | char* XMLDocument::Identify( char* p, XMLNode** node ) |
| 689 | { |
| 690 | TIXMLASSERT( node ); |
| 691 | TIXMLASSERT( p ); |
| 692 | char* const start = p; |
| 693 | int const startLine = _parseCurLineNum; |
| 694 | p = XMLUtil::SkipWhiteSpace( p, &_parseCurLineNum ); |
| 695 | if( !*p ) { |
| 696 | *node = 0; |
| 697 | TIXMLASSERT( p ); |
| 698 | return p; |
| 699 | } |
| 700 | |
| 701 | // These strings define the matching patterns: |
| 702 | static const char* xmlHeader = { "<?" }; |
| 703 | static const char* commentHeader = { "<!--" }; |
| 704 | static const char* cdataHeader = { "<![CDATA[" }; |
| 705 | static const char* dtdHeader = { "<!" }; |
| 706 | static const char* elementHeader = { "<" }; // and a header for everything else; check last. |
| 707 | |
| 708 | static const int xmlHeaderLen = 2; |
| 709 | static const int commentHeaderLen = 4; |
| 710 | static const int cdataHeaderLen = 9; |
| 711 | static const int dtdHeaderLen = 2; |
| 712 | static const int elementHeaderLen = 1; |
| 713 | |
| 714 | TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLUnknown ) ); // use same memory pool |
| 715 | TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) ); // use same memory pool |
| 716 | XMLNode* returnNode = 0; |
| 717 | if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) { |
| 718 | returnNode = CreateUnlinkedNode<XMLDeclaration>( _commentPool ); |
| 719 | returnNode->_parseLineNum = _parseCurLineNum; |
| 720 | p += xmlHeaderLen; |
| 721 | } |
| 722 | else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) { |
| 723 | returnNode = CreateUnlinkedNode<XMLComment>( _commentPool ); |
| 724 | returnNode->_parseLineNum = _parseCurLineNum; |
| 725 | p += commentHeaderLen; |
| 726 | } |
| 727 | else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) { |
| 728 | XMLText* text = CreateUnlinkedNode<XMLText>( _textPool ); |
| 729 | returnNode = text; |
| 730 | returnNode->_parseLineNum = _parseCurLineNum; |
| 731 | p += cdataHeaderLen; |
| 732 | text->SetCData( true ); |
| 733 | } |
| 734 | else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) { |
| 735 | returnNode = CreateUnlinkedNode<XMLUnknown>( _commentPool ); |
| 736 | returnNode->_parseLineNum = _parseCurLineNum; |
| 737 | p += dtdHeaderLen; |
| 738 | } |
| 739 | else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) { |
| 740 | returnNode = CreateUnlinkedNode<XMLElement>( _elementPool ); |
| 741 | returnNode->_parseLineNum = _parseCurLineNum; |
| 742 | p += elementHeaderLen; |
| 743 | } |
| 744 | else { |
| 745 | returnNode = CreateUnlinkedNode<XMLText>( _textPool ); |
no test coverage detected