static void mxmlRemoveRef( mxml_node_t * node ) { if( node->parent ) { mxmlRemove( node ); mxmlRelease( node ); } }
static void hbmxml_relese( mxml_node_t * node ) { void * user_data; if( mxmlGetRefCount( node ) <= ( node->parent ? 2 : 1 ) ) { /* remove userData when last HVM item with given node is cleared * It's not nice solution because node can still exists and can * be extracted yet but there is not destructor for userData * in MXML library so we have no choice :-( [druzus] */ if( ( user_data = mxmlGetUserData( node ) ) != NULL ) { mxmlSetUserData( node, NULL ); hb_itemRelease( ( PHB_ITEM ) user_data ); } } mxmlRelease( node ); }
void mxmlDelete(mxml_node_t *node) /* I - Node to delete */ { int i; /* Looping var */ #ifdef DEBUG fprintf(stderr, "mxmlDelete(node=%p)\n", node); #endif /* DEBUG */ /* * Range check input... */ if (!node) return; /* * Remove the node from its parent, if any... */ mxmlRemove(node); /* * Delete children... */ while (node->child) { mxml_node_t *child = node->child; mxmlRemove(child); mxmlRelease(child); } /* * Now delete any node data... */ switch (node->type) { case MXML_ELEMENT : if (node->value.element.name) free(node->value.element.name); if (node->value.element.num_attrs) { for (i = 0; i < node->value.element.num_attrs; i ++) { if (node->value.element.attrs[i].name) free(node->value.element.attrs[i].name); if (node->value.element.attrs[i].value) free(node->value.element.attrs[i].value); } free(node->value.element.attrs); } break; case MXML_INTEGER : /* Nothing to do */ break; case MXML_OPAQUE : if (node->value.opaque) free(node->value.opaque); break; case MXML_REAL : /* Nothing to do */ break; case MXML_TEXT : if (node->value.text.string) free(node->value.text.string); break; case MXML_CUSTOM : if (node->value.custom.data && node->value.custom.destroy) (*(node->value.custom.destroy))(node->value.custom.data); break; default : break; } /* * Free this node... */ free(node); }