handling of PIs and <?sgml-declaration in entities. Daniel
* DOCBparser.c: handling of PIs and <?sgml-declaration in entities.
Daniel
diff --git a/ChangeLog b/ChangeLog
index 559a3c8..f03af1c 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,7 @@
+Mon Jun 11 19:29:40 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
+
+ * DOCBparser.c: handling of PIs and <?sgml-declaration in entities.
+
Tue Jun 12 08:46:28 CEST 2001 Daniel Veillard <Daniel.Veillard@imag.fr>
* valid.c: fixed bug #56049, forgot one check in the
diff --git a/DOCBparser.c b/DOCBparser.c
index a1a8bbf..49ea57b 100644
--- a/DOCBparser.c
+++ b/DOCBparser.c
@@ -4135,104 +4135,113 @@
* Parse a content: comment, sub-element, reference or text.
*
*/
-
static void
-docbParseContent(docbParserCtxtPtr ctxt) {
+docbParseContent(docbParserCtxtPtr ctxt)
+{
xmlChar *currentNode;
int depth;
currentNode = xmlStrdup(ctxt->name);
depth = ctxt->nameNr;
while (1) {
- long cons = ctxt->nbChars;
+ long cons = ctxt->nbChars;
GROW;
- /*
- * Our tag or one of it's parent or children is ending.
- */
+ /*
+ * Our tag or one of it's parent or children is ending.
+ */
if ((CUR == '<') && (NXT(1) == '/')) {
- docbParseEndTag(ctxt);
- if (currentNode != NULL) xmlFree(currentNode);
- return;
+ docbParseEndTag(ctxt);
+ if (currentNode != NULL)
+ xmlFree(currentNode);
+ return;
}
- /*
- * Has this node been popped out during parsing of
- * the next element
- */
+ /*
+ * Has this node been popped out during parsing of
+ * the next element
+ */
if ((!xmlStrEqual(currentNode, ctxt->name)) &&
- (depth >= ctxt->nameNr)) {
- if (currentNode != NULL) xmlFree(currentNode);
- return;
- }
+ (depth >= ctxt->nameNr)) {
+ if (currentNode != NULL)
+ xmlFree(currentNode);
+ return;
+ }
- /*
- * Sometimes DOCTYPE arrives in the middle of the document
- */
- if ((CUR == '<') && (NXT(1) == '!') &&
- (UPP(2) == 'D') && (UPP(3) == 'O') &&
- (UPP(4) == 'C') && (UPP(5) == 'T') &&
- (UPP(6) == 'Y') && (UPP(7) == 'P') &&
- (UPP(8) == 'E')) {
- if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
- ctxt->sax->error(ctxt->userData,
- "Misplaced DOCTYPE declaration\n");
- ctxt->wellFormed = 0;
- docbParseDocTypeDecl(ctxt);
- }
+ /*
+ * Sometimes DOCTYPE arrives in the middle of the document
+ */
+ if ((CUR == '<') && (NXT(1) == '!') &&
+ (UPP(2) == 'D') && (UPP(3) == 'O') &&
+ (UPP(4) == 'C') && (UPP(5) == 'T') &&
+ (UPP(6) == 'Y') && (UPP(7) == 'P') && (UPP(8) == 'E')) {
+ if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
+ ctxt->sax->error(ctxt->userData,
+ "Misplaced DOCTYPE declaration\n");
+ ctxt->wellFormed = 0;
+ docbParseDocTypeDecl(ctxt);
+ }
- /*
- * First case : a comment
- */
- if ((CUR == '<') && (NXT(1) == '!') &&
- (NXT(2) == '-') && (NXT(3) == '-')) {
- docbParseComment(ctxt);
- }
+ /*
+ * First case : a comment
+ */
+ if ((CUR == '<') && (NXT(1) == '!') &&
+ (NXT(2) == '-') && (NXT(3) == '-')) {
+ docbParseComment(ctxt);
+ }
+
+ /*
+ * Second case : a PI
+ */
+ else if ((RAW == '<') && (NXT(1) == '?')) {
+ docbParsePI(ctxt);
+ }
- /*
- * Second case : a sub-element.
- */
- else if (CUR == '<') {
- docbParseElement(ctxt);
- }
+ /*
+ * Third case : a sub-element.
+ */
+ else if (CUR == '<') {
+ docbParseElement(ctxt);
+ }
- /*
- * Third case : a reference. If if has not been resolved,
- * parsing returns it's Name, create the node
- */
- else if (CUR == '&') {
- docbParseReference(ctxt);
- }
+ /*
+ * Fourth case : a reference. If if has not been resolved,
+ * parsing returns it's Name, create the node
+ */
+ else if (CUR == '&') {
+ docbParseReference(ctxt);
+ }
- /*
- * Fourth : end of the resource
- */
- else if (CUR == 0) {
- docbAutoClose(ctxt, NULL);
- if (ctxt->nameNr == 0)
- break;
- }
+ /*
+ * Fifth : end of the resource
+ */
+ else if (CUR == 0) {
+ docbAutoClose(ctxt, NULL);
+ if (ctxt->nameNr == 0)
+ break;
+ }
- /*
- * Last case, text. Note that References are handled directly.
- */
- else {
- docbParseCharData(ctxt);
- }
+ /*
+ * Last case, text. Note that References are handled directly.
+ */
+ else {
+ docbParseCharData(ctxt);
+ }
- if (cons == ctxt->nbChars) {
- if (ctxt->node != NULL) {
- if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
- ctxt->sax->error(ctxt->userData,
- "detected an error in element content\n");
- ctxt->wellFormed = 0;
- }
- break;
- }
+ if (cons == ctxt->nbChars) {
+ if (ctxt->node != NULL) {
+ if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
+ ctxt->sax->error(ctxt->userData,
+ "detected an error in element content\n");
+ ctxt->wellFormed = 0;
+ }
+ break;
+ }
GROW;
}
- if (currentNode != NULL) xmlFree(currentNode);
+ if (currentNode != NULL)
+ xmlFree(currentNode);
}
/**
@@ -4822,11 +4831,11 @@
(NXT(2) == '-') && (NXT(3) == '-')) ||
IS_BLANK(CUR)) {
if ((RAW == '<') && (NXT(1) == '?')) {
- docbParsePI(ctxt); /* TODO: SGML PIs differs */
- } else if (IS_BLANK(CUR)) {
- NEXT;
- } else
- xmlParseComment(ctxt);
+ docbParsePI(ctxt);
+ } else if (IS_BLANK(CUR)) {
+ NEXT;
+ } else
+ xmlParseComment(ctxt);
}
}