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