| 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