diff options
Diffstat (limited to 'core/fxcrt/xml/cfx_xmlnode.cpp')
-rw-r--r-- | core/fxcrt/xml/cfx_xmlnode.cpp | 247 |
1 files changed, 16 insertions, 231 deletions
diff --git a/core/fxcrt/xml/cfx_xmlnode.cpp b/core/fxcrt/xml/cfx_xmlnode.cpp index 41889e2d1c..19f397deb2 100644 --- a/core/fxcrt/xml/cfx_xmlnode.cpp +++ b/core/fxcrt/xml/cfx_xmlnode.cpp @@ -39,134 +39,51 @@ void CFX_XMLNode::DeleteChildren() { m_pChild = nullptr; } -int32_t CFX_XMLNode::CountChildNodes() const { - int32_t iCount = 0; - CFX_XMLNode* pChild = m_pChild; - while (pChild) { - iCount++; - pChild = pChild->m_pNext; - } - return iCount; -} - -CFX_XMLNode* CFX_XMLNode::GetChildNode(int32_t index) const { - CFX_XMLNode* pChild = m_pChild; - while (pChild) { - if (index == 0) { - return pChild; - } - index--; - pChild = pChild->m_pNext; - } - return nullptr; -} - -int32_t CFX_XMLNode::GetChildNodeIndex(CFX_XMLNode* pNode) const { - int32_t index = 0; - CFX_XMLNode* pChild = m_pChild; - while (pChild) { - if (pChild == pNode) { - return index; - } - index++; - pChild = pChild->m_pNext; - } - return -1; +void CFX_XMLNode::AppendChild(CFX_XMLNode* pNode) { + InsertChildNode(pNode, -1); } -CFX_XMLNode* CFX_XMLNode::GetPath(const wchar_t* pPath, - int32_t iLength, - bool bQualifiedName) const { - ASSERT(pPath); - if (iLength < 0) { - iLength = wcslen(pPath); - } - if (iLength == 0) { - return nullptr; - } - WideString csPath; - const wchar_t* pStart = pPath; - const wchar_t* pEnd = pPath + iLength; - wchar_t ch; - while (pStart < pEnd) { - ch = *pStart++; - if (ch == L'/') - break; - csPath += ch; - } - iLength -= pStart - pPath; - CFX_XMLNode* pFind = nullptr; - if (csPath.GetLength() < 1) { - pFind = GetNodeItem(CFX_XMLNode::Root); - } else if (csPath.Compare(L"..") == 0) { - pFind = m_pParent; - } else if (csPath.Compare(L".") == 0) { - pFind = (CFX_XMLNode*)this; - } else { - WideString wsTag; - CFX_XMLNode* pNode = m_pChild; - while (pNode) { - if (pNode->GetType() == FX_XMLNODE_Element) { - if (bQualifiedName) - wsTag = static_cast<CFX_XMLElement*>(pNode)->GetName(); - else - wsTag = static_cast<CFX_XMLElement*>(pNode)->GetLocalTagName(); - - if (wsTag.Compare(csPath) == 0) { - if (iLength < 1) - pFind = pNode; - else - pFind = pNode->GetPath(pStart, iLength, bQualifiedName); - - if (pFind) - return pFind; - } - } - pNode = pNode->m_pNext; - } - } - if (!pFind || iLength < 1) - return pFind; - return pFind->GetPath(pStart, iLength, bQualifiedName); -} +void CFX_XMLNode::InsertChildNode(CFX_XMLNode* pNode, int32_t index) { + ASSERT(!pNode->m_pParent); -int32_t CFX_XMLNode::InsertChildNode(CFX_XMLNode* pNode, int32_t index) { pNode->m_pParent = this; if (!m_pChild) { m_pChild = pNode; pNode->m_pPrior = nullptr; pNode->m_pNext = nullptr; - return 0; + return; } if (index == 0) { pNode->m_pNext = m_pChild; pNode->m_pPrior = nullptr; m_pChild->m_pPrior = pNode; m_pChild = pNode; - return 0; + return; } + int32_t iCount = 0; CFX_XMLNode* pFind = m_pChild; - while (++iCount != index && pFind->m_pNext) { + while (++iCount != index && pFind->m_pNext) pFind = pFind->m_pNext; - } + pNode->m_pPrior = pFind; pNode->m_pNext = pFind->m_pNext; if (pFind->m_pNext) pFind->m_pNext->m_pPrior = pNode; pFind->m_pNext = pNode; - return iCount; } void CFX_XMLNode::RemoveChildNode(CFX_XMLNode* pNode) { ASSERT(m_pChild && pNode); - if (m_pChild == pNode) { + + if (m_pChild == pNode) m_pChild = pNode->m_pNext; - } else { + else pNode->m_pPrior->m_pNext = pNode->m_pNext; - } + if (pNode->m_pNext) pNode->m_pNext->m_pPrior = pNode->m_pPrior; + pNode->m_pParent = nullptr; pNode->m_pNext = nullptr; pNode->m_pPrior = nullptr; @@ -176,153 +93,21 @@ CFX_XMLNode* CFX_XMLNode::GetNodeItem(CFX_XMLNode::NodeItem eItem) const { switch (eItem) { case CFX_XMLNode::Root: { CFX_XMLNode* pParent = (CFX_XMLNode*)this; - while (pParent->m_pParent) { + while (pParent->m_pParent) pParent = pParent->m_pParent; - } + return pParent; } case CFX_XMLNode::Parent: return m_pParent; - case CFX_XMLNode::FirstSibling: { - CFX_XMLNode* pItem = (CFX_XMLNode*)this; - while (pItem->m_pPrior) { - pItem = pItem->m_pPrior; - } - return pItem == (CFX_XMLNode*)this ? nullptr : pItem; - } - case CFX_XMLNode::PriorSibling: - return m_pPrior; case CFX_XMLNode::NextSibling: return m_pNext; - case CFX_XMLNode::LastSibling: { - CFX_XMLNode* pItem = (CFX_XMLNode*)this; - while (pItem->m_pNext) - pItem = pItem->m_pNext; - return pItem == (CFX_XMLNode*)this ? nullptr : pItem; - } - case CFX_XMLNode::FirstNeighbor: { - CFX_XMLNode* pParent = (CFX_XMLNode*)this; - while (pParent->m_pParent) - pParent = pParent->m_pParent; - return pParent == (CFX_XMLNode*)this ? nullptr : pParent; - } - case CFX_XMLNode::PriorNeighbor: { - if (!m_pPrior) - return m_pParent; - - CFX_XMLNode* pItem = m_pPrior; - while (pItem->m_pChild) { - pItem = pItem->m_pChild; - while (pItem->m_pNext) - pItem = pItem->m_pNext; - } - return pItem; - } - case CFX_XMLNode::NextNeighbor: { - if (m_pChild) - return m_pChild; - if (m_pNext) - return m_pNext; - CFX_XMLNode* pItem = m_pParent; - while (pItem) { - if (pItem->m_pNext) - return pItem->m_pNext; - pItem = pItem->m_pParent; - } - return nullptr; - } - case CFX_XMLNode::LastNeighbor: { - CFX_XMLNode* pItem = (CFX_XMLNode*)this; - while (pItem->m_pParent) { - pItem = pItem->m_pParent; - } - while (true) { - while (pItem->m_pNext) - pItem = pItem->m_pNext; - if (!pItem->m_pChild) - break; - pItem = pItem->m_pChild; - } - return pItem == (CFX_XMLNode*)this ? nullptr : pItem; - } case CFX_XMLNode::FirstChild: return m_pChild; - case CFX_XMLNode::LastChild: { - if (!m_pChild) - return nullptr; - - CFX_XMLNode* pChild = m_pChild; - while (pChild->m_pNext) - pChild = pChild->m_pNext; - return pChild; - } - default: - break; } return nullptr; } -int32_t CFX_XMLNode::GetNodeLevel() const { - int32_t iLevel = 0; - const CFX_XMLNode* pItem = m_pParent; - while (pItem) { - iLevel++; - pItem = pItem->m_pParent; - } - return iLevel; -} - -bool CFX_XMLNode::InsertNodeItem(CFX_XMLNode::NodeItem eItem, - CFX_XMLNode* pNode) { - switch (eItem) { - case CFX_XMLNode::NextSibling: { - pNode->m_pParent = m_pParent; - pNode->m_pNext = m_pNext; - pNode->m_pPrior = this; - if (m_pNext) { - m_pNext->m_pPrior = pNode; - } - m_pNext = pNode; - return true; - } - case CFX_XMLNode::PriorSibling: { - pNode->m_pParent = m_pParent; - pNode->m_pNext = this; - pNode->m_pPrior = m_pPrior; - if (m_pPrior) { - m_pPrior->m_pNext = pNode; - } else if (m_pParent) { - m_pParent->m_pChild = pNode; - } - m_pPrior = pNode; - return true; - } - default: - return false; - } -} - -CFX_XMLNode* CFX_XMLNode::RemoveNodeItem(CFX_XMLNode::NodeItem eItem) { - CFX_XMLNode* pNode = nullptr; - switch (eItem) { - case CFX_XMLNode::NextSibling: - if (m_pNext) { - pNode = m_pNext; - m_pNext = pNode->m_pNext; - if (m_pNext) { - m_pNext->m_pPrior = this; - } - pNode->m_pParent = nullptr; - pNode->m_pNext = nullptr; - pNode->m_pPrior = nullptr; - } - break; - default: - break; - } - return pNode; -} - std::unique_ptr<CFX_XMLNode> CFX_XMLNode::Clone() { return nullptr; } |