int CHashSet::Insert(const char *szNodeValue) { if (HasNode(szNodeValue)) return 0; if (-1 == m_iFreeLinkHeadIdx) return -1; ssize_t idx = _HashValue(szNodeValue, m_iNodeValueLen) % m_iHashNodeNum; ssize_t conflict_first_node_idx = m_hashLinkArray[idx]; // get first free node as new node; THashSetNode *pNode = Node(m_iFreeLinkHeadIdx); ssize_t new_first_free_node = pNode->iNext; // set new node value; pNode->iNext = conflict_first_node_idx; m_hashLinkArray[idx] = m_iFreeLinkHeadIdx; memcpy(Value(m_iFreeLinkHeadIdx), szNodeValue, m_iNodeValueLen); // debug; m_debugSet.insert(m_iFreeLinkHeadIdx); // update new free node header; _AddToUseLink(m_iFreeLinkHeadIdx); m_iFreeLinkHeadIdx = new_first_free_node; m_iFreeNum--; return 0; }
ParentNodes SyntaxTree::Parse() { ParentNodes parents; int size = m_index.size(); // looping through all spans of size >= 2 for( int length=2; length<=size; length++ ) { for( int startPos = 0; startPos <= size-length; startPos++ ) { if (HasNode( startPos, startPos+length-1 )) { // processing one (parent) span //std::cerr << "# " << startPos << "-" << (startPos+length-1) << ":"; SplitPoints splitPoints; splitPoints.push_back( startPos ); //std::cerr << " " << startPos; int first = 1; int covered = 0; while( covered < length ) { // find largest covering subspan (child) // starting at last covered position for( int midPos=length-first; midPos>covered; midPos-- ) { if( HasNode( startPos+covered, startPos+midPos-1 ) ) { covered = midPos; splitPoints.push_back( startPos+covered ); // std::cerr << " " << ( startPos+covered ); first = 0; } } } // std::cerr << std::endl; parents.push_back( splitPoints ); } } } return parents; }
HRESULT CKADmerge::CopyNode(IXMLDOMNode ** pXMLDest, IXMLDOMNode ** pXMLSrc, BOOL bOverwrite, string sPath) { HRESULT hRes = 0; IXMLDOMNodeList * pNodeList = NULL; if(*pXMLDest == NULL || *pXMLSrc == NULL) { Log("ERROR: CopyNode " + GetName(*pXMLSrc) + " to " + GetName(*pXMLDest)); hRes = S_FALSE; return hRes; } hRes = (*pXMLSrc)->get_childNodes(&pNodeList); if(SUCCEEDED(hRes)) { LONG lListLength = 0; hRes = pNodeList->get_length(&lListLength); IXMLDOMNode * pCurrentNode = NULL; hRes = pNodeList->nextNode(&pCurrentNode); while(pCurrentNode != NULL) { // iterate through the xml tree string sPatternString = GetPatternString(pCurrentNode, TRUE); IXMLDOMNode * pDestNode = NULL; BOOL bHasNode = HasNode(*pXMLDest, sPatternString, &pDestNode); if(bHasNode && (!m_Overwriteable[GetName(pCurrentNode)] || !bOverwrite )) { // copy child elements CopyNode(&pDestNode, &pCurrentNode, bOverwrite, sPath + "/" + sPatternString); } else if(bHasNode && m_Overwriteable[GetName(pCurrentNode)] && bOverwrite) { // compare element sPatternString = GetPatternString(pCurrentNode, TRUE); bHasNode = HasNode(*pXMLDest, sPatternString, &pDestNode); if(bHasNode) { sPatternString = GetPatternString(pCurrentNode, FALSE); bHasNode = HasNode(*pXMLDest, sPatternString, &pDestNode); if(!bHasNode) { // replace element IXMLDOMNode * pNewNode = NULL; IXMLDOMNode * pXMLOldChild = NULL; hRes = pCurrentNode->cloneNode(VARIANT_TRUE, &pNewNode); hRes = (*pXMLDest)->replaceChild(pNewNode, // new child pDestNode, // old child &pXMLOldChild); // out old child // log changes Log("Replace Element: " + sPath + "/" + sPatternString); if(pNewNode) pNewNode->Release(); if(pXMLOldChild) pXMLOldChild->Release(); m_bIsDirty = TRUE; } } } else if(!bHasNode) { // attach entire sub tree IXMLDOMNode * pDestNode = NULL; IXMLDOMNode * pXMLNewChild = NULL; hRes = pCurrentNode->cloneNode(VARIANT_TRUE, &pDestNode); hRes = (*pXMLDest)->appendChild(pDestNode, // new child &pXMLNewChild); // out new child // log changes sPatternString = GetPatternString(pCurrentNode, FALSE); Log("Attach Element: " + sPath + "/" + sPatternString); if(pDestNode) pDestNode->Release(); if(pXMLNewChild) pXMLNewChild->Release(); m_bIsDirty = TRUE; } hRes = pNodeList->nextNode(&pCurrentNode); } } return hRes; }