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