Exemple #1
0
		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;
}