Index: tree.c =================================================================== RCS file: /cvs/gnome/gnome-xml/tree.c,v retrieving revision 1.206 diff -u -b -r1.206 tree.c --- tree.c 2002/05/05 06:57:27 1.206 +++ tree.c 2002/05/16 19:42:41 @@ -2245,6 +2245,9 @@ /* * 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 { @@ -2324,13 +2327,15 @@ */ 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); @@ -2340,16 +2345,23 @@ /* * 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 it's 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);