void xml_file_free(xml_data_node *node) { /* ensure this is a root node */ assert_always(node->name == NULL, "xml_file_free called with a non-root node"); free_node_recursive(node); }
void xml_file_free(xml_data_node *node) { /* ensure this is a root node */ if (node->name != nullptr) return; free_node_recursive(node); }
void xml_delete_node(xml_data_node *node) { xml_data_node **pnode; /* first unhook us from the list of children of our parent */ for (pnode = &node->parent->child; *pnode; pnode = &(*pnode)->next) if (*pnode == node) { *pnode = node->next; break; } /* now free ourselves and our children */ free_node_recursive(node); }
static void free_node_recursive(xml_data_node *node) { xml_attribute_node *anode, *nanode; xml_data_node *child, *nchild; /* free name/value */ if (node->name != nullptr) free((void *)node->name); if (node->value != nullptr) free((void *)node->value); /* free attributes */ for (anode = node->attribute; anode; anode = nanode) { /* free name/value */ if (anode->name != nullptr) free((void *)anode->name); if (anode->value != nullptr) free((void *)anode->value); /* note the next node and free this node */ nanode = anode->next; free(anode); } /* free the children */ for (child = node->child; child; child = nchild) { /* note the next node and free this node */ nchild = child->next; free_node_recursive(child); } /* finally free ourself */ free(node); }