void domNodeDestroy(DOM_NODE *node) { DOM_NODE *curr, *next; if (!node) return; curr = node->firstChild; while (curr) { next = curr->nextSibling; domNodeDestroy(curr); curr = next; } if (!node->parent) { for (curr = node->nextSibling; curr; curr = curr->nextSibling) domNodeDestroy(curr); } domNodeDestroySpecific(node); }
void domNodeDestroySpecific(DOM_NODE *node) { domNodeDestroy(node->attributes); if (node->name) free(node->name); if (node->value) free(node->value); domNodeRemoveChild(node->parent, node); free(node); }
void CLocalHtmlFile::Filter(DOM_NODE *node) { LOG1(5, "CLocalHtmlFile::Filter(%p)", node); DOM_NODE *child = domNodeGetFirstChild(node); while (child != NULL) { const char *tag = domNodeGetName(child); if (_stricmp(tag, "script") == 0 || _stricmp(tag, "noscript") == 0 || _stricmp(tag, "style") == 0 || _stricmp(tag, "link") == 0 || _stricmp(tag, "iframe") == 0 || _stricmp(tag, "object") == 0 || _stricmp(tag, "param") == 0 || _stricmp(tag, "embed") == 0 || _stricmp(tag, "meta") == 0) { domNodeDestroy(child->attributes); child->attributes = NULL; Filter(child); child = domNodeGetNextSibling(child); } else if (_strnicmp(tag, "![", 2) == 0) { DOM_NODE *prev = domNodeGetPreviousSibling(child); for (DOM_NODE *curr = child->firstChild; curr; curr = curr->nextSibling) curr->parent = node; DOM_NODE *firstChild = child->firstChild; if (firstChild != NULL) { child->firstChild->prevSibling = prev; child->lastChild->nextSibling = child->nextSibling; if (child->nextSibling != NULL) child->nextSibling->prevSibling = child->lastChild; else child->lastChild->nextSibling = NULL; if (prev == NULL) node->firstChild = child->firstChild; else prev->nextSibling = child->firstChild; } else { firstChild = child->nextSibling; if (prev == NULL) node->firstChild = child->nextSibling; else prev->nextSibling = child->nextSibling; if (child->nextSibling != NULL) child->nextSibling->prevSibling = prev; else node->firstChild = NULL; } domNodeDestroy(child->attributes); if (child->name) free(child->name); if (child->value) free(child->value); free(child); child = firstChild; } else { Filter(child); child = domNodeGetNextSibling(child); } } }