A few serious bugfixes:
- parser.[ch] parserInternals.c: applied the conditional
section processing fix from Jonathan P Springer
<jonathan.springer2@gte.net>
- xmlversion.h.in win32/libxml2/libxml2.dsp : Updated MS
project file, fixed iconv default non support
- xpath.c: fixed the problem of evaluating relative expressions
when a node context is provided.
Daniel
diff --git a/ChangeLog b/ChangeLog
index 53a0ad5..9fd2083 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,13 @@
+Mon Nov 13 12:39:38 CET 2000 Daniel Veillard <Daniel.Veillard@w3.org>
+
+ * parser.[ch] parserInternals.c: applied the conditional
+ section processing fix from Jonathan P Springer
+ <jonathan.springer2@gte.net>
+ * xmlversion.h.in win32/libxml2/libxml2.dsp : Updated MS
+ project file, fixed iconv default non support
+ * xpath.c: fixed the problem of evaluating relative expressions
+ when a node context is provided.
+
Sun Nov 12 16:31:19 CET 2000 Daniel Veillard <Daniel.Veillard@w3.org>
* nanoftp.c: fixed gcc 2.95 new warnings
diff --git a/include/libxml/parser.h b/include/libxml/parser.h
index 3d7eb43..ac398b7 100644
--- a/include/libxml/parser.h
+++ b/include/libxml/parser.h
@@ -99,7 +99,8 @@
XML_PARSER_ENTITY_VALUE, /* within an entity value in a decl */
XML_PARSER_ATTRIBUTE_VALUE, /* within an attribute value */
XML_PARSER_SYSTEM_LITERAL, /* within a SYSTEM value */
- XML_PARSER_EPILOG /* the Misc* after the last end tag */
+ XML_PARSER_EPILOG, /* the Misc* after the last end tag */
+ XML_PARSER_IGNORE /* within an IGNORED section */
} xmlParserInputState;
/**
diff --git a/include/libxml/xmlversion.h.in b/include/libxml/xmlversion.h.in
index 86f8855..71ab184 100644
--- a/include/libxml/xmlversion.h.in
+++ b/include/libxml/xmlversion.h.in
@@ -89,11 +89,13 @@
/*
* Whether iconv support is available
*/
+#ifndef WIN32
#if @WITH_ICONV@
#define LIBXML_ICONV_ENABLED
#else
#define LIBXML_ICONV_DISABLED
#endif
+#endif
/*
* Whether Debugging module is configured in
diff --git a/parser.c b/parser.c
index 054f630..16929b6 100644
--- a/parser.c
+++ b/parser.c
@@ -661,6 +661,9 @@
*/
if ((ctxt->external == 0) && (ctxt->inputNr == 1))
return;
+ break;
+ case XML_PARSER_IGNORE:
+ return;
}
NEXT;
@@ -4501,6 +4504,8 @@
} else if ((RAW == 'I') && (NXT(1) == 'G') && (NXT(2) == 'N') &&
(NXT(3) == 'O') && (NXT(4) == 'R') && (NXT(5) == 'E')) {
int state;
+ int instate;
+ int depth = 0;
SKIP(6);
SKIP_BLANKS;
@@ -4528,40 +4533,27 @@
* But disable SAX event generating DTD building in the meantime
*/
state = ctxt->disableSAX;
+ instate = ctxt->instate;
ctxt->disableSAX = 1;
- while ((RAW != 0) && ((RAW != ']') || (NXT(1) != ']') ||
- (NXT(2) != '>'))) {
- const xmlChar *check = CUR_PTR;
- int cons = ctxt->input->consumed;
- int tok = ctxt->token;
+ ctxt->instate = XML_PARSER_IGNORE;
- if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) {
- xmlParseConditionalSections(ctxt);
- } else if (IS_BLANK(CUR)) {
- NEXT;
- } else if (RAW == '%') {
- xmlParsePEReference(ctxt);
- } else
- xmlParseMarkupDecl(ctxt);
-
- /*
- * Pop-up of finished entities.
- */
- while ((RAW == 0) && (ctxt->inputNr > 1))
- xmlPopInput(ctxt);
-
- if ((CUR_PTR == check) && (cons == ctxt->input->consumed) &&
- (tok == ctxt->token)) {
- ctxt->errNo = XML_ERR_EXT_SUBSET_NOT_FINISHED;
- if ((ctxt->sax != NULL) && (ctxt->sax->error != NULL))
- ctxt->sax->error(ctxt->userData,
- "Content error in the external subset\n");
- ctxt->wellFormed = 0;
- ctxt->disableSAX = 1;
- break;
- }
+ while (depth >= 0) {
+ if ((RAW == '<') && (NXT(1) == '!') && (NXT(2) == '[')) {
+ depth++;
+ SKIP(3);
+ continue;
+ }
+ if ((RAW == ']') && (NXT(1) == ']') && (NXT(2) == '>')) {
+ if (--depth >= 0) SKIP(3);
+ continue;
+ }
+ NEXT;
+ continue;
}
+
ctxt->disableSAX = state;
+ ctxt->instate = instate;
+
if (xmlParserDebugEntities) {
if ((ctxt->input != NULL) && (ctxt->input->filename))
xmlGenericError(xmlGenericErrorContext,
@@ -7379,6 +7371,9 @@
case XML_PARSER_PI:
xmlGenericError(xmlGenericErrorContext,
"PP: try PI\n");break;
+ case XML_PARSER_IGNORE:
+ xmlGenericError(xmlGenericErrorContext,
+ "PP: try IGNORE\n");break;
}
#endif
@@ -7590,6 +7585,15 @@
#endif
}
break;
+ case XML_PARSER_IGNORE:
+ xmlGenericError(xmlGenericErrorContext,
+ "PP: internal error, state == IGNORE");
+ ctxt->instate = XML_PARSER_DTD;
+#ifdef DEBUG_PUSH
+ xmlGenericError(xmlGenericErrorContext,
+ "PP: entering DTD\n");
+#endif
+ break;
case XML_PARSER_PROLOG:
SKIP_BLANKS;
if (ctxt->input->buf == NULL)
diff --git a/parser.h b/parser.h
index 3d7eb43..ac398b7 100644
--- a/parser.h
+++ b/parser.h
@@ -99,7 +99,8 @@
XML_PARSER_ENTITY_VALUE, /* within an entity value in a decl */
XML_PARSER_ATTRIBUTE_VALUE, /* within an attribute value */
XML_PARSER_SYSTEM_LITERAL, /* within a SYSTEM value */
- XML_PARSER_EPILOG /* the Misc* after the last end tag */
+ XML_PARSER_EPILOG, /* the Misc* after the last end tag */
+ XML_PARSER_IGNORE /* within an IGNORED section */
} xmlParserInputState;
/**
diff --git a/parserInternals.c b/parserInternals.c
index 6ab5c5b..d9cde91 100644
--- a/parserInternals.c
+++ b/parserInternals.c
@@ -3196,6 +3196,8 @@
case XML_PARSER_ATTRIBUTE_VALUE:
/* ctxt->token = xmlParseCharRef(ctxt); */
return;
+ case XML_PARSER_IGNORE:
+ return;
}
return;
}
@@ -3268,6 +3270,8 @@
ctxt->wellFormed = 0;
ctxt->disableSAX = 1;
return;
+ case XML_PARSER_IGNORE:
+ return;
}
/* TODO: this seems not reached anymore .... Verify ... */
diff --git a/win32/libxml2/libxml2.dsp b/win32/libxml2/libxml2.dsp
index 52c24fd..14dbb22 100644
--- a/win32/libxml2/libxml2.dsp
+++ b/win32/libxml2/libxml2.dsp
@@ -26,7 +26,6 @@
# PROP Scc_ProjName ""
# PROP Scc_LocalPath ""
CPP=cl.exe
-F90=df.exe
RSC=rc.exe
!IF "$(CFG)" == "libxml2 - Win32 Release"
@@ -41,6 +40,7 @@
# PROP Output_Dir "Release"
# PROP Intermediate_Dir "Release"
# PROP Target_Dir ""
+F90=df.exe
# ADD BASE F90 /include:"Release/"
# ADD F90 /include:"Release/"
# ADD BASE CPP /nologo /W3 /GX /O2 /D "WIN32" /D "NDEBUG" /D "_MBCS" /D "_LIB" /YX /FD /c
@@ -66,6 +66,7 @@
# PROP Output_Dir "Debug"
# PROP Intermediate_Dir "Debug"
# PROP Target_Dir ""
+F90=df.exe
# ADD BASE F90 /include:"Debug/"
# ADD F90 /include:"Debug/"
# ADD BASE CPP /nologo /W3 /Gm /GX /ZI /Od /D "WIN32" /D "_DEBUG" /D "_MBCS" /D "_LIB" /YX /FD /GZ /c
@@ -106,6 +107,10 @@
# End Source File
# Begin Source File
+SOURCE=..\..\hash.c
+# End Source File
+# Begin Source File
+
SOURCE=..\..\HTMLparser.c
# End Source File
# Begin Source File
diff --git a/xmlversion.h.in b/xmlversion.h.in
index 86f8855..71ab184 100644
--- a/xmlversion.h.in
+++ b/xmlversion.h.in
@@ -89,11 +89,13 @@
/*
* Whether iconv support is available
*/
+#ifndef WIN32
#if @WITH_ICONV@
#define LIBXML_ICONV_ENABLED
#else
#define LIBXML_ICONV_DISABLED
#endif
+#endif
/*
* Whether Debugging module is configured in
diff --git a/xpath.c b/xpath.c
index 6b95b5a..2991711 100644
--- a/xpath.c
+++ b/xpath.c
@@ -5520,7 +5520,7 @@
xmlXPathObjectPtr
xmlXPathEval(const xmlChar *str, xmlXPathContextPtr ctx) {
xmlXPathParserContextPtr ctxt;
- xmlXPathObjectPtr res = NULL, tmp;
+ xmlXPathObjectPtr res = NULL, tmp, init = NULL;
int stack = 0;
xmlXPathInit();
@@ -5528,6 +5528,10 @@
CHECK_CONTEXT(ctx)
ctxt = xmlXPathNewParserContext(str, ctx);
+ if (ctx->node != NULL) {
+ init = xmlXPathNewNodeSet(ctx->node);
+ valuePush(ctxt, init);
+ }
xmlXPathEvalExpr(ctxt);
if (ctxt->value == NULL) {
@@ -5540,8 +5544,9 @@
do {
tmp = valuePop(ctxt);
if (tmp != NULL) {
+ if (tmp != init)
+ stack++;
xmlXPathFreeObject(tmp);
- stack++;
}
} while (tmp != NULL);
if (stack != 0) {