better SAX interfaces. preparing for 1.7.2, Daniel.
diff --git a/ChangeLog b/ChangeLog
index 855eaed..4c29eee 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,13 +1,21 @@
-Fri Sep 24 16:01:01 CEST 1999
+Sun Sep 26 13:16:54 CEST 1999 Daniel Veillard <Daniel.Veillard@w3.org>
+
+ * parser.[ch] : added xmlSAXUserParseFile() and xmlSAXUserParseMemory()
+ better SAX interfaces.
+ * testSAX.c: uses the new SAX routine, avoid fetching any remote
+ entity.
+ * configure.in: 1.7.2
+
+Fri Sep 24 16:01:01 CEST 1999 Daniel Veillard <Daniel.Veillard@w3.org>
* libxml.spec.in: fixed the URL
* doc/xml.html: improved the documentation front-end
-Fri Sep 24 01:06:36 CEST 1999
+Fri Sep 24 01:06:36 CEST 1999 Daniel Veillard <Daniel.Veillard@w3.org>
* nanohttp.c: conditionned references to snprintf with HAVE_SNPRINTF
-Fri Sep 24 00:15:58 CEST 1999
+Fri Sep 24 00:15:58 CEST 1999 Daniel Veillard <Daniel.Veillard@w3.org>
* libxml.spec.in: fixed the alpha compile problem
* parser.[ch]: changed errno to errNo in the parser context :-(
diff --git a/configure.in b/configure.in
index 91f1886..2a3cd47 100644
--- a/configure.in
+++ b/configure.in
@@ -5,7 +5,7 @@
LIBXML_MAJOR_VERSION=1
LIBXML_MINOR_VERSION=7
-LIBXML_MICRO_VERSION=1
+LIBXML_MICRO_VERSION=2
LIBXML_VERSION=$LIBXML_MAJOR_VERSION.$LIBXML_MINOR_VERSION.$LIBXML_MICRO_VERSION
LIBXML_VERSION_INFO=`expr $LIBXML_MAJOR_VERSION + $LIBXML_MINOR_VERSION`:$LIBXML_MICRO_VERSION:$LIBXML_MINOR_VERSION
diff --git a/include/libxml/parser.h b/include/libxml/parser.h
index f5f96e9..bc2ac94 100644
--- a/include/libxml/parser.h
+++ b/include/libxml/parser.h
@@ -272,10 +272,10 @@
/**
* xmlChar handling
*/
-xmlChar * xmlStrdup (const xmlChar *cur);
-xmlChar * xmlStrndup (const xmlChar *cur,
+xmlChar * xmlStrdup (const xmlChar *cur);
+xmlChar * xmlStrndup (const xmlChar *cur,
int len);
-xmlChar * xmlStrsub (const xmlChar *str,
+xmlChar * xmlStrsub (const xmlChar *str,
int start,
int len);
const xmlChar * xmlStrchr (const xmlChar *str,
@@ -288,9 +288,9 @@
const xmlChar *str2,
int len);
int xmlStrlen (const xmlChar *str);
-xmlChar * xmlStrcat (xmlChar *cur,
+xmlChar * xmlStrcat (xmlChar *cur,
const xmlChar *add);
-xmlChar * xmlStrncat (xmlChar *cur,
+xmlChar * xmlStrncat (xmlChar *cur,
const xmlChar *add,
int len);
@@ -318,6 +318,13 @@
xmlDocPtr xmlSAXParseDoc (xmlSAXHandlerPtr sax,
xmlChar *cur,
int recovery);
+int xmlSAXUserParseFile (xmlSAXHandlerPtr sax,
+ void *user_data,
+ const char *filename);
+int xmlSAXUserParseMemory (xmlSAXHandlerPtr sax,
+ void *user_data,
+ char *buffer,
+ int size);
xmlDocPtr xmlSAXParseMemory (xmlSAXHandlerPtr sax,
char *buffer,
int size,
diff --git a/parser.c b/parser.c
index 659af3f..d46a4a5 100644
--- a/parser.c
+++ b/parser.c
@@ -6474,6 +6474,83 @@
inputPush(ctxt, input);
}
+/**
+ * xmlSAXUserParseFile:
+ * @sax: a SAX handler
+ * @user_data: The user data returned on SAX callbacks
+ * @filename: a file name
+ *
+ * parse an XML file and call the given SAX handler routines.
+ * Automatic support for ZLIB/Compress compressed document is provided
+ *
+ * Returns 0 in case of success or a error number otherwise
+ */
+int xmlSAXUserParseFile(xmlSAXHandlerPtr sax, void *user_data,
+ const char *filename) {
+ int ret = 0;
+ xmlParserCtxtPtr ctxt;
+
+ ctxt = xmlCreateFileParserCtxt(filename);
+ if (ctxt == NULL) return -1;
+ ctxt->sax = sax;
+ ctxt->userData = user_data;
+
+ xmlParseDocument(ctxt);
+
+ if (ctxt->wellFormed)
+ ret = 0;
+ else {
+ if (ctxt->errNo != 0)
+ ret = ctxt->errNo;
+ else
+ ret = -1;
+ }
+ if (sax != NULL)
+ ctxt->sax = NULL;
+ xmlFreeParserCtxt(ctxt);
+
+ return ret;
+}
+
+/**
+ * xmlSAXUserParseMemory:
+ * @sax: a SAX handler
+ * @user_data: The user data returned on SAX callbacks
+ * @buffer: an in-memory XML document input
+ * @size: the lenght of the XML document in bytes
+ *
+ * A better SAX parsing routine.
+ * parse an XML in-memory buffer and call the given SAX handler routines.
+ *
+ * Returns 0 in case of success or a error number otherwise
+ */
+int xmlSAXUserParseMemory(xmlSAXHandlerPtr sax, void *user_data,
+ char *buffer, int size) {
+ int ret = 0;
+ xmlParserCtxtPtr ctxt;
+
+ ctxt = xmlCreateMemoryParserCtxt(buffer, size);
+ if (ctxt == NULL) return -1;
+ ctxt->sax = sax;
+ ctxt->userData = user_data;
+
+ xmlParseDocument(ctxt);
+
+ if (ctxt->wellFormed)
+ ret = 0;
+ else {
+ if (ctxt->errNo != 0)
+ ret = ctxt->errNo;
+ else
+ ret = -1;
+ }
+ if (sax != NULL)
+ ctxt->sax = NULL;
+ xmlFreeParserCtxt(ctxt);
+
+ return ret;
+}
+
/************************************************************************
* *
diff --git a/parser.h b/parser.h
index f5f96e9..bc2ac94 100644
--- a/parser.h
+++ b/parser.h
@@ -272,10 +272,10 @@
/**
* xmlChar handling
*/
-xmlChar * xmlStrdup (const xmlChar *cur);
-xmlChar * xmlStrndup (const xmlChar *cur,
+xmlChar * xmlStrdup (const xmlChar *cur);
+xmlChar * xmlStrndup (const xmlChar *cur,
int len);
-xmlChar * xmlStrsub (const xmlChar *str,
+xmlChar * xmlStrsub (const xmlChar *str,
int start,
int len);
const xmlChar * xmlStrchr (const xmlChar *str,
@@ -288,9 +288,9 @@
const xmlChar *str2,
int len);
int xmlStrlen (const xmlChar *str);
-xmlChar * xmlStrcat (xmlChar *cur,
+xmlChar * xmlStrcat (xmlChar *cur,
const xmlChar *add);
-xmlChar * xmlStrncat (xmlChar *cur,
+xmlChar * xmlStrncat (xmlChar *cur,
const xmlChar *add,
int len);
@@ -318,6 +318,13 @@
xmlDocPtr xmlSAXParseDoc (xmlSAXHandlerPtr sax,
xmlChar *cur,
int recovery);
+int xmlSAXUserParseFile (xmlSAXHandlerPtr sax,
+ void *user_data,
+ const char *filename);
+int xmlSAXUserParseMemory (xmlSAXHandlerPtr sax,
+ void *user_data,
+ char *buffer,
+ int size);
xmlDocPtr xmlSAXParseMemory (xmlSAXHandlerPtr sax,
char *buffer,
int size,
diff --git a/testSAX.c b/testSAX.c
index be242cb..8311ffb 100644
--- a/testSAX.c
+++ b/testSAX.c
@@ -32,6 +32,9 @@
#ifdef HAVE_STDLIB_H
#include <stdlib.h>
#endif
+#ifdef HAVE_STRING_H
+#include <string.h>
+#endif
#include "parser.h"
@@ -77,7 +80,7 @@
/*
* Note: there is a couple of errors introduced on purpose.
*/
-static xmlChar buffer[] =
+static char buffer[] =
"<?xml version=\"1.0\"?>\n\
<?xml:namespace ns = \"http://www.ietf.org/standards/dav/\" prefix = \"D\"?>\n\
<?xml:namespace ns = \"http://www.w3.com/standards/z39.50/\" prefix = \"Z\"?>\n\
@@ -158,17 +161,19 @@
internalSubsetDebug(void *ctx, const xmlChar *name,
const xmlChar *ExternalID, const xmlChar *SystemID)
{
- xmlDtdPtr externalSubset;
+ /* xmlDtdPtr externalSubset; */
fprintf(stdout, "SAX.internalSubset(%s, %s, %s)\n",
name, ExternalID, SystemID);
+/***********
if ((ExternalID != NULL) || (SystemID != NULL)) {
externalSubset = xmlParseDTD(ExternalID, SystemID);
if (externalSubset != NULL) {
xmlFreeDtd(externalSubset);
}
}
+ ***********/
}
/**
@@ -188,7 +193,7 @@
xmlParserInputPtr
resolveEntityDebug(void *ctx, const xmlChar *publicId, const xmlChar *systemId)
{
- xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
+ /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
fprintf(stdout, "SAX.resolveEntity(");
@@ -200,9 +205,11 @@
fprintf(stdout, ", %s)\n", (char *)systemId);
else
fprintf(stdout, ", )\n");
+/*********
if (systemId != NULL) {
return(xmlNewInputFromFile(ctxt, (char *) systemId));
}
+ *********/
return(NULL);
}
@@ -579,46 +586,42 @@
************************************************************************/
void parseAndPrintFile(char *filename) {
- xmlDocPtr doc;
+ int res;
/*
* Empty callbacks for checking
*/
- doc = xmlSAXParseFile(emptySAXHandler, filename, 0);
- if (doc != NULL) {
- fprintf(stdout, "xmlSAXParseFile returned non-NULL\n");
- xmlDocDump(stdout, doc);
+ res = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
+ if (res != 0) {
+ fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
}
/*
* Debug callback
*/
- doc = xmlSAXParseFile(debugSAXHandler, filename, 0);
- if (doc != NULL) {
- fprintf(stderr, "xmlSAXParseFile returned non-NULL\n");
- xmlDocDump(stdout, doc);
+ res = xmlSAXUserParseFile(debugSAXHandler, NULL, filename);
+ if (res != 0) {
+ fprintf(stdout, "xmlSAXUserParseFile returned error %d\n", res);
}
}
-void parseAndPrintBuffer(xmlChar *buf) {
- xmlDocPtr doc;
+void parseAndPrintBuffer(char *buf) {
+ int res;
/*
* Empty callbacks for checking
*/
- doc = xmlSAXParseDoc(emptySAXHandler, buf, 0);
- if (doc != NULL) {
- fprintf(stderr, "xmlSAXParseDoc returned non-NULL\n");
- xmlDocDump(stdout, doc);
+ res = xmlSAXUserParseMemory(emptySAXHandler, NULL, buf, strlen(buf));
+ if (res != 0) {
+ fprintf(stdout, "xmlSAXUserParseMemory returned error %d\n", res);
}
/*
* Debug callback
*/
- doc = xmlSAXParseDoc(debugSAXHandler, buf, 0);
- if (doc != NULL) {
- fprintf(stderr, "xmlSAXParseDoc returned non-NULL\n");
- xmlDocDump(stdout, doc);
+ res = xmlSAXUserParseMemory(debugSAXHandler, NULL, buf, strlen(buf));
+ if (res != 0) {
+ fprintf(stdout, "xmlSAXUserParseMemory returned error %d\n", res);
}
}
diff --git a/xml-error.h b/xml-error.h
index 4a46d80..329656a 100644
--- a/xml-error.h
+++ b/xml-error.h
@@ -8,16 +8,16 @@
XML_ERR_INTERNAL_ERROR,
XML_ERR_NO_MEMORY,
- XML_ERR_DOCUMENT_START,
+ XML_ERR_DOCUMENT_START, /* 3 */
XML_ERR_DOCUMENT_EMPTY,
XML_ERR_DOCUMENT_END,
- XML_ERR_INVALID_HEX_CHARREF,
+ XML_ERR_INVALID_HEX_CHARREF, /* 6 */
XML_ERR_INVALID_DEC_CHARREF,
XML_ERR_INVALID_CHARREF,
XML_ERR_INVALID_CHAR,
- XML_ERR_CHARREF_AT_EOF,
+ XML_ERR_CHARREF_AT_EOF, /* 10 */
XML_ERR_CHARREF_IN_PROLOG,
XML_ERR_CHARREF_IN_EPILOG,
XML_ERR_CHARREF_IN_DTD,
@@ -30,70 +30,70 @@
XML_ERR_PEREF_IN_EPILOG,
XML_ERR_PEREF_IN_INT_SUBSET,
- XML_ERR_ENTITYREF_NO_NAME,
+ XML_ERR_ENTITYREF_NO_NAME, /* 22 */
XML_ERR_ENTITYREF_SEMICOL_MISSING,
- XML_ERR_PEREF_NO_NAME,
+ XML_ERR_PEREF_NO_NAME, /* 24 */
XML_ERR_PEREF_SEMICOL_MISSING,
- XML_ERR_UNDECLARED_ENTITY,
+ XML_ERR_UNDECLARED_ENTITY, /* 26 */
XML_WAR_UNDECLARED_ENTITY,
XML_ERR_UNPARSED_ENTITY,
XML_ERR_ENTITY_IS_EXTERNAL,
XML_ERR_ENTITY_IS_PARAMETER,
- XML_ERR_UNKNOWN_ENCODING,
+ XML_ERR_UNKNOWN_ENCODING, /* 31 */
XML_ERR_UNSUPPORTED_ENCODING,
- XML_ERR_STRING_NOT_STARTED,
+ XML_ERR_STRING_NOT_STARTED, /* 33 */
XML_ERR_STRING_NOT_CLOSED,
XML_ERR_NS_DECL_ERROR,
- XML_ERR_ENTITY_NOT_STARTED,
+ XML_ERR_ENTITY_NOT_STARTED, /* 36 */
XML_ERR_ENTITY_NOT_FINISHED,
- XML_ERR_LT_IN_ATTRIBUTE,
+ XML_ERR_LT_IN_ATTRIBUTE, /* 38 */
XML_ERR_ATTRIBUTE_NOT_STARTED,
XML_ERR_ATTRIBUTE_NOT_FINISHED,
XML_ERR_ATTRIBUTE_WITHOUT_VALUE,
XML_ERR_ATTRIBUTE_REDEFINED,
- XML_ERR_LITERAL_NOT_STARTED,
+ XML_ERR_LITERAL_NOT_STARTED, /* 43 */
XML_ERR_LITERAL_NOT_FINISHED,
- XML_ERR_COMMENT_NOT_FINISHED,
+ XML_ERR_COMMENT_NOT_FINISHED, /* 45 */
- XML_ERR_PI_NOT_STARTED,
+ XML_ERR_PI_NOT_STARTED, /* 47 */
XML_ERR_PI_NOT_FINISHED,
- XML_ERR_NOTATION_NOT_STARTED,
+ XML_ERR_NOTATION_NOT_STARTED, /* 49 */
XML_ERR_NOTATION_NOT_FINISHED,
- XML_ERR_ATTLIST_NOT_STARTED,
+ XML_ERR_ATTLIST_NOT_STARTED, /* 51 */
XML_ERR_ATTLIST_NOT_FINISHED,
- XML_ERR_MIXED_NOT_STARTED,
+ XML_ERR_MIXED_NOT_STARTED, /* 53 */
XML_ERR_MIXED_NOT_FINISHED,
- XML_ERR_ELEMCONTENT_NOT_STARTED,
+ XML_ERR_ELEMCONTENT_NOT_STARTED, /* 55 */
XML_ERR_ELEMCONTENT_NOT_FINISHED,
- XML_ERR_XMLDECL_NOT_STARTED,
+ XML_ERR_XMLDECL_NOT_STARTED, /* 57 */
XML_ERR_XMLDECL_NOT_FINISHED,
- XML_ERR_CONDSEC_NOT_STARTED,
+ XML_ERR_CONDSEC_NOT_STARTED, /* 59 */
XML_ERR_CONDSEC_NOT_FINISHED,
- XML_ERR_EXT_SUBSET_NOT_FINISHED,
+ XML_ERR_EXT_SUBSET_NOT_FINISHED, /* 61 */
- XML_ERR_DOCTYPE_NOT_FINISHED,
+ XML_ERR_DOCTYPE_NOT_FINISHED, /* 62 */
- XML_ERR_MISPLACED_CDATA_END,
+ XML_ERR_MISPLACED_CDATA_END, /* 63 */
XML_ERR_CDATA_NOT_FINISHED,
- XML_ERR_RESERVED_XML_NAME,
+ XML_ERR_RESERVED_XML_NAME, /* 65 */
- XML_ERR_SPACE_REQUIRED,
+ XML_ERR_SPACE_REQUIRED, /* 66 */
XML_ERR_SEPARATOR_REQUIRED,
XML_ERR_NMTOKEN_REQUIRED,
XML_ERR_NAME_REQUIRED,
@@ -105,14 +105,14 @@
XML_ERR_LTSLASH_REQUIRED,
XML_ERR_EQUAL_REQUIRED,
- XML_ERR_TAG_NAME_MISMATCH,
+ XML_ERR_TAG_NAME_MISMATCH, /* 77 */
XML_ERR_TAG_NOT_FINISED,
- XML_ERR_STANDALONE_VALUE,
+ XML_ERR_STANDALONE_VALUE, /* 79 */
- XML_ERR_ENCODING_NAME,
+ XML_ERR_ENCODING_NAME, /* 80 */
- XML_ERR_HYPHEN_IN_COMMENT
+ XML_ERR_HYPHEN_IN_COMMENT /* 81 */
}xmlParserErrors;