Commit 5335dc52 authored by Daniel Veillard's avatar Daniel Veillard

applied an old patch from Lukas Schroeder to track node creation and

* global.data globals.c tree.c include/libxml/globals.h: applied
  an old patch from Lukas Schroeder to track node creation and
  destruction. Probably missing a lot of references at the moment
  and not usable reliably.
Daniel
parent 8ba1741a
Wed Jan 1 21:57:28 CET 2003 Daniel Veillard <daniel@veillard.com>
* global.data globals.c tree.c include/libxml/globals.h: applied
an old patch from Lukas Schroeder to track node creation and
destruction. Probably missing a lot of references at the moment
and not usable reliably.
Wed Jan 1 20:12:07 CET 2003 Daniel Veillard <daniel@veillard.com>
* NEWS doc/Makefile.am doc/news.xsl: generate the NEWS file
......
......@@ -20,3 +20,5 @@ int,xmlSaveNoEmptyTags
#const xmlChar,xmlStringText,[]
#const xmlChar,xmlStringTextNoenc,[]
int,xmlSubstituteEntitiesDefaultValue
xmlRegisterNodeFunc,xmlRegisterNodeDefaultValue
xmlDeregisterNodeFunc,xmlDeregisterNodeDefaultValue
......@@ -219,6 +219,9 @@ int xmlKeepBlanksDefaultValue = 1;
*/
int xmlSubstituteEntitiesDefaultValue = 0;
xmlRegisterNodeFunc xmlRegisterNodeDefaultValue = NULL;
xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue = NULL;
/*
* Error handling
*/
......@@ -450,8 +453,40 @@ xmlInitializeGlobalState(xmlGlobalStatePtr gs)
gs->xmlPedanticParserDefaultValue = 0;
gs->xmlSaveNoEmptyTags = 0;
gs->xmlSubstituteEntitiesDefaultValue = 0;
gs->xmlRegisterNodeDefaultValue = NULL;
gs->xmlDeregisterNodeDefaultValue = NULL;
}
/**
* xmlRegisterNodeDefault
* @func: function pointer to the new RegisterNodeFunc
*
*/
xmlRegisterNodeFunc
xmlRegisterNodeDefault(xmlRegisterNodeFunc func)
{
xmlRegisterNodeFunc old = xmlRegisterNodeDefaultValue;
xmlRegisterNodeDefaultValue = func;
return(old);
}
/**
* xmlDeegisterNodeDefault
* @func: function pointer to the new DeregisterNodeFunc
*
*/
xmlDeregisterNodeFunc
xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func)
{
xmlDeregisterNodeFunc old = xmlDeregisterNodeDefaultValue;
xmlDeregisterNodeDefaultValue = func;
return(old);
}
#ifdef LIBXML_DOCB_ENABLED
#undef docbDefaultSAXHandler
xmlSAXHandler *
......@@ -651,3 +686,21 @@ __xmlSubstituteEntitiesDefaultValue(void) {
else
return (&xmlGetGlobalState()->xmlSubstituteEntitiesDefaultValue);
}
#undef xmlRegisterNodeDefaultValue
xmlRegisterNodeFunc *
__xmlRegisterNodeDefaultValue(void) {
if (IS_MAIN_THREAD)
return (&xmlRegisterNodeDefaultValue);
else
return (&xmlGetGlobalState()->xmlRegisterNodeDefaultValue);
}
#undef xmlDeregisterNodeDefaultValue
xmlDeregisterNodeFunc *
__xmlDeregisterNodeDefaultValue(void) {
if (IS_MAIN_THREAD)
return (&xmlDeregisterNodeDefaultValue);
else
return (&xmlGetGlobalState()->xmlDeregisterNodeDefaultValue);
}
......@@ -52,6 +52,11 @@ extern "C" {
#undef xmlRealloc
#undef xmlSaveNoEmptyTags
#undef xmlSubstituteEntitiesDefaultValue
#undef xmlRegisterNodeDefaultValue
#undef xmlDeregisterNodeDefaultValue
typedef void (*xmlRegisterNodeFunc)(xmlNodePtr node);
typedef void (*xmlDeregisterNodeFunc)(xmlNodePtr node);
typedef struct _xmlGlobalState xmlGlobalState;
typedef xmlGlobalState *xmlGlobalStatePtr;
......@@ -89,6 +94,9 @@ struct _xmlGlobalState
int xmlSaveNoEmptyTags;
int xmlIndentTreeOutput;
const char *xmlTreeIndentString;
xmlRegisterNodeFunc xmlRegisterNodeDefaultValue;
xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue;
};
#ifdef __cplusplus
......@@ -101,6 +109,9 @@ extern "C" {
void xmlInitializeGlobalState(xmlGlobalStatePtr gs);
xmlRegisterNodeFunc xmlRegisterNodeDefault(xmlRegisterNodeFunc func);
xmlDeregisterNodeFunc xmlDeregisterNodeDefault(xmlDeregisterNodeFunc func);
/*
* In general the memory allocation entry points are not kept
* thread specific but this can be overridden by LIBXML_THREAD_ALLOC_ENABLED
......@@ -329,6 +340,22 @@ extern int *__xmlSubstituteEntitiesDefaultValue(void);
LIBXML_DLL_IMPORT extern int xmlSubstituteEntitiesDefaultValue;
#endif
extern xmlRegisterNodeFunc *__xmlRegisterNodeDefaultValue(void);
#ifdef LIBXML_THREAD_ENABLED
#define xmlRegisterNodeDefaultValue \
(*(__xmlRegisterNodeDefaultValue()))
#else
LIBXML_DLL_IMPORT extern xmlRegisterNodeFunc xmlRegisterNodeDefaultValue;
#endif
extern xmlDeregisterNodeFunc *__xmlDeregisterNodeDefaultValue(void);
#ifdef LIBXML_THREAD_ENABLED
#define xmlDeregisterNodeDefaultValue \
(*(__xmlDeregisterNodeDefaultValue()))
#else
LIBXML_DLL_IMPORT extern xmlDeregisterNodeFunc xmlDeregisterNodeDefaultValue;
#endif
#ifdef __cplusplus
}
#endif
......
......@@ -338,6 +338,8 @@ xmlNewDtd(xmlDocPtr doc, const xmlChar *name,
doc->extSubset = cur;
cur->doc = doc;
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
......@@ -463,6 +465,10 @@ xmlFreeDtd(xmlDtdPtr cur) {
#endif
return;
}
if (xmlDeregisterNodeDefaultValue)
xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
if (cur->children != NULL) {
xmlNodePtr next, c = cur->children;
......@@ -530,6 +536,9 @@ xmlNewDoc(const xmlChar *version) {
cur->compression = -1; /* not initialized */
cur->doc = cur;
cur->charset = XML_CHAR_ENCODING_UTF8;
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
......@@ -550,6 +559,10 @@ xmlFreeDoc(xmlDocPtr cur) {
#endif
return;
}
if (xmlDeregisterNodeDefaultValue)
xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
/*
* Do this before freeing the children list to avoid ID lookups
*/
......@@ -1127,6 +1140,9 @@ xmlNewProp(xmlNodePtr node, const xmlChar *name, const xmlChar *value) {
cur->prev = prev;
}
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
......@@ -1204,6 +1220,9 @@ xmlNewNsProp(xmlNodePtr node, xmlNsPtr ns, const xmlChar *name,
cur->prev = prev;
}
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
......@@ -1333,6 +1352,9 @@ xmlNewDocProp(xmlDocPtr doc, const xmlChar *name, const xmlChar *value) {
tmp = tmp->next;
}
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
......@@ -1374,6 +1396,10 @@ xmlFreeProp(xmlAttrPtr cur) {
#endif
return;
}
if (xmlDeregisterNodeDefaultValue)
xmlDeregisterNodeDefaultValue((xmlNodePtr)cur);
/* Check for ID removal -> leading to invalid references ! */
if ((cur->parent != NULL) && (cur->parent->doc != NULL) &&
((cur->parent->doc->intSubset != NULL) ||
......@@ -1471,6 +1497,9 @@ xmlNewPI(const xmlChar *name, const xmlChar *content) {
if (content != NULL) {
cur->content = xmlStrdup(content);
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue((xmlNodePtr)cur);
return(cur);
}
......@@ -1509,6 +1538,9 @@ xmlNewNode(xmlNsPtr ns, const xmlChar *name) {
cur->name = xmlStrdup(name);
cur->ns = ns;
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue(cur);
return(cur);
}
......@@ -1579,6 +1611,7 @@ xmlNewDocNode(xmlDocPtr doc, xmlNsPtr ns,
UPDATE_LAST_CHILD_AND_PARENT(cur)
}
}
return(cur);
}
......@@ -1667,6 +1700,9 @@ xmlNewDocFragment(xmlDocPtr doc) {
cur->type = XML_DOCUMENT_FRAG_NODE;
cur->doc = doc;
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue(cur);
return(cur);
}
......@@ -1697,6 +1733,9 @@ xmlNewText(const xmlChar *content) {
if (content != NULL) {
cur->content = xmlStrdup(content);
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue(cur);
return(cur);
}
......@@ -1797,6 +1836,9 @@ xmlNewCharRef(xmlDocPtr doc, const xmlChar *name) {
cur->name = xmlStrndup(name, len);
} else
cur->name = xmlStrdup(name);
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue(cur);
return(cur);
}
......@@ -1848,6 +1890,9 @@ xmlNewReference(xmlDocPtr doc, const xmlChar *name) {
cur->children = (xmlNodePtr) ent;
cur->last = (xmlNodePtr) ent;
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue(cur);
return(cur);
}
......@@ -1896,6 +1941,9 @@ xmlNewTextLen(const xmlChar *content, int len) {
if (content != NULL) {
cur->content = xmlStrndup(content, len);
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue(cur);
return(cur);
}
......@@ -1945,6 +1993,9 @@ xmlNewComment(const xmlChar *content) {
if (content != NULL) {
cur->content = xmlStrdup(content);
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue(cur);
return(cur);
}
......@@ -1977,6 +2028,9 @@ xmlNewCDataBlock(xmlDocPtr doc, const xmlChar *content, int len) {
if (content != NULL) {
cur->content = xmlStrndup(content, len);
}
if (xmlRegisterNodeDefaultValue)
xmlRegisterNodeDefaultValue(cur);
return(cur);
}
......@@ -2398,6 +2452,9 @@ xmlAddChildList(xmlNodePtr parent, xmlNodePtr cur) {
/*
* add the first element at the end of the children list.
*/
if (cur->parent == parent)
return(cur);
if (parent->children == NULL) {
parent->children = cur;
} else {
......@@ -2407,7 +2464,7 @@ xmlAddChildList(xmlNodePtr parent, xmlNodePtr cur) {
if ((cur->type == XML_TEXT_NODE) &&
(parent->last->type == XML_TEXT_NODE) &&
(cur->name == parent->last->name)) {
xmlNodeAddContent(parent->last, cur->content);
xmlNodeAddContent(parent->last, cur->content);
/*
* if it's the only child, nothing more to be done.
*/
......@@ -2477,13 +2534,15 @@ xmlAddChild(xmlNodePtr parent, xmlNodePtr cur) {
*/
if (cur->type == XML_TEXT_NODE) {
if ((parent->type == XML_TEXT_NODE) &&
(parent->content != NULL)) {
(parent->content != NULL) &&
(parent != cur)) {
xmlNodeAddContent(parent, cur->content);
xmlFreeNode(cur);
return(parent);
}
if ((parent->last != NULL) && (parent->last->type == XML_TEXT_NODE) &&
(parent->last->name == cur->name)) {
(parent->last->name == cur->name) &&
(parent->last != cur)) {
xmlNodeAddContent(parent->last, cur->content);
xmlFreeNode(cur);
return(parent->last);
......@@ -2493,16 +2552,23 @@ xmlAddChild(xmlNodePtr parent, xmlNodePtr cur) {
/*
* add the new element at the end of the children list.
*/
prev = cur->parent;
cur->parent = parent;
if (cur->doc != parent->doc) {
xmlSetTreeDoc(cur, parent->doc);
}
/* this check prevents a loop on tree-traversions if a developer
* tries to add a node to its parent multiple times
*/
if (prev == parent)
return(cur);
/*
* Coalescing
*/
if ((parent->type == XML_TEXT_NODE) &&
(parent->content != NULL)) {
(parent->content != NULL) &&
(parent != cur)) {
xmlNodeAddContent(parent, cur->content);
xmlFreeNode(cur);
return(parent);
......@@ -2588,6 +2654,10 @@ xmlFreeNodeList(xmlNodePtr cur) {
next = cur->next;
/* unroll to speed up freeing the document */
if (cur->type != XML_DTD_NODE) {
if (xmlDeregisterNodeDefaultValue)
xmlDeregisterNodeDefaultValue(cur);
if ((cur->children != NULL) &&
(cur->type != XML_ENTITY_REF_NODE))
xmlFreeNodeList(cur->children);
......@@ -2655,6 +2725,7 @@ xmlFreeNode(xmlNodePtr cur) {
#endif
return;
}
/* use xmlFreeDtd for DTD nodes */
if (cur->type == XML_DTD_NODE) {
xmlFreeDtd((xmlDtdPtr) cur);
......@@ -2668,6 +2739,10 @@ xmlFreeNode(xmlNodePtr cur) {
xmlFreeProp((xmlAttrPtr) cur);
return;
}
if (xmlDeregisterNodeDefaultValue)
xmlDeregisterNodeDefaultValue(cur);
if ((cur->children != NULL) &&
(cur->type != XML_ENTITY_REF_NODE))
xmlFreeNodeList(cur->children);
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment