- parser.c SAX.c: the new content parsing code raised an
  ugly bug in the characters() SAX callback. Found it
  just because of strangeness in XSLT XML Rec ouptut :-(
Daniel
diff --git a/ChangeLog b/ChangeLog
index 528d74e..83c0761 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,9 @@
+Wed Mar  7 20:43:47 CET 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
+
+	* parser.c SAX.c: the new content parsing code raised an
+	  ugly bug in the characters() SAX callback. Found it
+	  just because of strangeness in XSLT XML Rec ouptut :-(
+
 Wed Mar  7 16:50:22 CET 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
 
 	* Makefile.am: Martin Baulig suggested to add -lm
diff --git a/SAX.c b/SAX.c
index d7e256b..5882d41 100644
--- a/SAX.c
+++ b/SAX.c
@@ -1189,7 +1189,8 @@
 	}
 #endif
     } else {
-	if ((xmlNodeIsText(lastChild)) && (ctxt->nodemem != 0)) {
+	int isText = xmlNodeIsText(lastChild);
+	if ((isText) && (ctxt->nodemem != 0)) {
 #ifndef XML_USE_BUFFER_CONTENT
 	    /*
 	     * The whole point of maintaining nodelen and nodemem,
@@ -1220,6 +1221,12 @@
 #else
 	    xmlTextConcat(lastChild, ch, len);
 #endif
+	} else if (isText) {
+	    xmlTextConcat(lastChild, ch, len);
+	    if (ctxt->node->children != NULL) {
+		ctxt->nodelen = xmlStrlen(lastChild->content);
+		ctxt->nodemem = ctxt->nodelen + 1;
+	    }
 	} else {
 	    /* Mixed content, first time */
 	    lastChild = xmlNewTextLen(ch, len);
diff --git a/parser.c b/parser.c
index 707bf8a..bc85020 100644
--- a/parser.c
+++ b/parser.c
@@ -2450,15 +2450,17 @@
 		continue; /* while */
 	    }
 	    nbchar = in - ctxt->input->cur;
-	    if (IS_BLANK(*ctxt->input->cur) &&
-		areBlanks(ctxt, ctxt->input->cur, nbchar)) {
-		if (ctxt->sax->ignorableWhitespace != NULL)
-		    ctxt->sax->ignorableWhitespace(ctxt->userData,
-					   ctxt->input->cur, nbchar);
-	    } else {
-		if (ctxt->sax->characters != NULL)
-		    ctxt->sax->characters(ctxt->userData,
-					  ctxt->input->cur, nbchar);
+	    if (nbchar > 0) {
+		if (IS_BLANK(*ctxt->input->cur) &&
+		    areBlanks(ctxt, ctxt->input->cur, nbchar)) {
+		    if (ctxt->sax->ignorableWhitespace != NULL)
+			ctxt->sax->ignorableWhitespace(ctxt->userData,
+					       ctxt->input->cur, nbchar);
+		} else {
+		    if (ctxt->sax->characters != NULL)
+			ctxt->sax->characters(ctxt->userData,
+					      ctxt->input->cur, nbchar);
+		}
 	    }
 	    ctxt->input->cur = in;
 	    if (*in == 0xD) {
@@ -2471,7 +2473,10 @@
 		}
 		in--;
 	    }
-	    if ((*in == '<') || (*in == '&')) {
+	    if (*in == '<') {
+		return;
+	    }
+	    if (*in == '&') {
 		return;
 	    }
 	    SHRINK;