/*================================================================ * ixmlNode_cloneAttrDirect * Return a clone of attribute node, with specified field set * to TRUE. * *=================================================================*/ IXML_Attr * ixmlNode_cloneAttrDirect( IN IXML_Attr * nodeptr ) { IXML_Attr *newAttr; assert( nodeptr != NULL ); newAttr = ixmlNode_cloneAttr( nodeptr ); if( newAttr != NULL ) { newAttr->specified = TRUE; } return newAttr; }
/*! * \brief Return a clone of attribute node, with specified field set to TRUE. * * \return A clone of attribute node, with specified field set to TRUE. */ static IXML_Attr *ixmlNode_cloneAttrDirect( /*! [in] The \b Node to clone. */ IXML_Attr *nodeptr) { IXML_Attr *newAttr; assert(nodeptr != NULL); newAttr = ixmlNode_cloneAttr(nodeptr); if (newAttr != NULL) { newAttr->specified = TRUE; } return newAttr; }
/*================================================================ * ixmlNode_cloneNodeTreeRecursive * recursive functions that clones node tree of nodeptr. * Internal to parser only. * *=================================================================*/ IXML_Node * ixmlNode_cloneNodeTreeRecursive( IN IXML_Node * nodeptr, IN BOOL deep ) { IXML_Node *newNode = NULL; IXML_Element *newElement; IXML_Attr *newAttr = NULL; IXML_CDATASection *newCDATA = NULL; IXML_Document *newDoc; IXML_Node *nextSib; if( nodeptr != NULL ) { switch ( nodeptr->nodeType ) { case eELEMENT_NODE: newElement = ixmlNode_cloneElement( ( IXML_Element * ) nodeptr ); newElement->n.firstAttr = ixmlNode_cloneNodeTreeRecursive( nodeptr->firstAttr, deep ); if( deep ) { newElement->n.firstChild = ixmlNode_cloneNodeTreeRecursive( nodeptr-> firstChild, deep ); if( newElement->n.firstChild != NULL ) { ( newElement->n.firstChild )->parentNode = ( IXML_Node * ) newElement; ixmlNode_setSiblingNodesParent( newElement->n. firstChild ); } nextSib = ixmlNode_cloneNodeTreeRecursive( nodeptr-> nextSibling, deep ); newElement->n.nextSibling = nextSib; if( nextSib != NULL ) { nextSib->prevSibling = ( IXML_Node * ) newElement; } } newNode = ( IXML_Node * ) newElement; break; case eATTRIBUTE_NODE: newAttr = ixmlNode_cloneAttr( ( IXML_Attr * ) nodeptr ); nextSib = ixmlNode_cloneNodeTreeRecursive( nodeptr->nextSibling, deep ); newAttr->n.nextSibling = nextSib; if( nextSib != NULL ) { nextSib->prevSibling = ( IXML_Node * ) newAttr; } newNode = ( IXML_Node * ) newAttr; break; case eTEXT_NODE: newNode = ixmlNode_cloneTextNode( nodeptr ); break; case eCDATA_SECTION_NODE: newCDATA = ixmlNode_cloneCDATASect( ( IXML_CDATASection * ) nodeptr ); newNode = ( IXML_Node * ) newCDATA; break; case eDOCUMENT_NODE: newDoc = ixmlNode_cloneDoc( ( IXML_Document * ) nodeptr ); newNode = ( IXML_Node * ) newDoc; if( deep ) { newNode->firstChild = ixmlNode_cloneNodeTreeRecursive( nodeptr-> firstChild, deep ); if( newNode->firstChild != NULL ) { newNode->firstChild->parentNode = newNode; } } break; case eINVALID_NODE: case eENTITY_REFERENCE_NODE: case eENTITY_NODE: case ePROCESSING_INSTRUCTION_NODE: case eCOMMENT_NODE: case eDOCUMENT_TYPE_NODE: case eDOCUMENT_FRAGMENT_NODE: case eNOTATION_NODE: break; } } return newNode; }