| 654 | |
| 655 | |
| 656 | char* XMLDocument::Identify( char* p, XMLNode** node ) |
| 657 | { |
| 658 | TIXMLASSERT( node ); |
| 659 | TIXMLASSERT( p ); |
| 660 | char* const start = p; |
| 661 | int const startLine = _parseCurLineNum; |
| 662 | p = XMLUtil::SkipWhiteSpace( p, &_parseCurLineNum ); |
| 663 | if( !*p ) { |
| 664 | *node = 0; |
| 665 | TIXMLASSERT( p ); |
| 666 | return p; |
| 667 | } |
| 668 | |
| 669 | // These strings define the matching patterns: |
| 670 | static const char* xmlHeader = { "<?" }; |
| 671 | static const char* commentHeader = { "<!--" }; |
| 672 | static const char* cdataHeader = { "<![CDATA[" }; |
| 673 | static const char* dtdHeader = { "<!" }; |
| 674 | static const char* elementHeader = { "<" }; // and a header for everything else; check last. |
| 675 | |
| 676 | static const int xmlHeaderLen = 2; |
| 677 | static const int commentHeaderLen = 4; |
| 678 | static const int cdataHeaderLen = 9; |
| 679 | static const int dtdHeaderLen = 2; |
| 680 | static const int elementHeaderLen = 1; |
| 681 | |
| 682 | TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLUnknown ) ); // use same memory pool |
| 683 | TIXMLASSERT( sizeof( XMLComment ) == sizeof( XMLDeclaration ) ); // use same memory pool |
| 684 | XMLNode* returnNode = 0; |
| 685 | if ( XMLUtil::StringEqual( p, xmlHeader, xmlHeaderLen ) ) { |
| 686 | returnNode = CreateUnlinkedNode<XMLDeclaration>( _commentPool ); |
| 687 | returnNode->_parseLineNum = _parseCurLineNum; |
| 688 | p += xmlHeaderLen; |
| 689 | } |
| 690 | else if ( XMLUtil::StringEqual( p, commentHeader, commentHeaderLen ) ) { |
| 691 | returnNode = CreateUnlinkedNode<XMLComment>( _commentPool ); |
| 692 | returnNode->_parseLineNum = _parseCurLineNum; |
| 693 | p += commentHeaderLen; |
| 694 | } |
| 695 | else if ( XMLUtil::StringEqual( p, cdataHeader, cdataHeaderLen ) ) { |
| 696 | XMLText* text = CreateUnlinkedNode<XMLText>( _textPool ); |
| 697 | returnNode = text; |
| 698 | returnNode->_parseLineNum = _parseCurLineNum; |
| 699 | p += cdataHeaderLen; |
| 700 | text->SetCData( true ); |
| 701 | } |
| 702 | else if ( XMLUtil::StringEqual( p, dtdHeader, dtdHeaderLen ) ) { |
| 703 | returnNode = CreateUnlinkedNode<XMLUnknown>( _commentPool ); |
| 704 | returnNode->_parseLineNum = _parseCurLineNum; |
| 705 | p += dtdHeaderLen; |
| 706 | } |
| 707 | else if ( XMLUtil::StringEqual( p, elementHeader, elementHeaderLen ) ) { |
| 708 | returnNode = CreateUnlinkedNode<XMLElement>( _elementPool ); |
| 709 | returnNode->_parseLineNum = _parseCurLineNum; |
| 710 | p += elementHeaderLen; |
| 711 | } |
| 712 | else { |
| 713 | returnNode = CreateUnlinkedNode<XMLText>( _textPool ); |
no test coverage detected