integrated a couple of fixes and a new API function

* parser.c include/libxml/parserInternals.h tree.c: integrated
  a couple of fixes and a new API function xmlSetEntityReferenceFunc()
  from Keith Isdale and dedicated to xsldbg the XSLT debugger.
Daniel
diff --git a/ChangeLog b/ChangeLog
index d08503d..db91021 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Sun Jan 13 15:07:49 CET 2002 Daniel Veillard <daniel@veillard.com>
+
+	* parser.c include/libxml/parserInternals.h tree.c: integrated
+	  a couple of fixes and a new API function xmlSetEntityReferenceFunc()
+	  from Keith Isdale and dedicated to xsldbg the XSLT debugger.
+
 Sun Jan 13 14:23:21 CET 2002 Daniel Veillard <daniel@veillard.com>
 
 	* threads.c: applied Serguei Narojnyi's patch to add native
diff --git a/include/libxml/parserInternals.h b/include/libxml/parserInternals.h
index 490f9f6..ae23d27 100644
--- a/include/libxml/parserInternals.h
+++ b/include/libxml/parserInternals.h
@@ -394,6 +394,18 @@
 void			htmlInitAutoClose	(void);
 htmlParserCtxtPtr	htmlCreateFileParserCtxt(const char *filename,
 	                                         const char *encoding);
+
+/*
+ * Specific function to keep track of entities references
+ * and used by the XSLT debugger
+ */
+typedef	void	(*xmlEntityReferenceFunc)	(xmlEntityPtr ent,
+						 xmlNodePtr firstNode,
+						 xmlNodePtr lastNode);
+  
+void		xmlSetEntityReferenceFunc	(xmlEntityReferenceFunc func);
+
+
 #endif
 #ifdef __cplusplus
 }
diff --git a/parser.c b/parser.c
index 8122e19..f716418 100644
--- a/parser.c
+++ b/parser.c
@@ -99,6 +99,10 @@
 		      void *user_data, int depth, const xmlChar *URL,
 		      const xmlChar *ID, xmlNodePtr *list);
 
+static void
+xmlAddEntityReference(xmlEntityPtr ent, xmlNodePtr firstNode,
+                      xmlNodePtr lastNode);
+
 /************************************************************************
  *									*
  * 		Parser stacks related functions and macros		*
@@ -5254,8 +5258,10 @@
 					if (list->next == NULL)
 					    ent->last = list;
 					list = list->next;
-				    }
+			 	    }
 				    list = ent->children;
+				    if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)
+				      xmlAddEntityReference(ent, list, NULL);
 				}
 			    } else {
 				while (list != NULL) {
@@ -5297,15 +5303,20 @@
 		     * In the first occurrence list contains the replacement
 		     */
 		    if (list == NULL) {
-			xmlNodePtr new, cur;
+			xmlNodePtr new = NULL, cur, firstChild = NULL;
 			cur = ent->children;
 			while (cur != NULL) {
 			    new = xmlCopyNode(cur, 1);
+			    if (firstChild == NULL){
+			      firstChild = new;
+			    }
 			    xmlAddChild(ctxt->node, new);
 			    if (cur == ent->last)
 				break;
 			    cur = cur->next;
 			}
+			if (ent->etype == XML_EXTERNAL_GENERAL_PARSED_ENTITY)			      
+			  xmlAddEntityReference(ent, firstChild, new);
 		    } else {
 			/*
 			 * the name change is to avoid coalescing of the
@@ -10226,6 +10237,44 @@
     return(xmlSAXParseDoc(NULL, cur, 0));
 }
 
+/************************************************************************
+ *									*
+ * 	Specific function to keep track of entities references		*
+ * 	and used by the XSLT debugger					*
+ *									*
+ ************************************************************************/
+
+static xmlEntityReferenceFunc xmlEntityRefFunc = NULL;
+
+/**
+ * xmlAddEntityReference:
+ * @ent : A valid entity
+ * @firstNode : A valid first node for children of entity
+ * @lastNode : A valid last node of children entity 
+ *
+ * Notify of a reference to an entity of type XML_EXTERNAL_GENERAL_PARSED_ENTITY
+ */
+static void
+xmlAddEntityReference(xmlEntityPtr ent, xmlNodePtr firstNode,
+                      xmlNodePtr lastNode)
+{
+    if (xmlEntityRefFunc != NULL) {
+        (*xmlEntityRefFunc) (ent, firstNode, lastNode);
+    }
+}
+
+
+/**
+ * xmlSetEntityReferenceFunc:
+ * @func : A valid function
+ *
+ * Set the function to call call back when a xml reference has been made
+ */
+void
+xmlSetEntityReferenceFunc(xmlEntityReferenceFunc func)
+{
+    xmlEntityRefFunc = func;
+}
 
 /************************************************************************
  *									*
diff --git a/tree.c b/tree.c
index feabe8b..28f4490 100644
--- a/tree.c
+++ b/tree.c
@@ -2642,9 +2642,13 @@
     ret->parent = target;
     
     if ((cur->ns != NULL) && (target != NULL)) {
-        xmlNsPtr ns;
-
+      xmlNsPtr ns;
+      if (target->doc) 
 	ns = xmlSearchNs(target->doc, target, cur->ns->prefix);
+      else if (cur->doc)  /* target may not yet have a doc : KPI */
+	ns = xmlSearchNs(cur->doc, target, cur->ns->prefix);       
+      else
+	ns = NULL;
 	ret->ns = ns;
     } else
         ret->ns = NULL;
@@ -2786,6 +2790,9 @@
 		     xmlBufferContent(node->content),
 		     xmlBufferLength(node->content));
 #endif
+    }else{
+      if (node->type == XML_ELEMENT_NODE)
+        ret->content = (void*)(long) node->content;
     }
     if (parent != NULL)
         xmlAddChild(parent, ret);