xmllint: Stop using global variables
The only exception is "maxmem". The custom malloc functions don't
support an extra context.
diff --git a/xmllint.c b/xmllint.c
index 35923de..76af748 100644
--- a/xmllint.c
+++ b/xmllint.c
@@ -12,13 +12,9 @@
#include <stdarg.h>
#include <stdio.h>
#include <stdlib.h>
-#include <assert.h>
-#include <time.h>
#include <errno.h>
#include <limits.h>
-
#include <fcntl.h>
-#include <sys/stat.h>
#ifdef _WIN32
#include <io.h>
@@ -30,6 +26,7 @@
#if HAVE_DECL_MMAP
#include <sys/mman.h>
+ #include <sys/stat.h>
/* seems needed for Solaris */
#ifndef MAP_FAILED
#define MAP_FAILED ((void *) -1)
@@ -81,6 +78,19 @@
#ifndef STDIN_FILENO
#define STDIN_FILENO 0
#endif
+#ifndef STDOUT_FILENO
+ #define STDOUT_FILENO 1
+#endif
+
+#define MAX_PATHS 64
+
+#ifdef _WIN32
+ #define PATH_SEPARATOR ';'
+#else
+ #define PATH_SEPARATOR ':'
+#endif
+
+#define HTML_BUF_SIZE 50000
typedef enum {
XMLLINT_RETURN_OK = 0, /* No error */
@@ -97,103 +107,130 @@
XMLLINT_ERR_XPATH_EMPTY = 11 /* XPath result is empty */
} xmllintReturnCode;
-static int shell = 0;
-#ifdef LIBXML_DEBUG_ENABLED
-static int debugent = 0;
+#ifdef _WIN32
+typedef __time64_t xmlSeconds;
+#else
+typedef time_t xmlSeconds;
#endif
-static int debug = 0;
-static int maxmem = 0;
-static int copy = 0;
-static int noout = 0;
+
+typedef struct {
+ xmlSeconds sec;
+ int usec;
+} xmlTime;
+
+typedef struct {
+ xmlParserCtxtPtr ctxt;
+ xmlResourceLoader defaultResourceLoader;
+
+ int version;
+ int nowrap;
+ int sax;
+ int callbacks;
+ int shell;
+#ifdef LIBXML_DEBUG_ENABLED
+ int debugent;
+#endif
+ int debug;
+ int copy;
+ int noout;
#ifdef LIBXML_OUTPUT_ENABLED
-static const char *output = NULL;
-static int format = 0;
-static const char *encoding = NULL;
-static int compress = 0;
+ const char *output;
+ int format;
+ const char *encoding;
+ int compress;
#endif /* LIBXML_OUTPUT_ENABLED */
#ifdef LIBXML_VALID_ENABLED
-static int postvalid = 0;
-static const char *dtdvalid = NULL;
-static const char *dtdvalidfpi = NULL;
-static int insert = 0;
+ int postvalid;
+ const char *dtdvalid;
+ const char *dtdvalidfpi;
+ int insert;
#endif
#ifdef LIBXML_SCHEMAS_ENABLED
-static const char *relaxng = NULL;
-static xmlRelaxNGPtr relaxngschemas = NULL;
-static const char *schema = NULL;
-static xmlSchemaPtr wxschemas = NULL;
+ const char *relaxng;
+ xmlRelaxNGPtr relaxngschemas;
+ const char *schema;
+ xmlSchemaPtr wxschemas;
#endif
#ifdef LIBXML_SCHEMATRON_ENABLED
-static const char *schematron = NULL;
-static xmlSchematronPtr wxschematron = NULL;
+ const char *schematron;
+ xmlSchematronPtr wxschematron;
#endif
-static int repeat = 1;
+ int repeat;
#if defined(LIBXML_HTML_ENABLED)
-static int html = 0;
-static int xmlout = 0;
+ int html;
+ int xmlout;
#endif
-static int htmlout = 0;
+ int htmlout;
#ifdef LIBXML_PUSH_ENABLED
-static int push = 0;
-static const int pushsize = 4096;
+ int push;
+ const int pushsize;
#endif /* LIBXML_PUSH_ENABLED */
#if HAVE_DECL_MMAP
-static int memory = 0;
-static char *memoryData;
-static size_t memorySize;
+ int memory;
+ char *memoryData;
+ size_t memorySize;
#endif
-static int testIO = 0;
+ int testIO;
#ifdef LIBXML_XINCLUDE_ENABLED
-static int xinclude = 0;
+ int xinclude;
#endif
-static xmllintReturnCode progresult = XMLLINT_RETURN_OK;
-static int quiet = 0;
-static int timing = 0;
-static int generate = 0;
-static int dropdtd = 0;
+ xmllintReturnCode progresult;
+ int quiet;
+ int timing;
+ int generate;
+ int dropdtd;
#ifdef LIBXML_C14N_ENABLED
-static int canonical = 0;
-static int canonical_11 = 0;
-static int exc_canonical = 0;
+ int canonical;
+ int canonical_11;
+ int exc_canonical;
#endif
#ifdef LIBXML_READER_ENABLED
-static int walker = 0;
+ int stream;
+ int walker;
#ifdef LIBXML_PATTERN_ENABLED
-static const char *pattern = NULL;
-static xmlPatternPtr patternc = NULL;
-static xmlStreamCtxtPtr patstream = NULL;
+ const char *pattern;
+ xmlPatternPtr patternc;
+ xmlStreamCtxtPtr patstream;
#endif
#endif /* LIBXML_READER_ENABLED */
#ifdef LIBXML_XPATH_ENABLED
-static const char *xpathquery = NULL;
+ const char *xpathquery;
#endif
-static int options = XML_PARSE_COMPACT | XML_PARSE_BIG_LINES;
-static unsigned maxAmpl = 0;
+#ifdef LIBXML_CATALOG_ENABLED
+ int catalogs;
+ int nocatalogs;
+#endif
+ int options;
+ unsigned maxAmpl;
+
+ xmlChar *paths[MAX_PATHS + 1];
+ int nbpaths;
+ int load_trace;
+
+ char *htmlBuf;
+ int htmlBufLen;
+
+ xmlTime begin, end;
+} xmllintState;
+
+static int xmllintMaxmem;
/************************************************************************
* *
* Entity loading control and customization. *
* *
************************************************************************/
-#define MAX_PATHS 64
-#ifdef _WIN32
-# define PATH_SEPARATOR ';'
-#else
-# define PATH_SEPARATOR ':'
-#endif
-static xmlChar *paths[MAX_PATHS + 1];
-static int nbpaths = 0;
-static int load_trace = 0;
-static
-void parsePath(const xmlChar *path) {
+static void
+parsePath(xmllintState *lint, const xmlChar *path) {
const xmlChar *cur;
if (path == NULL)
return;
while (*path != 0) {
- if (nbpaths >= MAX_PATHS) {
+ if (lint->nbpaths >= MAX_PATHS) {
fprintf(ERR_STREAM, "MAX_PATHS reached: too many paths\n");
+ lint->progresult = XMLLINT_ERR_UNCLASS;
return;
}
cur = path;
@@ -203,26 +240,25 @@
while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR))
cur++;
if (cur != path) {
- paths[nbpaths] = xmlStrndup(path, cur - path);
- if (paths[nbpaths] != NULL)
- nbpaths++;
+ lint->paths[lint->nbpaths] = xmlStrndup(path, cur - path);
+ if (lint->paths[lint->nbpaths] != NULL)
+ lint->nbpaths++;
path = cur;
}
}
}
-static xmlResourceLoader defaultResourceLoader = NULL;
-
static int
-xmllintResourceLoader(void *ctxt ATTRIBUTE_UNUSED, const char *URL,
+xmllintResourceLoader(void *ctxt, const char *URL,
const char *ID, xmlResourceType type, int flags,
xmlParserInputPtr *out) {
+ xmllintState *lint = ctxt;
int code;
int i;
const char *lastsegment = URL;
const char *iter = URL;
- if ((nbpaths > 0) && (iter != NULL)) {
+ if ((lint->nbpaths > 0) && (iter != NULL)) {
while (*iter != 0) {
if (*iter == '/')
lastsegment = iter + 1;
@@ -230,32 +266,32 @@
}
}
- if (defaultResourceLoader != NULL)
- code = defaultResourceLoader(NULL, URL, ID, type, flags, out);
+ if (lint->defaultResourceLoader != NULL)
+ code = lint->defaultResourceLoader(NULL, URL, ID, type, flags, out);
else
code = xmlNewInputFromUrl(URL, flags, out);
if (code != XML_IO_ENOENT) {
- if ((load_trace) && (code == XML_ERR_OK)) {
+ if ((lint->load_trace) && (code == XML_ERR_OK)) {
fprintf(ERR_STREAM, "Loaded URL=\"%s\" ID=\"%s\"\n",
URL, ID ? ID : "(null)");
}
return(code);
}
- for (i = 0; i < nbpaths; i++) {
+ for (i = 0; i < lint->nbpaths; i++) {
xmlChar *newURL;
- newURL = xmlStrdup((const xmlChar *) paths[i]);
+ newURL = xmlStrdup((const xmlChar *) lint->paths[i]);
newURL = xmlStrcat(newURL, (const xmlChar *) "/");
newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment);
if (newURL != NULL) {
- if (defaultResourceLoader != NULL)
- code = defaultResourceLoader(NULL, (const char *) newURL, ID,
- type, flags, out);
+ if (lint->defaultResourceLoader != NULL)
+ code = lint->defaultResourceLoader(NULL, (const char *) newURL,
+ ID, type, flags, out);
else
code = xmlNewInputFromUrl((const char *) newURL, flags, out);
if (code != XML_IO_ENOENT) {
- if ((load_trace) && (code == XML_ERR_OK)) {
+ if ((lint->load_trace) && (code == XML_ERR_OK)) {
fprintf(ERR_STREAM, "Loaded URL=\"%s\" ID=\"%s\"\n",
newURL, ID ? ID : "(null)");
}
@@ -289,30 +325,31 @@
}
static xmlDocPtr
-parseXml(xmlParserCtxtPtr ctxt, const char *filename) {
+parseXml(xmllintState *lint, const char *filename) {
xmlDocPtr doc;
- xmlCtxtSetResourceLoader(ctxt, xmllintResourceLoader, NULL);
- if (maxAmpl > 0)
- xmlCtxtSetMaxAmplification(ctxt, maxAmpl);
+ xmlCtxtSetResourceLoader(lint->ctxt, xmllintResourceLoader, lint);
+ if (lint->maxAmpl > 0)
+ xmlCtxtSetMaxAmplification(lint->ctxt, lint->maxAmpl);
#if HAVE_DECL_MMAP
- if (memory) {
+ if (lint->memory) {
xmlParserInputPtr input;
- input = xmlNewInputFromMemory(filename, memoryData, memorySize,
+ input = xmlNewInputFromMemory(filename,
+ lint->memoryData, lint->memorySize,
XML_INPUT_BUF_STATIC |
XML_INPUT_BUF_ZERO_TERMINATED);
if (input == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
return(NULL);
}
- doc = xmlCtxtParseDocument(ctxt, input);
+ doc = xmlCtxtParseDocument(lint->ctxt, input);
return(doc);
}
#endif
- if (testIO) {
+ if (lint->testIO) {
FILE *f;
if ((filename[0] == '-') && (filename[1] == 0)) {
@@ -321,18 +358,19 @@
f = fopen(filename, "rb");
if (f == NULL) {
fprintf(ERR_STREAM, "Can't open %s\n", filename);
- progresult = XMLLINT_ERR_RDFILE;
+ lint->progresult = XMLLINT_ERR_RDFILE;
return(NULL);
}
}
- doc = xmlCtxtReadIO(ctxt, myRead, myClose, f, filename, NULL,
- options);
+ doc = xmlCtxtReadIO(lint->ctxt, myRead, myClose, f, filename, NULL,
+ lint->options);
} else {
if (strcmp(filename, "-") == 0)
- doc = xmlCtxtReadFd(ctxt, STDIN_FILENO, "-", NULL, options);
+ doc = xmlCtxtReadFd(lint->ctxt, STDIN_FILENO, "-", NULL,
+ lint->options);
else
- doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
+ doc = xmlCtxtReadFile(lint->ctxt, filename, NULL, lint->options);
}
return(doc);
@@ -340,29 +378,31 @@
#ifdef LIBXML_HTML_ENABLED
static xmlDocPtr
-parseHtml(htmlParserCtxtPtr ctxt, const char *filename) {
+parseHtml(xmllintState *lint, const char *filename) {
xmlDocPtr doc;
#if HAVE_DECL_MMAP
- if (memory) {
+ if (lint->memory) {
xmlParserInputPtr input;
- input = xmlNewInputFromMemory(filename, memoryData, memorySize,
+ input = xmlNewInputFromMemory(filename,
+ lint->memoryData, lint->memorySize,
XML_INPUT_BUF_STATIC |
XML_INPUT_BUF_ZERO_TERMINATED);
if (input == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
return(NULL);
}
- doc = htmlCtxtParseDocument(ctxt, input);
+ doc = htmlCtxtParseDocument(lint->ctxt, input);
return(doc);
}
#endif
if (strcmp(filename, "-") == 0)
- doc = htmlCtxtReadFd(ctxt, STDIN_FILENO, "-", NULL, options);
+ doc = htmlCtxtReadFd(lint->ctxt, STDIN_FILENO, "-", NULL,
+ lint->options);
else
- doc = htmlCtxtReadFile(ctxt, filename, NULL, options);
+ doc = htmlCtxtReadFile(lint->ctxt, filename, NULL, lint->options);
return(doc);
}
@@ -377,8 +417,8 @@
static void
OOM(void)
{
- fprintf(ERR_STREAM, "Ran out of memory needs > %d bytes\n", maxmem);
- progresult = XMLLINT_ERR_MEM;
+ fprintf(ERR_STREAM, "Ran out of memory needs > %d bytes\n",
+ xmllintMaxmem);
}
static void
@@ -393,7 +433,7 @@
ret = xmlMemMalloc(size);
if (ret != NULL) {
- if (xmlMemUsed() > maxmem) {
+ if (xmlMemUsed() > xmllintMaxmem) {
OOM();
xmlMemFree(ret);
return (NULL);
@@ -406,7 +446,7 @@
{
size_t oldsize = xmlMemSize(mem);
- if (xmlMemUsed() + size - oldsize > (size_t) maxmem) {
+ if (xmlMemUsed() + size - oldsize > (size_t) xmllintMaxmem) {
OOM();
return (NULL);
}
@@ -420,7 +460,7 @@
ret = xmlMemoryStrdup(str);
if (ret != NULL) {
- if (xmlMemUsed() > maxmem) {
+ if (xmlMemUsed() > xmllintMaxmem) {
OOM();
xmlMemFree(ret);
return (NULL);
@@ -428,6 +468,7 @@
}
return (ret);
}
+
/************************************************************************
* *
* Internal timing routines to remove the necessity to have *
@@ -435,19 +476,6 @@
* *
************************************************************************/
-#ifdef _WIN32
-typedef __time64_t xmlSeconds;
-#else
-typedef time_t xmlSeconds;
-#endif
-
-typedef struct {
- xmlSeconds sec;
- int usec;
-} xmlTime;
-
-static xmlTime begin, end;
-
static void
getTime(xmlTime *time) {
#ifdef _WIN32
@@ -469,9 +497,9 @@
* startTimer: call where you want to start timing
*/
static void
-startTimer(void)
+startTimer(xmllintState *lint)
{
- getTime(&begin);
+ getTime(&lint->begin);
}
/*
@@ -479,16 +507,16 @@
* message about the timing performed; format is a printf
* type argument
*/
-static void LIBXML_ATTR_FORMAT(1,2)
-endTimer(const char *fmt, ...)
+static void LIBXML_ATTR_FORMAT(2,3)
+endTimer(xmllintState *lint, const char *fmt, ...)
{
xmlSeconds msec;
va_list ap;
- getTime(&end);
- msec = end.sec - begin.sec;
+ getTime(&lint->end);
+ msec = lint->end.sec - lint->begin.sec;
msec *= 1000;
- msec += (end.usec - begin.usec) / 1000;
+ msec += (lint->end.usec - lint->begin.usec) / 1000;
va_start(ap, fmt);
vfprintf(ERR_STREAM, fmt, ap);
@@ -502,11 +530,9 @@
* HTML output *
* *
************************************************************************/
-static char buffer[50000];
-static int htmlBufLen;
static void
-xmlHTMLEncodeSend(void) {
+xmlHTMLEncodeSend(xmllintState *lint) {
char *result;
/*
@@ -514,30 +540,32 @@
* end with a truncated UTF-8 sequence. This is a hack to at least avoid
* an out-of-bounds read.
*/
- memset(&buffer[sizeof(buffer)-4], 0, 4);
- result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer);
+ memset(&lint->htmlBuf[HTML_BUF_SIZE - 4], 0, 4);
+ result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST lint->htmlBuf);
if (result) {
fprintf(ERR_STREAM, "%s", result);
xmlFree(result);
}
- htmlBufLen = 0;
+ lint->htmlBufLen = 0;
}
static void
-xmlHTMLBufCat(void *data ATTRIBUTE_UNUSED, const char *fmt, ...) {
+xmlHTMLBufCat(void *data, const char *fmt, ...) {
+ xmllintState *lint = data;
va_list ap;
int res;
va_start(ap, fmt);
- res = vsnprintf(&buffer[htmlBufLen], sizeof(buffer) - htmlBufLen, fmt, ap);
+ res = vsnprintf(&lint->htmlBuf[lint->htmlBufLen],
+ HTML_BUF_SIZE - lint->htmlBufLen, fmt, ap);
va_end(ap);
if (res > 0) {
- if ((size_t) res > sizeof(buffer) - htmlBufLen - 1)
- htmlBufLen = sizeof(buffer) - 1;
+ if (res > HTML_BUF_SIZE - lint->htmlBufLen - 1)
+ lint->htmlBufLen = HTML_BUF_SIZE - 1;
else
- htmlBufLen += res;
+ lint->htmlBufLen += res;
}
}
@@ -553,7 +581,8 @@
static void
xmlHTMLError(void *vctxt, const xmlError *error)
{
- xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) vctxt;
+ xmlParserCtxtPtr ctxt = vctxt;
+ xmllintState *lint = ctxt->_private;
xmlParserInputPtr input;
xmlGenericErrorFunc oldError;
void *oldErrorCtxt;
@@ -565,20 +594,20 @@
oldError = xmlGenericError;
oldErrorCtxt = xmlGenericErrorContext;
- xmlSetGenericErrorFunc(NULL, xmlHTMLBufCat);
+ xmlSetGenericErrorFunc(lint, xmlHTMLBufCat);
fprintf(ERR_STREAM, "<p>");
xmlParserPrintFileInfo(input);
- xmlHTMLEncodeSend();
+ xmlHTMLEncodeSend(lint);
fprintf(ERR_STREAM, "<b>%s%s</b>: ",
(error->domain == XML_FROM_VALID) ||
(error->domain == XML_FROM_DTD) ? "validity " : "",
error->level == XML_ERR_WARNING ? "warning" : "error");
- snprintf(buffer, sizeof(buffer), "%s", error->message);
- xmlHTMLEncodeSend();
+ snprintf(lint->htmlBuf, HTML_BUF_SIZE, "%s", error->message);
+ xmlHTMLEncodeSend(lint);
fprintf(ERR_STREAM, "</p>\n");
@@ -586,7 +615,7 @@
fprintf(ERR_STREAM, "<pre>\n");
xmlParserPrintFileContext(input);
- xmlHTMLEncodeSend();
+ xmlHTMLEncodeSend(lint);
fprintf(ERR_STREAM, "</pre>");
}
@@ -603,7 +632,7 @@
/*
* empty SAX block
*/
-static xmlSAXHandler emptySAXHandlerStruct = {
+static const xmlSAXHandler emptySAXHandler = {
NULL, /* internalSubset */
NULL, /* isStandalone */
NULL, /* hasInternalSubset */
@@ -638,10 +667,6 @@
NULL /* xmlStructuredErrorFunc */
};
-static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
-extern xmlSAXHandlerPtr debugSAXHandler;
-static int callbacks;
-
/**
* isStandaloneDebug:
* @ctxt: An XML parser context
@@ -651,10 +676,12 @@
* Returns 1 if true
*/
static int
-isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
+isStandaloneDebug(void *ctx)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return(0);
fprintf(stdout, "SAX.isStandalone()\n");
return(0);
@@ -669,10 +696,12 @@
* Returns 1 if true
*/
static int
-hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
+hasInternalSubsetDebug(void *ctx)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return(0);
fprintf(stdout, "SAX.hasInternalSubset()\n");
return(0);
@@ -687,10 +716,12 @@
* Returns 1 if true
*/
static int
-hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
+hasExternalSubsetDebug(void *ctx)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return(0);
fprintf(stdout, "SAX.hasExternalSubset()\n");
return(0);
@@ -703,11 +734,13 @@
* Does this document has an internal subset
*/
static void
-internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
+internalSubsetDebug(void *ctx, const xmlChar *name,
const xmlChar *ExternalID, const xmlChar *SystemID)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.internalSubset(%s,", name);
if (ExternalID == NULL)
@@ -727,11 +760,13 @@
* Does this document has an external subset
*/
static void
-externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
+externalSubsetDebug(void *ctx, const xmlChar *name,
const xmlChar *ExternalID, const xmlChar *SystemID)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.externalSubset(%s,", name);
if (ExternalID == NULL)
@@ -759,10 +794,12 @@
* Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
*/
static xmlParserInputPtr
-resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
+resolveEntityDebug(void *ctx, const xmlChar *publicId, const xmlChar *systemId)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return(NULL);
/* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
@@ -789,10 +826,12 @@
* Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
*/
static xmlEntityPtr
-getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
+getEntityDebug(void *ctx, const xmlChar *name)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return(NULL);
fprintf(stdout, "SAX.getEntity(%s)\n", name);
return(NULL);
@@ -808,10 +847,12 @@
* Returns the xmlParserInputPtr
*/
static xmlEntityPtr
-getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
+getParameterEntityDebug(void *ctx, const xmlChar *name)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return(NULL);
fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
return(NULL);
@@ -830,10 +871,12 @@
* An entity definition has been parsed
*/
static void
-entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
+entityDeclDebug(void *ctx, const xmlChar *name, int type,
const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
{
-const xmlChar *nullstr = BAD_CAST "(null)";
+ xmllintState *lint = ctx;
+ const xmlChar *nullstr = BAD_CAST "(null)";
+
/* not all libraries handle printing null pointers nicely */
if (publicId == NULL)
publicId = nullstr;
@@ -841,8 +884,8 @@
systemId = nullstr;
if (content == NULL)
content = (xmlChar *)nullstr;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
name, type, publicId, systemId, content);
@@ -857,12 +900,14 @@
* An attribute definition has been parsed
*/
static void
-attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
+attributeDeclDebug(void *ctx, const xmlChar * elem,
const xmlChar * name, int type, int def,
const xmlChar * defaultValue, xmlEnumerationPtr tree)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
if (defaultValue == NULL)
fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
@@ -883,11 +928,13 @@
* An element definition has been parsed
*/
static void
-elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
+elementDeclDebug(void *ctx, const xmlChar *name, int type,
xmlElementContentPtr content ATTRIBUTE_UNUSED)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
name, type);
@@ -903,11 +950,13 @@
* What to do when a notation declaration has been parsed.
*/
static void
-notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
+notationDeclDebug(void *ctx, const xmlChar *name,
const xmlChar *publicId, const xmlChar *systemId)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
(char *) name, (char *) publicId, (char *) systemId);
@@ -924,11 +973,12 @@
* What to do when an unparsed entity declaration is parsed
*/
static void
-unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
+unparsedEntityDeclDebug(void *ctx, const xmlChar *name,
const xmlChar *publicId, const xmlChar *systemId,
const xmlChar *notationName)
{
-const xmlChar *nullstr = BAD_CAST "(null)";
+ xmllintState *lint = ctx;
+ const xmlChar *nullstr = BAD_CAST "(null)";
if (publicId == NULL)
publicId = nullstr;
@@ -936,8 +986,8 @@
systemId = nullstr;
if (notationName == NULL)
notationName = nullstr;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
(char *) name, (char *) publicId, (char *) systemId,
@@ -953,10 +1003,12 @@
* Everything is available on the context, so this is useless in our case.
*/
static void
-setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
+setDocumentLocatorDebug(void *ctx, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.setDocumentLocator()\n");
}
@@ -968,10 +1020,12 @@
* called when the document start being processed.
*/
static void
-startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
+startDocumentDebug(void *ctx)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.startDocument()\n");
}
@@ -983,14 +1037,17 @@
* called when the document end has been detected.
*/
static void
-endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
+endDocumentDebug(void *ctx)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.endDocument()\n");
}
+#ifdef LIBXML_SAX1_ENABLED
/**
* startElementDebug:
* @ctxt: An XML parser context
@@ -999,12 +1056,13 @@
* called when an opening tag has been processed.
*/
static void
-startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
+startElementDebug(void *ctx, const xmlChar *name, const xmlChar **atts)
{
+ xmllintState *lint = ctx;
int i;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.startElement(%s", (char *) name);
if (atts != NULL) {
@@ -1025,13 +1083,16 @@
* called when the end of an element has been detected.
*/
static void
-endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
+endElementDebug(void *ctx, const xmlChar *name)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
}
+#endif /* LIBXML_SAX1_ENABLED */
/**
* charactersDebug:
@@ -1043,13 +1104,14 @@
* Question: how much at a time ???
*/
static void
-charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
+charactersDebug(void *ctx, const xmlChar *ch, int len)
{
+ xmllintState *lint = ctx;
char out[40];
int i;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
for (i = 0;(i<len) && (i < 30);i++)
out[i] = (char) ch[i];
@@ -1066,10 +1128,12 @@
* called when an entity reference is detected.
*/
static void
-referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
+referenceDebug(void *ctx, const xmlChar *name)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.reference(%s)\n", name);
}
@@ -1085,13 +1149,14 @@
* Question: how much at a time ???
*/
static void
-ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
+ignorableWhitespaceDebug(void *ctx, const xmlChar *ch, int len)
{
+ xmllintState *lint = ctx;
char out[40];
int i;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
for (i = 0;(i<len) && (i < 30);i++)
out[i] = ch[i];
@@ -1109,11 +1174,13 @@
* A processing instruction has been parsed.
*/
static void
-processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
+processingInstructionDebug(void *ctx, const xmlChar *target,
const xmlChar *data)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
if (data != NULL)
fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
@@ -1132,10 +1199,12 @@
* called when a pcdata block has been parsed
*/
static void
-cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
+cdataBlockDebug(void *ctx, const xmlChar *value, int len)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.pcdata(%.20s, %d)\n",
(char *) value, len);
@@ -1149,10 +1218,12 @@
* A comment has been parsed.
*/
static void
-commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
+commentDebug(void *ctx, const xmlChar *value)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.comment(%s)\n", value);
}
@@ -1167,12 +1238,13 @@
* extra parameters.
*/
static void LIBXML_ATTR_FORMAT(2,3)
-warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
+warningDebug(void *ctx, const char *msg, ...)
{
+ xmllintState *lint = ctx;
va_list args;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
va_start(args, msg);
fprintf(stdout, "SAX.warning: ");
@@ -1190,12 +1262,13 @@
* extra parameters.
*/
static void LIBXML_ATTR_FORMAT(2,3)
-errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
+errorDebug(void *ctx, const char *msg, ...)
{
+ xmllintState *lint = ctx;
va_list args;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
va_start(args, msg);
fprintf(stdout, "SAX.error: ");
@@ -1213,12 +1286,13 @@
* extra parameters.
*/
static void LIBXML_ATTR_FORMAT(2,3)
-fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
+fatalErrorDebug(void *ctx, const char *msg, ...)
{
+ xmllintState *lint = ctx;
va_list args;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
va_start(args, msg);
fprintf(stdout, "SAX.fatalError: ");
@@ -1226,7 +1300,8 @@
va_end(args);
}
-static xmlSAXHandler debugSAXHandlerStruct = {
+#ifdef LIBXML_SAX1_ENABLED
+static const xmlSAXHandler debugSAXHandler = {
internalSubsetDebug,
isStandaloneDebug,
hasInternalSubsetDebug,
@@ -1260,8 +1335,7 @@
NULL,
NULL
};
-
-xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
+#endif
/*
* SAX2 specific callbacks
@@ -1274,7 +1348,7 @@
* called when an opening tag has been processed.
*/
static void
-startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
+startElementNsDebug(void *ctx,
const xmlChar *localname,
const xmlChar *prefix,
const xmlChar *URI,
@@ -1284,10 +1358,11 @@
int nb_defaulted,
const xmlChar **attributes)
{
+ xmllintState *lint = ctx;
int i;
- callbacks++;
- if (noout)
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.startElementNs(%s", (char *) localname);
if (prefix == NULL)
@@ -1331,13 +1406,15 @@
* called when the end of an element has been detected.
*/
static void
-endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
+endElementNsDebug(void *ctx,
const xmlChar *localname,
const xmlChar *prefix,
const xmlChar *URI)
{
- callbacks++;
- if (noout)
+ xmllintState *lint = ctx;
+
+ lint->callbacks++;
+ if (lint->noout)
return;
fprintf(stdout, "SAX.endElementNs(%s", (char *) localname);
if (prefix == NULL)
@@ -1350,7 +1427,7 @@
fprintf(stdout, ", '%s')\n", (char *) URI);
}
-static xmlSAXHandler debugSAX2HandlerStruct = {
+static const xmlSAXHandler debugSAX2Handler = {
internalSubsetDebug,
isStandaloneDebug,
hasInternalSubsetDebug,
@@ -1385,27 +1462,24 @@
NULL
};
-static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
-
static void
-testSAX(const char *filename) {
- xmlSAXHandlerPtr handler;
- const char *user_data = "user_data"; /* mostly for debugging */
+testSAX(xmllintState *lint, const char *filename) {
+ const xmlSAXHandler *handler;
- callbacks = 0;
+ lint->callbacks = 0;
- if (noout) {
- handler = emptySAXHandler;
+ if (lint->noout) {
+ handler = &emptySAXHandler;
#ifdef LIBXML_SAX1_ENABLED
- } else if (options & XML_PARSE_SAX1) {
- handler = debugSAXHandler;
+ } else if (lint->options & XML_PARSE_SAX1) {
+ handler = &debugSAXHandler;
#endif
} else {
- handler = debugSAX2Handler;
+ handler = &debugSAX2Handler;
}
#ifdef LIBXML_SCHEMAS_ENABLED
- if (wxschemas != NULL) {
+ if (lint->wxschemas != NULL) {
int ret;
xmlSchemaValidCtxtPtr vctxt;
xmlParserInputBufferPtr buf;
@@ -1419,44 +1493,43 @@
if (buf == NULL)
return;
- vctxt = xmlSchemaNewValidCtxt(wxschemas);
+ vctxt = xmlSchemaNewValidCtxt(lint->wxschemas);
if (vctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
xmlFreeParserInputBuffer(buf);
return;
}
xmlSchemaValidateSetFilename(vctxt, filename);
- ret = xmlSchemaValidateStream(vctxt, buf, 0, handler,
- (void *)user_data);
- if (repeat == 1) {
+ ret = xmlSchemaValidateStream(vctxt, buf, 0, handler, lint);
+ if (lint->repeat == 1) {
if (ret == 0) {
- if (!quiet) {
+ if (!lint->quiet) {
fprintf(ERR_STREAM, "%s validates\n", filename);
}
} else if (ret > 0) {
fprintf(ERR_STREAM, "%s fails to validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
} else {
fprintf(ERR_STREAM, "%s validation generated an internal error\n",
filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
}
}
xmlSchemaFreeValidCtxt(vctxt);
} else
#endif
#ifdef LIBXML_HTML_ENABLED
- if (html) {
+ if (lint->html) {
htmlParserCtxtPtr ctxt = NULL;
- ctxt = htmlNewSAXParserCtxt(handler, (void *) user_data);
+ ctxt = htmlNewSAXParserCtxt(handler, lint);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
return;
}
- parseHtml(ctxt, filename);
+ parseHtml(lint, filename);
htmlFreeParserCtxt(ctxt);
} else
@@ -1464,13 +1537,13 @@
{
xmlParserCtxtPtr ctxt = NULL;
- ctxt = xmlNewSAXParserCtxt(handler, (void *) user_data);
+ ctxt = xmlNewSAXParserCtxt(handler, lint);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
return;
}
- parseXml(ctxt, filename);
+ parseXml(lint, filename);
if (ctxt->myDoc != NULL) {
fprintf(ERR_STREAM, "SAX generated a doc !\n");
@@ -1487,14 +1560,14 @@
* *
************************************************************************/
#ifdef LIBXML_READER_ENABLED
-static void processNode(xmlTextReaderPtr reader) {
+static void processNode(xmllintState *lint, xmlTextReaderPtr reader) {
const xmlChar *name, *value;
int type, empty;
type = xmlTextReaderNodeType(reader);
empty = xmlTextReaderIsEmptyElement(reader);
- if (debug) {
+ if (lint->debug) {
name = xmlTextReaderConstName(reader);
if (name == NULL)
name = BAD_CAST "--";
@@ -1515,30 +1588,31 @@
}
}
#ifdef LIBXML_PATTERN_ENABLED
- if (patternc) {
+ if (lint->patternc) {
xmlChar *path = NULL;
int match = -1;
if (type == XML_READER_TYPE_ELEMENT) {
/* do the check only on element start */
- match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader));
+ match = xmlPatternMatch(lint->patternc,
+ xmlTextReaderCurrentNode(reader));
if (match) {
path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
- printf("Node %s matches pattern %s\n", path, pattern);
+ printf("Node %s matches pattern %s\n", path, lint->pattern);
}
}
- if (patstream != NULL) {
+ if (lint->patstream != NULL) {
int ret;
if (type == XML_READER_TYPE_ELEMENT) {
- ret = xmlStreamPush(patstream,
+ ret = xmlStreamPush(lint->patstream,
xmlTextReaderConstLocalName(reader),
xmlTextReaderConstNamespaceUri(reader));
if (ret < 0) {
fprintf(ERR_STREAM, "xmlStreamPush() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
+ xmlFreeStreamCtxt(lint->patstream);
+ lint->patstream = NULL;
} else if (ret != match) {
if (path == NULL) {
path = xmlGetNodePath(
@@ -1548,20 +1622,20 @@
"xmlPatternMatch and xmlStreamPush disagree\n");
if (path != NULL)
fprintf(ERR_STREAM, " pattern %s node %s\n",
- pattern, path);
+ lint->pattern, path);
else
fprintf(ERR_STREAM, " pattern %s node %s\n",
- pattern, xmlTextReaderConstName(reader));
+ lint->pattern, xmlTextReaderConstName(reader));
}
}
if ((type == XML_READER_TYPE_END_ELEMENT) ||
((type == XML_READER_TYPE_ELEMENT) && (empty))) {
- ret = xmlStreamPop(patstream);
+ ret = xmlStreamPop(lint->patstream);
if (ret < 0) {
fprintf(ERR_STREAM, "xmlStreamPop() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
+ xmlFreeStreamCtxt(lint->patstream);
+ lint->patstream = NULL;
}
}
}
@@ -1571,28 +1645,28 @@
#endif
}
-static void streamFile(const char *filename) {
+static void streamFile(xmllintState *lint, const char *filename) {
xmlTextReaderPtr reader;
int ret;
#if HAVE_DECL_MMAP
- if (memory) {
- reader = xmlReaderForMemory(memoryData, memorySize, filename,
- NULL, options);
+ if (lint->memory) {
+ reader = xmlReaderForMemory(lint->memoryData, lint->memorySize,
+ filename, NULL, lint->options);
} else
#endif
if (strcmp(filename, "-") == 0)
- reader = xmlReaderForFd(STDIN_FILENO, "-", NULL, options);
+ reader = xmlReaderForFd(STDIN_FILENO, "-", NULL, lint->options);
else
- reader = xmlReaderForFile(filename, NULL, options);
+ reader = xmlReaderForFile(filename, NULL, lint->options);
#ifdef LIBXML_PATTERN_ENABLED
- if (patternc != NULL) {
- patstream = xmlPatternGetStreamCtxt(patternc);
- if (patstream != NULL) {
- ret = xmlStreamPush(patstream, NULL, NULL);
+ if (lint->patternc != NULL) {
+ lint->patstream = xmlPatternGetStreamCtxt(lint->patternc);
+ if (lint->patstream != NULL) {
+ ret = xmlStreamPush(lint->patstream, NULL, NULL);
if (ret < 0) {
fprintf(ERR_STREAM, "xmlStreamPush() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
+ xmlFreeStreamCtxt(lint->patstream);
+ lint->patstream = NULL;
}
}
}
@@ -1600,39 +1674,39 @@
if (reader != NULL) {
- xmlTextReaderSetResourceLoader(reader, xmllintResourceLoader, NULL);
- if (maxAmpl > 0)
- xmlTextReaderSetMaxAmplification(reader, maxAmpl);
+ xmlTextReaderSetResourceLoader(reader, xmllintResourceLoader, lint);
+ if (lint->maxAmpl > 0)
+ xmlTextReaderSetMaxAmplification(reader, lint->maxAmpl);
#ifdef LIBXML_SCHEMAS_ENABLED
- if (relaxng != NULL) {
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if (lint->relaxng != NULL) {
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
- ret = xmlTextReaderRelaxNGValidate(reader, relaxng);
+ ret = xmlTextReaderRelaxNGValidate(reader, lint->relaxng);
if (ret < 0) {
- fprintf(ERR_STREAM,
- "Relax-NG schema %s failed to compile\n", relaxng);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- relaxng = NULL;
+ fprintf(ERR_STREAM, "Relax-NG schema %s failed to compile\n",
+ lint->relaxng);
+ lint->progresult = XMLLINT_ERR_SCHEMACOMP;
+ lint->relaxng = NULL;
}
- if ((timing) && (repeat == 1)) {
- endTimer("Compiling the schemas");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Compiling the schemas");
}
}
- if (schema != NULL) {
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if (lint->schema != NULL) {
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
- ret = xmlTextReaderSchemaValidate(reader, schema);
+ ret = xmlTextReaderSchemaValidate(reader, lint->schema);
if (ret < 0) {
- fprintf(ERR_STREAM,
- "XSD schema %s failed to compile\n", schema);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- schema = NULL;
+ fprintf(ERR_STREAM, "XSD schema %s failed to compile\n",
+ lint->schema);
+ lint->progresult = XMLLINT_ERR_SCHEMACOMP;
+ lint->schema = NULL;
}
- if ((timing) && (repeat == 1)) {
- endTimer("Compiling the schemas");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Compiling the schemas");
}
}
#endif
@@ -1640,49 +1714,49 @@
/*
* Process all nodes in sequence
*/
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
ret = xmlTextReaderRead(reader);
while (ret == 1) {
- if ((debug)
+ if ((lint->debug)
#ifdef LIBXML_PATTERN_ENABLED
- || (patternc)
+ || (lint->patternc)
#endif
)
- processNode(reader);
+ processNode(lint, reader);
ret = xmlTextReaderRead(reader);
}
- if ((timing) && (repeat == 1)) {
+ if ((lint->timing) && (lint->repeat == 1)) {
#ifdef LIBXML_SCHEMAS_ENABLED
- if (relaxng != NULL)
- endTimer("Parsing and validating");
+ if (lint->relaxng != NULL)
+ endTimer(lint, "Parsing and validating");
else
#endif
#ifdef LIBXML_VALID_ENABLED
- if (options & XML_PARSE_DTDVALID)
- endTimer("Parsing and validating");
+ if (lint->options & XML_PARSE_DTDVALID)
+ endTimer(lint, "Parsing and validating");
else
#endif
- endTimer("Parsing");
+ endTimer(lint, "Parsing");
}
#ifdef LIBXML_VALID_ENABLED
- if (options & XML_PARSE_DTDVALID) {
+ if (lint->options & XML_PARSE_DTDVALID) {
if (xmlTextReaderIsValid(reader) != 1) {
fprintf(ERR_STREAM,
"Document %s does not validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
}
}
#endif /* LIBXML_VALID_ENABLED */
#ifdef LIBXML_SCHEMAS_ENABLED
- if ((relaxng != NULL) || (schema != NULL)) {
+ if ((lint->relaxng != NULL) || (lint->schema != NULL)) {
if (xmlTextReaderIsValid(reader) != 1) {
fprintf(ERR_STREAM, "%s fails to validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
} else {
- if (!quiet) {
+ if (!lint->quiet) {
fprintf(ERR_STREAM, "%s validates\n", filename);
}
}
@@ -1694,26 +1768,26 @@
xmlFreeTextReader(reader);
if (ret != 0) {
fprintf(ERR_STREAM, "%s : failed to parse\n", filename);
- progresult = XMLLINT_ERR_UNCLASS;
+ lint->progresult = XMLLINT_ERR_UNCLASS;
}
} else {
fprintf(ERR_STREAM, "Unable to open %s\n", filename);
- progresult = XMLLINT_ERR_UNCLASS;
+ lint->progresult = XMLLINT_ERR_UNCLASS;
}
#ifdef LIBXML_PATTERN_ENABLED
- if (patstream != NULL) {
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
+ if (lint->patstream != NULL) {
+ xmlFreeStreamCtxt(lint->patstream);
+ lint->patstream = NULL;
}
#endif
}
-static void walkDoc(xmlDocPtr doc) {
+static void walkDoc(xmllintState *lint, xmlDocPtr doc) {
xmlTextReaderPtr reader;
int ret;
#ifdef LIBXML_PATTERN_ENABLED
- if (pattern != NULL) {
+ if (lint->pattern != NULL) {
xmlNodePtr root;
const xmlChar *namespaces[22];
int i;
@@ -1723,7 +1797,7 @@
if (root == NULL ) {
fprintf(ERR_STREAM,
"Document does not have a root element");
- progresult = XMLLINT_ERR_UNCLASS;
+ lint->progresult = XMLLINT_ERR_UNCLASS;
return;
}
for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) {
@@ -1733,70 +1807,70 @@
namespaces[i++] = NULL;
namespaces[i] = NULL;
- ret = xmlPatternCompileSafe((const xmlChar *) pattern, doc->dict,
- 0, &namespaces[0], &patternc);
- if (patternc == NULL) {
+ ret = xmlPatternCompileSafe((const xmlChar *) lint->pattern, doc->dict,
+ 0, &namespaces[0], &lint->patternc);
+ if (lint->patternc == NULL) {
if (ret < 0) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
} else {
- fprintf(ERR_STREAM,
- "Pattern %s failed to compile\n", pattern);
- progresult = XMLLINT_ERR_SCHEMAPAT;
+ fprintf(ERR_STREAM, "Pattern %s failed to compile\n",
+ lint->pattern);
+ lint->progresult = XMLLINT_ERR_SCHEMAPAT;
}
goto error;
}
- patstream = xmlPatternGetStreamCtxt(patternc);
- if (patstream == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->patstream = xmlPatternGetStreamCtxt(lint->patternc);
+ if (lint->patstream == NULL) {
+ lint->progresult = XMLLINT_ERR_MEM;
goto error;
}
- ret = xmlStreamPush(patstream, NULL, NULL);
+ ret = xmlStreamPush(lint->patstream, NULL, NULL);
if (ret < 0) {
fprintf(ERR_STREAM, "xmlStreamPush() failure\n");
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
goto error;
}
}
#endif /* LIBXML_PATTERN_ENABLED */
reader = xmlReaderWalker(doc);
if (reader != NULL) {
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
ret = xmlTextReaderRead(reader);
while (ret == 1) {
- if ((debug)
+ if ((lint->debug)
#ifdef LIBXML_PATTERN_ENABLED
- || (patternc)
+ || (lint->patternc)
#endif
)
- processNode(reader);
+ processNode(lint, reader);
ret = xmlTextReaderRead(reader);
}
- if ((timing) && (repeat == 1)) {
- endTimer("walking through the doc");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "walking through the doc");
}
xmlFreeTextReader(reader);
if (ret != 0) {
fprintf(ERR_STREAM, "failed to walk through the doc\n");
- progresult = XMLLINT_ERR_UNCLASS;
+ lint->progresult = XMLLINT_ERR_UNCLASS;
}
} else {
fprintf(ERR_STREAM, "Failed to crate a reader from the document\n");
- progresult = XMLLINT_ERR_UNCLASS;
+ lint->progresult = XMLLINT_ERR_UNCLASS;
}
#ifdef LIBXML_PATTERN_ENABLED
error:
- if (patternc != NULL) {
- xmlFreePattern(patternc);
- patternc = NULL;
+ if (lint->patternc != NULL) {
+ xmlFreePattern(lint->patternc);
+ lint->patternc = NULL;
}
- if (patstream != NULL) {
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
+ if (lint->patstream != NULL) {
+ xmlFreeStreamCtxt(lint->patstream);
+ lint->patstream = NULL;
}
#endif
}
@@ -1809,7 +1883,8 @@
* *
************************************************************************/
-static void doXPathDump(xmlXPathObjectPtr cur) {
+static void
+doXPathDump(xmllintState *lint, xmlXPathObjectPtr cur) {
switch(cur->type) {
case XPATH_NODESET: {
#ifdef LIBXML_OUTPUT_ENABLED
@@ -1818,8 +1893,8 @@
int i;
if ((cur->nodesetval == NULL) || (cur->nodesetval->nodeNr <= 0)) {
- progresult = XMLLINT_ERR_XPATH_EMPTY;
- if (!quiet) {
+ lint->progresult = XMLLINT_ERR_XPATH_EMPTY;
+ if (!lint->quiet) {
fprintf(ERR_STREAM, "XPath set is empty\n");
}
break;
@@ -1827,7 +1902,7 @@
buf = xmlOutputBufferCreateFile(stdout, NULL);
if (buf == NULL) {
fprintf(ERR_STREAM, "Out of memory for XPath\n");
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
return;
}
for (i = 0;i < cur->nodesetval->nodeNr;i++) {
@@ -1866,16 +1941,17 @@
break;
case XPATH_UNDEFINED:
fprintf(ERR_STREAM, "XPath Object is uninitialized\n");
- progresult = XMLLINT_ERR_XPATH;
+ lint->progresult = XMLLINT_ERR_XPATH;
break;
default:
fprintf(ERR_STREAM, "XPath object of unexpected type\n");
- progresult = XMLLINT_ERR_XPATH;
+ lint->progresult = XMLLINT_ERR_XPATH;
break;
}
}
-static void doXPathQuery(xmlDocPtr doc, const char *query) {
+static void
+doXPathQuery(xmllintState *lint, xmlDocPtr doc, const char *query) {
xmlXPathContextPtr ctxt = NULL;
xmlXPathCompExprPtr comp = NULL;
xmlXPathObjectPtr res = NULL;
@@ -1883,19 +1959,19 @@
ctxt = xmlXPathNewContext(doc);
if (ctxt == NULL) {
fprintf(ERR_STREAM, "Out of memory for XPath\n");
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
goto error;
}
comp = xmlXPathCtxtCompile(ctxt, BAD_CAST query);
if (comp == NULL) {
fprintf(ERR_STREAM, "XPath compilation failure\n");
- progresult = XMLLINT_ERR_XPATH;
+ lint->progresult = XMLLINT_ERR_XPATH;
goto error;
}
#ifdef LIBXML_DEBUG_ENABLED
- if (debug) {
+ if (lint->debug) {
xmlXPathDebugDumpCompExpr(stdout, comp, 0);
printf("\n");
}
@@ -1905,11 +1981,11 @@
res = xmlXPathCompiledEval(comp, ctxt);
if (res == NULL) {
fprintf(ERR_STREAM, "XPath evaluation failure\n");
- progresult = XMLLINT_ERR_XPATH;
+ lint->progresult = XMLLINT_ERR_XPATH;
goto error;
}
- doXPathDump(res);
+ doXPathDump(lint, res);
error:
xmlXPathFreeObject(res);
@@ -1925,31 +2001,31 @@
************************************************************************/
static xmlDocPtr
-parseFile(const char *filename, xmlParserCtxtPtr ctxt) {
+parseFile(xmllintState *lint, const char *filename) {
xmlDocPtr doc = NULL;
int errNo;
#ifdef LIBXML_VALID_ENABLED
int valid;
#endif
- if ((generate) && (filename == NULL)) {
+ if ((lint->generate) && (filename == NULL)) {
xmlNodePtr n;
doc = xmlNewDoc(BAD_CAST "1.0");
if (doc == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
return(NULL);
}
n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL);
if (n == NULL) {
xmlFreeDoc(doc);
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
return(NULL);
}
if (xmlNodeSetContent(n, BAD_CAST "abc") < 0) {
xmlFreeNode(n);
xmlFreeDoc(doc);
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
return(NULL);
}
xmlDocSetRootElement(doc, n);
@@ -1959,7 +2035,8 @@
#ifdef LIBXML_HTML_ENABLED
#ifdef LIBXML_PUSH_ENABLED
- if ((html) && (push)) {
+ if ((lint->html) && (lint->push)) {
+ htmlParserCtxtPtr ctxt;
FILE *f;
int res;
char chars[4096];
@@ -1970,7 +2047,7 @@
f = fopen(filename, "rb");
if (f == NULL) {
fprintf(ERR_STREAM, "Can't open %s\n", filename);
- progresult = XMLLINT_ERR_RDFILE;
+ lint->progresult = XMLLINT_ERR_RDFILE;
return(NULL);
}
}
@@ -1979,13 +2056,13 @@
ctxt = htmlCreatePushParserCtxt(NULL, NULL,
chars, res, filename, XML_CHAR_ENCODING_NONE);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
if (f != stdin)
fclose(f);
return(NULL);
}
- htmlCtxtUseOptions(ctxt, options);
- while ((res = fread(chars, 1, pushsize, f)) > 0) {
+ htmlCtxtUseOptions(ctxt, lint->options);
+ while ((res = fread(chars, 1, lint->pushsize, f)) > 0) {
htmlParseChunk(ctxt, chars, res, 0);
}
htmlParseChunk(ctxt, chars, 0, 1);
@@ -1998,14 +2075,15 @@
}
#endif /* LIBXML_PUSH_ENABLED */
- if (html) {
- doc = parseHtml(ctxt, filename);
+ if (lint->html) {
+ doc = parseHtml(lint, filename);
return(doc);
}
#endif /* LIBXML_HTML_ENABLED */
#ifdef LIBXML_PUSH_ENABLED
- if (push) {
+ if (lint->push) {
+ xmlParserCtxtPtr ctxt;
FILE *f;
int res;
char chars[4096];
@@ -2016,30 +2094,31 @@
f = fopen(filename, "rb");
if (f == NULL) {
fprintf(ERR_STREAM, "Can't open %s\n", filename);
- progresult = XMLLINT_ERR_RDFILE;
+ lint->progresult = XMLLINT_ERR_RDFILE;
return(NULL);
}
}
res = fread(chars, 1, 4, f);
- ctxt = xmlCreatePushParserCtxt(NULL, NULL,
- chars, res, filename);
+ ctxt = xmlCreatePushParserCtxt(NULL, NULL, chars, res, filename);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
if (f != stdin)
fclose(f);
return(NULL);
}
- xmlCtxtSetResourceLoader(ctxt, xmllintResourceLoader, NULL);
- xmlCtxtUseOptions(ctxt, options);
- if (maxAmpl > 0)
- xmlCtxtSetMaxAmplification(ctxt, maxAmpl);
+ xmlCtxtSetResourceLoader(ctxt, xmllintResourceLoader, lint);
+ xmlCtxtUseOptions(ctxt, lint->options);
+ if (lint->maxAmpl > 0)
+ xmlCtxtSetMaxAmplification(ctxt, lint->maxAmpl);
- if (htmlout)
+ if (lint->htmlout) {
+ ctxt->_private = lint;
xmlCtxtSetErrorHandler(ctxt, xmlHTMLError, ctxt);
+ }
- while ((res = fread(chars, 1, pushsize, f)) > 0) {
+ while ((res = fread(chars, 1, lint->pushsize, f)) > 0) {
xmlParseChunk(ctxt, chars, res, 0);
}
xmlParseChunk(ctxt, chars, 0, 1);
@@ -2055,25 +2134,27 @@
} else
#endif /* LIBXML_PUSH_ENABLED */
{
- doc = parseXml(ctxt, filename);
- errNo = ctxt->errNo;
-#ifdef LIBXML_VALID_ENABLED
- valid = ctxt->valid;
-#endif
+ if (lint->htmlout) {
+ lint->ctxt->_private = lint;
+ xmlCtxtSetErrorHandler(lint->ctxt, xmlHTMLError, lint->ctxt);
+ }
- if (htmlout)
- xmlCtxtSetErrorHandler(ctxt, xmlHTMLError, ctxt);
+ doc = parseXml(lint, filename);
+ errNo = lint->ctxt->errNo;
+#ifdef LIBXML_VALID_ENABLED
+ valid = lint->ctxt->valid;
+#endif
}
if (doc == NULL) {
if (errNo == XML_ERR_NO_MEMORY)
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
else
- progresult = XMLLINT_ERR_RDFILE;
+ lint->progresult = XMLLINT_ERR_RDFILE;
} else {
#ifdef LIBXML_VALID_ENABLED
- if ((options & XML_PARSE_DTDVALID) && (valid == 0))
- progresult = XMLLINT_ERR_VALID;
+ if ((lint->options & XML_PARSE_DTDVALID) && (valid == 0))
+ lint->progresult = XMLLINT_ERR_VALID;
#endif /* LIBXML_VALID_ENABLED */
}
@@ -2081,24 +2162,24 @@
}
static void
-parseAndPrintFile(const char *filename, xmlParserCtxtPtr pctxt) {
+parseAndPrintFile(xmllintState *lint, const char *filename) {
xmlDocPtr doc;
- if ((timing) && (repeat == 1))
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1))
+ startTimer(lint);
- doc = parseFile(filename, pctxt);
+ doc = parseFile(lint, filename);
if (doc == NULL) {
- if (progresult == XMLLINT_RETURN_OK)
- progresult = XMLLINT_ERR_UNCLASS;
+ if (lint->progresult == XMLLINT_RETURN_OK)
+ lint->progresult = XMLLINT_ERR_UNCLASS;
return;
}
- if ((timing) && (repeat == 1)) {
- endTimer("Parsing");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Parsing");
}
- if (dropdtd) {
+ if (lint->dropdtd) {
xmlDtdPtr dtd;
dtd = xmlGetIntSubset(doc);
@@ -2109,14 +2190,16 @@
}
#ifdef LIBXML_XINCLUDE_ENABLED
- if (xinclude) {
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if (lint->xinclude) {
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
- if (xmlXIncludeProcessFlags(doc, options) < 0)
- progresult = XMLLINT_ERR_UNCLASS;
- if ((timing) && (repeat == 1)) {
- endTimer("Xinclude processing");
+ if (xmlXIncludeProcessFlags(doc, lint->options) < 0) {
+ lint->progresult = XMLLINT_ERR_UNCLASS;
+ return;
+ }
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Xinclude processing");
}
}
#endif
@@ -2125,7 +2208,7 @@
/*
* shell interaction
*/
- if (shell) {
+ if (lint->shell) {
#ifdef LIBXML_XPATH_ENABLED
xmlXPathOrderDocElems(doc);
#endif
@@ -2135,44 +2218,44 @@
#endif
#ifdef LIBXML_XPATH_ENABLED
- if (xpathquery != NULL) {
+ if (lint->xpathquery != NULL) {
xmlXPathOrderDocElems(doc);
- doXPathQuery(doc, xpathquery);
+ doXPathQuery(lint, doc, lint->xpathquery);
}
#endif
/*
* test intermediate copy if needed.
*/
- if (copy) {
+ if (lint->copy) {
xmlDocPtr tmp;
tmp = doc;
- if (timing) {
- startTimer();
+ if (lint->timing) {
+ startTimer(lint);
}
doc = xmlCopyDoc(doc, 1);
if (doc == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(tmp);
return;
}
- if (timing) {
- endTimer("Copying");
+ if (lint->timing) {
+ endTimer(lint, "Copying");
}
- if (timing) {
- startTimer();
+ if (lint->timing) {
+ startTimer(lint);
}
xmlFreeDoc(tmp);
- if (timing) {
- endTimer("Freeing original");
+ if (lint->timing) {
+ endTimer(lint, "Freeing original");
}
}
#ifdef LIBXML_VALID_ENABLED
- if ((insert)
+ if ((lint->insert)
#ifdef LIBXML_HTML_ENABLED
- && (!html)
+ && (!lint->html)
#endif
) {
const xmlChar* list[256];
@@ -2200,68 +2283,72 @@
}
}
}
- }else
+ } else
#endif /* LIBXML_VALID_ENABLED */
#ifdef LIBXML_READER_ENABLED
- if (walker) {
- walkDoc(doc);
+ if (lint->walker) {
+ walkDoc(lint, doc);
}
#endif /* LIBXML_READER_ENABLED */
#ifdef LIBXML_OUTPUT_ENABLED
- if (noout == 0) {
- if (compress)
+ if (lint->noout == 0) {
+ if (lint->compress)
xmlSetDocCompressMode(doc, 9);
/*
* print it.
*/
#ifdef LIBXML_DEBUG_ENABLED
- if (!debug) {
+ if (!lint->debug) {
#endif
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
#ifdef LIBXML_HTML_ENABLED
- if ((html) && (!xmlout)) {
- if (compress) {
- htmlSaveFile(output ? output : "-", doc);
+ if ((lint->html) && (!lint->xmlout)) {
+ if (lint->compress) {
+ htmlSaveFile(lint->output ? lint->output : "-", doc);
}
- else if (encoding != NULL) {
- if (format == 1) {
- htmlSaveFileFormat(output ? output : "-", doc, encoding, 1);
+ else if (lint->encoding != NULL) {
+ if (lint->format == 1) {
+ htmlSaveFileFormat(lint->output ? lint->output : "-",
+ doc, lint->encoding, 1);
}
else {
- htmlSaveFileFormat(output ? output : "-", doc, encoding, 0);
+ htmlSaveFileFormat(lint->output ? lint->output : "-",
+ doc, lint->encoding, 0);
}
}
- else if (format == 1) {
- htmlSaveFileFormat(output ? output : "-", doc, NULL, 1);
+ else if (lint->format == 1) {
+ htmlSaveFileFormat(lint->output ? lint->output : "-",
+ doc, NULL, 1);
}
else {
FILE *out;
- if (output == NULL)
+ if (lint->output == NULL)
out = stdout;
else {
- out = fopen(output,"wb");
+ out = fopen(lint->output,"wb");
}
if (out != NULL) {
if (htmlDocDump(out, doc) < 0)
- progresult = XMLLINT_ERR_OUT;
+ lint->progresult = XMLLINT_ERR_OUT;
- if (output != NULL)
+ if (lint->output != NULL)
fclose(out);
} else {
- fprintf(ERR_STREAM, "failed to open %s\n", output);
- progresult = XMLLINT_ERR_OUT;
+ fprintf(ERR_STREAM, "failed to open %s\n",
+ lint->output);
+ lint->progresult = XMLLINT_ERR_OUT;
}
}
- if ((timing) && (repeat == 1)) {
- endTimer("Saving");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Saving");
}
} else
#endif
#ifdef LIBXML_C14N_ENABLED
- if (canonical) {
+ if (lint->canonical) {
xmlChar *result = NULL;
int size;
@@ -2273,9 +2360,9 @@
xmlFree(result);
} else {
fprintf(ERR_STREAM, "Failed to canonicalize\n");
- progresult = XMLLINT_ERR_OUT;
+ lint->progresult = XMLLINT_ERR_OUT;
}
- } else if (canonical_11) {
+ } else if (lint->canonical_11) {
xmlChar *result = NULL;
int size;
@@ -2287,10 +2374,9 @@
xmlFree(result);
} else {
fprintf(ERR_STREAM, "Failed to canonicalize\n");
- progresult = XMLLINT_ERR_OUT;
+ lint->progresult = XMLLINT_ERR_OUT;
}
- } else
- if (exc_canonical) {
+ } else if (lint->exc_canonical) {
xmlChar *result = NULL;
int size;
@@ -2302,30 +2388,32 @@
xmlFree(result);
} else {
fprintf(ERR_STREAM, "Failed to canonicalize\n");
- progresult = XMLLINT_ERR_OUT;
+ lint->progresult = XMLLINT_ERR_OUT;
}
} else
#endif
#if HAVE_DECL_MMAP
- if (memory) {
+ if (lint->memory) {
xmlChar *result;
int len;
- if (encoding != NULL) {
- if (format == 1) {
- xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1);
+ if (lint->encoding != NULL) {
+ if (lint->format == 1) {
+ xmlDocDumpFormatMemoryEnc(doc, &result, &len,
+ lint->encoding, 1);
} else {
- xmlDocDumpMemoryEnc(doc, &result, &len, encoding);
+ xmlDocDumpMemoryEnc(doc, &result, &len,
+ lint->encoding);
}
} else {
- if (format == 1)
+ if (lint->format == 1)
xmlDocDumpFormatMemory(doc, &result, &len, 1);
else
xmlDocDumpMemory(doc, &result, &len);
}
if (result == NULL) {
fprintf(ERR_STREAM, "Failed to save\n");
- progresult = XMLLINT_ERR_OUT;
+ lint->progresult = XMLLINT_ERR_OUT;
} else {
if (write(1, result, len) == -1) {
fprintf(ERR_STREAM, "Can't write data\n");
@@ -2335,57 +2423,59 @@
} else
#endif /* HAVE_DECL_MMAP */
- if (compress) {
- xmlSaveFile(output ? output : "-", doc);
+ if (lint->compress) {
+ xmlSaveFile(lint->output ? lint->output : "-", doc);
} else {
xmlSaveCtxtPtr ctxt;
int saveOpts = 0;
- if (format == 1)
+ if (lint->format == 1)
saveOpts |= XML_SAVE_FORMAT;
- else if (format == 2)
+ else if (lint->format == 2)
saveOpts |= XML_SAVE_WSNONSIG;
#if defined(LIBXML_HTML_ENABLED)
- if (xmlout)
+ if (lint->xmlout)
saveOpts |= XML_SAVE_AS_XML;
#endif
- if (output == NULL)
- ctxt = xmlSaveToFd(1, encoding, saveOpts);
+ if (lint->output == NULL)
+ ctxt = xmlSaveToFd(STDOUT_FILENO, lint->encoding,
+ saveOpts);
else
- ctxt = xmlSaveToFilename(output, encoding, saveOpts);
+ ctxt = xmlSaveToFilename(lint->output, lint->encoding,
+ saveOpts);
if (ctxt != NULL) {
if (xmlSaveDoc(ctxt, doc) < 0) {
fprintf(ERR_STREAM, "failed save to %s\n",
- output ? output : "-");
- progresult = XMLLINT_ERR_OUT;
+ lint->output ? lint->output : "-");
+ lint->progresult = XMLLINT_ERR_OUT;
}
xmlSaveClose(ctxt);
} else {
- progresult = XMLLINT_ERR_OUT;
+ lint->progresult = XMLLINT_ERR_OUT;
}
}
- if ((timing) && (repeat == 1)) {
- endTimer("Saving");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Saving");
}
#ifdef LIBXML_DEBUG_ENABLED
} else {
FILE *out;
- if (output == NULL)
+ if (lint->output == NULL)
out = stdout;
else {
- out = fopen(output,"wb");
+ out = fopen(lint->output, "wb");
}
if (out != NULL) {
xmlDebugDumpDocument(out, doc);
- if (output != NULL)
+ if (lint->output != NULL)
fclose(out);
} else {
- fprintf(ERR_STREAM, "failed to open %s\n", output);
- progresult = XMLLINT_ERR_OUT;
+ fprintf(ERR_STREAM, "failed to open %s\n", lint->output);
+ lint->progresult = XMLLINT_ERR_OUT;
}
}
#endif
@@ -2396,27 +2486,27 @@
/*
* A posteriori validation test
*/
- if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) {
+ if ((lint->dtdvalid != NULL) || (lint->dtdvalidfpi != NULL)) {
xmlDtdPtr dtd;
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
- if (dtdvalid != NULL)
- dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
+ if (lint->dtdvalid != NULL)
+ dtd = xmlParseDTD(NULL, BAD_CAST lint->dtdvalid);
else
- dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
- if ((timing) && (repeat == 1)) {
- endTimer("Parsing DTD");
+ dtd = xmlParseDTD(BAD_CAST lint->dtdvalidfpi, NULL);
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Parsing DTD");
}
if (dtd == NULL) {
- if (dtdvalid != NULL)
- fprintf(ERR_STREAM,
- "Could not parse DTD %s\n", dtdvalid);
+ if (lint->dtdvalid != NULL)
+ fprintf(ERR_STREAM, "Could not parse DTD %s\n",
+ lint->dtdvalid);
else
- fprintf(ERR_STREAM,
- "Could not parse DTD %s\n", dtdvalidfpi);
- progresult = XMLLINT_ERR_DTD;
+ fprintf(ERR_STREAM, "Could not parse DTD %s\n",
+ lint->dtdvalidfpi);
+ lint->progresult = XMLLINT_ERR_DTD;
} else {
xmlValidCtxtPtr cvp;
@@ -2424,168 +2514,168 @@
if (cvp == NULL) {
fprintf(ERR_STREAM,
"Couldn't allocate validation context\n");
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
xmlFreeDtd(dtd);
return;
}
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
if (!xmlValidateDtd(cvp, doc, dtd)) {
- if (dtdvalid != NULL)
+ if (lint->dtdvalid != NULL)
fprintf(ERR_STREAM,
"Document %s does not validate against %s\n",
- filename, dtdvalid);
+ filename, lint->dtdvalid);
else
fprintf(ERR_STREAM,
"Document %s does not validate against %s\n",
- filename, dtdvalidfpi);
- progresult = XMLLINT_ERR_VALID;
+ filename, lint->dtdvalidfpi);
+ lint->progresult = XMLLINT_ERR_VALID;
}
- if ((timing) && (repeat == 1)) {
- endTimer("Validating against DTD");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Validating against DTD");
}
xmlFreeValidCtxt(cvp);
xmlFreeDtd(dtd);
}
- } else if (postvalid) {
+ } else if (lint->postvalid) {
xmlValidCtxtPtr cvp;
cvp = xmlNewValidCtxt();
if (cvp == NULL) {
fprintf(ERR_STREAM,
"Couldn't allocate validation context\n");
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(doc);
return;
}
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
if (!xmlValidateDocument(cvp, doc)) {
fprintf(ERR_STREAM,
"Document %s does not validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
}
- if ((timing) && (repeat == 1)) {
- endTimer("Validating");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Validating");
}
xmlFreeValidCtxt(cvp);
}
#endif /* LIBXML_VALID_ENABLED */
#ifdef LIBXML_SCHEMATRON_ENABLED
- if (wxschematron != NULL) {
+ if (lint->wxschematron != NULL) {
xmlSchematronValidCtxtPtr ctxt;
int ret;
int flag;
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
- if (debug)
+ if (lint->debug)
flag = XML_SCHEMATRON_OUT_XML;
else
flag = XML_SCHEMATRON_OUT_TEXT;
- if (noout)
+ if (lint->noout)
flag |= XML_SCHEMATRON_OUT_QUIET;
- ctxt = xmlSchematronNewValidCtxt(wxschematron, flag);
+ ctxt = xmlSchematronNewValidCtxt(lint->wxschematron, flag);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(doc);
return;
}
ret = xmlSchematronValidateDoc(ctxt, doc);
if (ret == 0) {
- if (!quiet) {
+ if (!lint->quiet) {
fprintf(ERR_STREAM, "%s validates\n", filename);
}
} else if (ret > 0) {
fprintf(ERR_STREAM, "%s fails to validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
} else {
fprintf(ERR_STREAM, "%s validation generated an internal error\n",
filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
}
xmlSchematronFreeValidCtxt(ctxt);
- if ((timing) && (repeat == 1)) {
- endTimer("Validating");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Validating");
}
}
#endif
#ifdef LIBXML_SCHEMAS_ENABLED
- if (relaxngschemas != NULL) {
+ if (lint->relaxngschemas != NULL) {
xmlRelaxNGValidCtxtPtr ctxt;
int ret;
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
- ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
+ ctxt = xmlRelaxNGNewValidCtxt(lint->relaxngschemas);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(doc);
return;
}
ret = xmlRelaxNGValidateDoc(ctxt, doc);
if (ret == 0) {
- if (!quiet) {
+ if (!lint->quiet) {
fprintf(ERR_STREAM, "%s validates\n", filename);
}
} else if (ret > 0) {
fprintf(ERR_STREAM, "%s fails to validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
} else {
fprintf(ERR_STREAM, "%s validation generated an internal error\n",
filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
}
xmlRelaxNGFreeValidCtxt(ctxt);
- if ((timing) && (repeat == 1)) {
- endTimer("Validating");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Validating");
}
- } else if (wxschemas != NULL) {
+ } else if (lint->wxschemas != NULL) {
xmlSchemaValidCtxtPtr ctxt;
int ret;
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
- ctxt = xmlSchemaNewValidCtxt(wxschemas);
+ ctxt = xmlSchemaNewValidCtxt(lint->wxschemas);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
xmlFreeDoc(doc);
return;
}
ret = xmlSchemaValidateDoc(ctxt, doc);
if (ret == 0) {
- if (!quiet) {
+ if (!lint->quiet) {
fprintf(ERR_STREAM, "%s validates\n", filename);
}
} else if (ret > 0) {
fprintf(ERR_STREAM, "%s fails to validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
} else {
fprintf(ERR_STREAM, "%s validation generated an internal error\n",
filename);
- progresult = XMLLINT_ERR_VALID;
+ lint->progresult = XMLLINT_ERR_VALID;
}
xmlSchemaFreeValidCtxt(ctxt);
- if ((timing) && (repeat == 1)) {
- endTimer("Validating");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Validating");
}
}
#endif
#ifdef LIBXML_DEBUG_ENABLED
- if ((debugent)
+ if ((lint->debugent)
#if defined(LIBXML_HTML_ENABLED)
- && (!html)
+ && (!lint->html)
#endif
)
xmlDebugDumpEntities(ERR_STREAM, doc);
@@ -2598,12 +2688,12 @@
/*
* free it.
*/
- if ((timing) && (repeat == 1)) {
- startTimer();
+ if ((lint->timing) && (lint->repeat == 1)) {
+ startTimer(lint);
}
xmlFreeDoc(doc);
- if ((timing) && (repeat == 1)) {
- endTimer("Freeing");
+ if ((lint->timing) && (lint->repeat == 1)) {
+ endTimer(lint, "Freeing");
}
}
@@ -2835,96 +2925,320 @@
return(0);
}
+static void
+xmllintInit(xmllintState *lint) {
+ memset(lint, 0, sizeof(*lint));
+
+ lint->repeat = 1;
+ lint->progresult = XMLLINT_RETURN_OK;
+ lint->options = XML_PARSE_COMPACT | XML_PARSE_BIG_LINES;
+}
+
static int
-xmllintMain(int argc, const char **argv, xmlResourceLoader loader) {
- int i, j;
- int files = 0;
- int version = 0;
- int nowrap = 0;
- int sax = 0;
-#ifdef LIBXML_READER_ENABLED
- int stream = 0;
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
- int catalogs = 0;
- int nocatalogs = 0;
-#endif
+xmllintParseOptions(xmllintState *lint, int argc, const char **argv) {
+ int i;
- defaultResourceLoader = loader;
+ if (argc <= 1) {
+ usage(ERR_STREAM, argv[0]);
+ return(XMLLINT_ERR_UNCLASS);
+ }
-#ifdef XMLLINT_FUZZ
-#ifdef LIBXML_DEBUG_ENABLED
- shell = 0;
- debugent = 0;
-#endif
- debug = 0;
- maxmem = 0;
- copy = 0;
- noout = 0;
-#ifdef LIBXML_OUTPUT_ENABLED
- format = 0;
- output = NULL;
- compress = 0;
-#endif /* LIBXML_OUTPUT_ENABLED */
+ for (i = 1; i < argc ; i++) {
+ if (argv[i][0] != '-' || argv[i][1] == 0)
+ continue;
+
+ if ((!strcmp(argv[i], "-maxmem")) ||
+ (!strcmp(argv[i], "--maxmem"))) {
+ i++;
+ if (i >= argc) {
+ fprintf(ERR_STREAM, "maxmem: missing integer value\n");
+ return(XMLLINT_ERR_UNCLASS);
+ }
+ errno = 0;
+ xmllintMaxmem = parseInteger("maxmem", argv[i], 0, INT_MAX);
+ } else if ((!strcmp(argv[i], "-debug")) ||
+ (!strcmp(argv[i], "--debug"))) {
+ lint->debug = 1;
+ } else if ((!strcmp(argv[i], "-shell")) ||
+ (!strcmp(argv[i], "--shell"))) {
+ lint->shell = 1;
+ } else if ((!strcmp(argv[i], "-copy")) ||
+ (!strcmp(argv[i], "--copy"))) {
+ lint->copy = 1;
+ } else if ((!strcmp(argv[i], "-recover")) ||
+ (!strcmp(argv[i], "--recover"))) {
+ lint->options |= XML_PARSE_RECOVER;
+ } else if ((!strcmp(argv[i], "-huge")) ||
+ (!strcmp(argv[i], "--huge"))) {
+ lint->options |= XML_PARSE_HUGE;
+ } else if ((!strcmp(argv[i], "-noent")) ||
+ (!strcmp(argv[i], "--noent"))) {
+ lint->options |= XML_PARSE_NOENT;
+ } else if ((!strcmp(argv[i], "-noenc")) ||
+ (!strcmp(argv[i], "--noenc"))) {
+ lint->options |= XML_PARSE_IGNORE_ENC;
+ } else if ((!strcmp(argv[i], "-nsclean")) ||
+ (!strcmp(argv[i], "--nsclean"))) {
+ lint->options |= XML_PARSE_NSCLEAN;
+ } else if ((!strcmp(argv[i], "-nocdata")) ||
+ (!strcmp(argv[i], "--nocdata"))) {
+ lint->options |= XML_PARSE_NOCDATA;
+ } else if ((!strcmp(argv[i], "-nodict")) ||
+ (!strcmp(argv[i], "--nodict"))) {
+ lint->options |= XML_PARSE_NODICT;
+ } else if ((!strcmp(argv[i], "-version")) ||
+ (!strcmp(argv[i], "--version"))) {
+ showVersion(argv[0]);
+ lint->version = 1;
+ } else if ((!strcmp(argv[i], "-noout")) ||
+ (!strcmp(argv[i], "--noout"))) {
+ lint->noout = 1;
+ } else if ((!strcmp(argv[i], "-htmlout")) ||
+ (!strcmp(argv[i], "--htmlout"))) {
+ lint->htmlout = 1;
+ } else if ((!strcmp(argv[i], "-nowrap")) ||
+ (!strcmp(argv[i], "--nowrap"))) {
+ lint->nowrap = 1;
+#ifdef LIBXML_HTML_ENABLED
+ } else if ((!strcmp(argv[i], "-html")) ||
+ (!strcmp(argv[i], "--html"))) {
+ lint->html = 1;
+ } else if ((!strcmp(argv[i], "-xmlout")) ||
+ (!strcmp(argv[i], "--xmlout"))) {
+ lint->xmlout = 1;
+ } else if ((!strcmp(argv[i], "-nodefdtd")) ||
+ (!strcmp(argv[i], "--nodefdtd"))) {
+ lint->options |= HTML_PARSE_NODEFDTD;
+#endif /* LIBXML_HTML_ENABLED */
+ } else if ((!strcmp(argv[i], "-loaddtd")) ||
+ (!strcmp(argv[i], "--loaddtd"))) {
+ lint->options |= XML_PARSE_DTDLOAD;
+ } else if ((!strcmp(argv[i], "-dtdattr")) ||
+ (!strcmp(argv[i], "--dtdattr"))) {
+ lint->options |= XML_PARSE_DTDATTR;
#ifdef LIBXML_VALID_ENABLED
- postvalid = 0;
- dtdvalid = NULL;
- dtdvalidfpi = NULL;
- insert = 0;
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
- relaxng = NULL;
- relaxngschemas = NULL;
- schema = NULL;
- wxschemas = NULL;
-#endif
-#ifdef LIBXML_SCHEMATRON_ENABLED
- schematron = NULL;
- wxschematron = NULL;
-#endif
- repeat = 1;
-#if defined(LIBXML_HTML_ENABLED)
- html = 0;
- xmlout = 0;
-#endif
- htmlout = 0;
+ } else if ((!strcmp(argv[i], "-valid")) ||
+ (!strcmp(argv[i], "--valid"))) {
+ lint->options |= XML_PARSE_DTDVALID;
+ } else if ((!strcmp(argv[i], "-postvalid")) ||
+ (!strcmp(argv[i], "--postvalid"))) {
+ lint->postvalid = 1;
+ lint->options |= XML_PARSE_DTDLOAD;
+ } else if ((!strcmp(argv[i], "-dtdvalid")) ||
+ (!strcmp(argv[i], "--dtdvalid"))) {
+ i++;
+ lint->dtdvalid = argv[i];
+ lint->options |= XML_PARSE_DTDLOAD;
+ } else if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
+ (!strcmp(argv[i], "--dtdvalidfpi"))) {
+ i++;
+ lint->dtdvalidfpi = argv[i];
+ lint->options |= XML_PARSE_DTDLOAD;
+ } else if ((!strcmp(argv[i], "-insert")) ||
+ (!strcmp(argv[i], "--insert"))) {
+ lint->insert = 1;
+#endif /* LIBXML_VALID_ENABLED */
+ } else if ((!strcmp(argv[i], "-dropdtd")) ||
+ (!strcmp(argv[i], "--dropdtd"))) {
+ lint->dropdtd = 1;
+ } else if ((!strcmp(argv[i], "-quiet")) ||
+ (!strcmp(argv[i], "--quiet"))) {
+ lint->quiet = 1;
+ } else if ((!strcmp(argv[i], "-timing")) ||
+ (!strcmp(argv[i], "--timing"))) {
+ lint->timing = 1;
+ } else if ((!strcmp(argv[i], "-auto")) ||
+ (!strcmp(argv[i], "--auto"))) {
+ lint->generate = 1;
+ } else if ((!strcmp(argv[i], "-repeat")) ||
+ (!strcmp(argv[i], "--repeat"))) {
+ if (lint->repeat > 1)
+ lint->repeat *= 10;
+ else
+ lint->repeat = 100;
#ifdef LIBXML_PUSH_ENABLED
- push = 0;
+ } else if ((!strcmp(argv[i], "-push")) ||
+ (!strcmp(argv[i], "--push"))) {
+ lint->push = 1;
#endif /* LIBXML_PUSH_ENABLED */
#if HAVE_DECL_MMAP
- memory = 0;
- memoryData = NULL;
- memorySize = 0;
+ } else if ((!strcmp(argv[i], "-memory")) ||
+ (!strcmp(argv[i], "--memory"))) {
+ lint->memory = 1;
#endif
- testIO = 0;
- encoding = NULL;
+ } else if ((!strcmp(argv[i], "-testIO")) ||
+ (!strcmp(argv[i], "--testIO"))) {
+ lint->testIO = 1;
#ifdef LIBXML_XINCLUDE_ENABLED
- xinclude = 0;
+ } else if ((!strcmp(argv[i], "-xinclude")) ||
+ (!strcmp(argv[i], "--xinclude"))) {
+ lint->xinclude = 1;
+ lint->options |= XML_PARSE_XINCLUDE;
+ } else if ((!strcmp(argv[i], "-noxincludenode")) ||
+ (!strcmp(argv[i], "--noxincludenode"))) {
+ lint->xinclude = 1;
+ lint->options |= XML_PARSE_XINCLUDE;
+ lint->options |= XML_PARSE_NOXINCNODE;
+ } else if ((!strcmp(argv[i], "-nofixup-base-uris")) ||
+ (!strcmp(argv[i], "--nofixup-base-uris"))) {
+ lint->xinclude = 1;
+ lint->options |= XML_PARSE_XINCLUDE;
+ lint->options |= XML_PARSE_NOBASEFIX;
#endif
- progresult = XMLLINT_RETURN_OK;
- quiet = 0;
- timing = 0;
- generate = 0;
- dropdtd = 0;
+ } else if ((!strcmp(argv[i], "-nowarning")) ||
+ (!strcmp(argv[i], "--nowarning"))) {
+ lint->options |= XML_PARSE_NOWARNING;
+ lint->options &= ~XML_PARSE_PEDANTIC;
+ } else if ((!strcmp(argv[i], "-pedantic")) ||
+ (!strcmp(argv[i], "--pedantic"))) {
+ lint->options |= XML_PARSE_PEDANTIC;
+ lint->options &= ~XML_PARSE_NOWARNING;
+#ifdef LIBXML_DEBUG_ENABLED
+ } else if ((!strcmp(argv[i], "-debugent")) ||
+ (!strcmp(argv[i], "--debugent"))) {
+ lint->debugent = 1;
+#endif
#ifdef LIBXML_C14N_ENABLED
- canonical = 0;
- canonical_11 = 0;
- exc_canonical = 0;
+ } else if ((!strcmp(argv[i], "-c14n")) ||
+ (!strcmp(argv[i], "--c14n"))) {
+ lint->canonical = 1;
+ lint->options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
+ } else if ((!strcmp(argv[i], "-c14n11")) ||
+ (!strcmp(argv[i], "--c14n11"))) {
+ lint->canonical_11 = 1;
+ lint->options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
+ } else if ((!strcmp(argv[i], "-exc-c14n")) ||
+ (!strcmp(argv[i], "--exc-c14n"))) {
+ lint->exc_canonical = 1;
+ lint->options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
#endif
+#ifdef LIBXML_CATALOG_ENABLED
+ } else if ((!strcmp(argv[i], "-catalogs")) ||
+ (!strcmp(argv[i], "--catalogs"))) {
+ lint->catalogs = 1;
+ } else if ((!strcmp(argv[i], "-nocatalogs")) ||
+ (!strcmp(argv[i], "--nocatalogs"))) {
+ lint->nocatalogs = 1;
+#endif
+ } else if ((!strcmp(argv[i], "-noblanks")) ||
+ (!strcmp(argv[i], "--noblanks"))) {
+ lint->options |= XML_PARSE_NOBLANKS;
+#ifdef LIBXML_OUTPUT_ENABLED
+ } else if ((!strcmp(argv[i], "-o")) ||
+ (!strcmp(argv[i], "-output")) ||
+ (!strcmp(argv[i], "--output"))) {
+ i++;
+ lint->output = argv[i];
+ } else if ((!strcmp(argv[i], "-format")) ||
+ (!strcmp(argv[i], "--format"))) {
+ lint->format = 1;
+ lint->options |= XML_PARSE_NOBLANKS;
+ } else if ((!strcmp(argv[i], "-encode")) ||
+ (!strcmp(argv[i], "--encode"))) {
+ i++;
+ lint->encoding = argv[i];
+ } else if ((!strcmp(argv[i], "-pretty")) ||
+ (!strcmp(argv[i], "--pretty"))) {
+ i++;
+ if (argv[i] != NULL)
+ lint->format = atoi(argv[i]);
+#ifdef LIBXML_ZLIB_ENABLED
+ } else if ((!strcmp(argv[i], "-compress")) ||
+ (!strcmp(argv[i], "--compress"))) {
+ lint->compress = 1;
+#endif
+#endif /* LIBXML_OUTPUT_ENABLED */
#ifdef LIBXML_READER_ENABLED
- walker = 0;
+ } else if ((!strcmp(argv[i], "-stream")) ||
+ (!strcmp(argv[i], "--stream"))) {
+ lint->stream = 1;
+ } else if ((!strcmp(argv[i], "-walker")) ||
+ (!strcmp(argv[i], "--walker"))) {
+ lint->walker = 1;
+ lint->noout = 1;
#ifdef LIBXML_PATTERN_ENABLED
- pattern = NULL;
- patternc = NULL;
- patstream = NULL;
+ } else if ((!strcmp(argv[i], "-pattern")) ||
+ (!strcmp(argv[i], "--pattern"))) {
+ i++;
+ lint->pattern = argv[i];
#endif
#endif /* LIBXML_READER_ENABLED */
-#ifdef LIBXML_XPATH_ENABLED
- xpathquery = NULL;
+#ifdef LIBXML_SAX1_ENABLED
+ } else if ((!strcmp(argv[i], "-sax1")) ||
+ (!strcmp(argv[i], "--sax1"))) {
+ lint->options |= XML_PARSE_SAX1;
+#endif /* LIBXML_SAX1_ENABLED */
+ } else if ((!strcmp(argv[i], "-sax")) ||
+ (!strcmp(argv[i], "--sax"))) {
+ lint->sax = 1;
+#ifdef LIBXML_SCHEMAS_ENABLED
+ } else if ((!strcmp(argv[i], "-relaxng")) ||
+ (!strcmp(argv[i], "--relaxng"))) {
+ i++;
+ lint->relaxng = argv[i];
+ lint->options |= XML_PARSE_NOENT;
+ } else if ((!strcmp(argv[i], "-schema")) ||
+ (!strcmp(argv[i], "--schema"))) {
+ i++;
+ lint->schema = argv[i];
+ lint->options |= XML_PARSE_NOENT;
#endif
- options = XML_PARSE_COMPACT | XML_PARSE_BIG_LINES;
- maxAmpl = 0;
-#endif /* XMLLINT_FUZZ */
+#ifdef LIBXML_SCHEMATRON_ENABLED
+ } else if ((!strcmp(argv[i], "-schematron")) ||
+ (!strcmp(argv[i], "--schematron"))) {
+ i++;
+ lint->schematron = argv[i];
+ lint->options |= XML_PARSE_NOENT;
+#endif
+ } else if ((!strcmp(argv[i], "-nonet")) ||
+ (!strcmp(argv[i], "--nonet"))) {
+ lint->options |= XML_PARSE_NONET;
+ } else if ((!strcmp(argv[i], "-nocompact")) ||
+ (!strcmp(argv[i], "--nocompact"))) {
+ lint->options &= ~XML_PARSE_COMPACT;
+ } else if ((!strcmp(argv[i], "-load-trace")) ||
+ (!strcmp(argv[i], "--load-trace"))) {
+ lint->load_trace = 1;
+ } else if ((!strcmp(argv[i], "-path")) ||
+ (!strcmp(argv[i], "--path"))) {
+ i++;
+ parsePath(lint, BAD_CAST argv[i]);
+#ifdef LIBXML_XPATH_ENABLED
+ } else if ((!strcmp(argv[i], "-xpath")) ||
+ (!strcmp(argv[i], "--xpath"))) {
+ i++;
+ lint->noout++;
+ lint->xpathquery = argv[i];
+#endif
+ } else if ((!strcmp(argv[i], "-oldxml10")) ||
+ (!strcmp(argv[i], "--oldxml10"))) {
+ lint->options |= XML_PARSE_OLD10;
+ } else if ((!strcmp(argv[i], "-max-ampl")) ||
+ (!strcmp(argv[i], "--max-ampl"))) {
+ i++;
+ if (i >= argc) {
+ fprintf(ERR_STREAM, "max-ampl: missing integer value\n");
+ return(XMLLINT_ERR_UNCLASS);
+ }
+ lint->maxAmpl = parseInteger("max-ampl", argv[i], 1, UINT_MAX);
+ } else {
+ fprintf(ERR_STREAM, "Unknown option %s\n", argv[i]);
+ usage(ERR_STREAM, argv[0]);
+ return(XMLLINT_ERR_UNCLASS);
+ }
+ }
+
+ if (lint->shell)
+ lint->repeat = 1;
+
+ return(XMLLINT_RETURN_OK);
+}
+
+static int
+xmllintMain(int argc, const char **argv, xmlResourceLoader loader) {
+ xmllintState state, *lint;
+ int i, j, res;
+ int files = 0;
#ifdef _WIN32
_setmode(_fileno(stdin), _O_BINARY);
@@ -2932,352 +3246,26 @@
_setmode(_fileno(stderr), _O_BINARY);
#endif
- if (argc <= 1) {
- usage(ERR_STREAM, argv[0]);
- return(XMLLINT_ERR_UNCLASS);
+ xmllintMaxmem = 0;
+
+ lint = &state;
+ xmllintInit(lint);
+ lint->defaultResourceLoader = loader;
+
+ res = xmllintParseOptions(lint, argc, argv);
+ if (res != XMLLINT_RETURN_OK) {
+ lint->progresult = res;
+ goto error;
}
- /* xmlMemSetup must be called before initializing the parser. */
- for (i = 1; i < argc ; i++) {
- if ((!strcmp(argv[i], "-maxmem")) ||
- (!strcmp(argv[i], "--maxmem"))) {
- i++;
- if (i >= argc) {
- fprintf(ERR_STREAM, "maxmem: missing integer value\n");
- return(XMLLINT_ERR_UNCLASS);
- }
- errno = 0;
- maxmem = parseInteger("maxmem", argv[i], 0, INT_MAX);
- } else if (argv[i][0] == '-') {
- i += skipArgs(argv[i]);
- }
- }
- if (maxmem != 0)
+ if (xmllintMaxmem != 0)
xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc, myStrdupFunc);
LIBXML_TEST_VERSION
- for (i = 1; i < argc ; i++) {
- if (argv[i][0] != '-' || argv[i][1] == 0)
- continue;
-
- if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
- debug++;
- else
- if ((!strcmp(argv[i], "-shell")) ||
- (!strcmp(argv[i], "--shell"))) {
- shell++;
- } else
- if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
- copy++;
- else
- if ((!strcmp(argv[i], "-recover")) ||
- (!strcmp(argv[i], "--recover"))) {
- options |= XML_PARSE_RECOVER;
- } else if ((!strcmp(argv[i], "-huge")) ||
- (!strcmp(argv[i], "--huge"))) {
- options |= XML_PARSE_HUGE;
- } else if ((!strcmp(argv[i], "-noent")) ||
- (!strcmp(argv[i], "--noent"))) {
- options |= XML_PARSE_NOENT;
- } else if ((!strcmp(argv[i], "-noenc")) ||
- (!strcmp(argv[i], "--noenc"))) {
- options |= XML_PARSE_IGNORE_ENC;
- } else if ((!strcmp(argv[i], "-nsclean")) ||
- (!strcmp(argv[i], "--nsclean"))) {
- options |= XML_PARSE_NSCLEAN;
- } else if ((!strcmp(argv[i], "-nocdata")) ||
- (!strcmp(argv[i], "--nocdata"))) {
- options |= XML_PARSE_NOCDATA;
- } else if ((!strcmp(argv[i], "-nodict")) ||
- (!strcmp(argv[i], "--nodict"))) {
- options |= XML_PARSE_NODICT;
- } else if ((!strcmp(argv[i], "-version")) ||
- (!strcmp(argv[i], "--version"))) {
- showVersion(argv[0]);
- version = 1;
- } else if ((!strcmp(argv[i], "-noout")) ||
- (!strcmp(argv[i], "--noout")))
- noout++;
- else if ((!strcmp(argv[i], "-htmlout")) ||
- (!strcmp(argv[i], "--htmlout")))
- htmlout++;
- else if ((!strcmp(argv[i], "-nowrap")) ||
- (!strcmp(argv[i], "--nowrap")))
- nowrap++;
-#ifdef LIBXML_HTML_ENABLED
- else if ((!strcmp(argv[i], "-html")) ||
- (!strcmp(argv[i], "--html"))) {
- html++;
- }
- else if ((!strcmp(argv[i], "-xmlout")) ||
- (!strcmp(argv[i], "--xmlout"))) {
- xmlout++;
- } else if ((!strcmp(argv[i], "-nodefdtd")) ||
- (!strcmp(argv[i], "--nodefdtd"))) {
- options |= HTML_PARSE_NODEFDTD;
- }
-#endif /* LIBXML_HTML_ENABLED */
- else if ((!strcmp(argv[i], "-loaddtd")) ||
- (!strcmp(argv[i], "--loaddtd"))) {
- options |= XML_PARSE_DTDLOAD;
- } else if ((!strcmp(argv[i], "-dtdattr")) ||
- (!strcmp(argv[i], "--dtdattr"))) {
- options |= XML_PARSE_DTDATTR;
- }
-#ifdef LIBXML_VALID_ENABLED
- else if ((!strcmp(argv[i], "-valid")) ||
- (!strcmp(argv[i], "--valid"))) {
- options |= XML_PARSE_DTDVALID;
- } else if ((!strcmp(argv[i], "-postvalid")) ||
- (!strcmp(argv[i], "--postvalid"))) {
- postvalid++;
- options |= XML_PARSE_DTDLOAD;
- } else if ((!strcmp(argv[i], "-dtdvalid")) ||
- (!strcmp(argv[i], "--dtdvalid"))) {
- i++;
- dtdvalid = argv[i];
- options |= XML_PARSE_DTDLOAD;
- } else if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
- (!strcmp(argv[i], "--dtdvalidfpi"))) {
- i++;
- dtdvalidfpi = argv[i];
- options |= XML_PARSE_DTDLOAD;
- }
- else if ((!strcmp(argv[i], "-insert")) ||
- (!strcmp(argv[i], "--insert")))
- insert++;
-#endif /* LIBXML_VALID_ENABLED */
- else if ((!strcmp(argv[i], "-dropdtd")) ||
- (!strcmp(argv[i], "--dropdtd")))
- dropdtd++;
- else if ((!strcmp(argv[i], "-quiet")) ||
- (!strcmp(argv[i], "--quiet")))
- quiet++;
- else if ((!strcmp(argv[i], "-timing")) ||
- (!strcmp(argv[i], "--timing")))
- timing++;
- else if ((!strcmp(argv[i], "-auto")) ||
- (!strcmp(argv[i], "--auto")))
- generate++;
- else if ((!strcmp(argv[i], "-repeat")) ||
- (!strcmp(argv[i], "--repeat"))) {
- if (repeat > 1)
- repeat *= 10;
- else
- repeat = 100;
- }
-#ifdef LIBXML_PUSH_ENABLED
- else if ((!strcmp(argv[i], "-push")) ||
- (!strcmp(argv[i], "--push")))
- push++;
-#endif /* LIBXML_PUSH_ENABLED */
-#if HAVE_DECL_MMAP
- else if ((!strcmp(argv[i], "-memory")) ||
- (!strcmp(argv[i], "--memory")))
- memory++;
-#endif
- else if ((!strcmp(argv[i], "-testIO")) ||
- (!strcmp(argv[i], "--testIO")))
- testIO++;
-#ifdef LIBXML_XINCLUDE_ENABLED
- else if ((!strcmp(argv[i], "-xinclude")) ||
- (!strcmp(argv[i], "--xinclude"))) {
- xinclude++;
- options |= XML_PARSE_XINCLUDE;
- }
- else if ((!strcmp(argv[i], "-noxincludenode")) ||
- (!strcmp(argv[i], "--noxincludenode"))) {
- xinclude++;
- options |= XML_PARSE_XINCLUDE;
- options |= XML_PARSE_NOXINCNODE;
- }
- else if ((!strcmp(argv[i], "-nofixup-base-uris")) ||
- (!strcmp(argv[i], "--nofixup-base-uris"))) {
- xinclude++;
- options |= XML_PARSE_XINCLUDE;
- options |= XML_PARSE_NOBASEFIX;
- }
-#endif
- else if ((!strcmp(argv[i], "-nowarning")) ||
- (!strcmp(argv[i], "--nowarning"))) {
- options |= XML_PARSE_NOWARNING;
- options &= ~XML_PARSE_PEDANTIC;
- }
- else if ((!strcmp(argv[i], "-pedantic")) ||
- (!strcmp(argv[i], "--pedantic"))) {
- options |= XML_PARSE_PEDANTIC;
- options &= ~XML_PARSE_NOWARNING;
- }
-#ifdef LIBXML_DEBUG_ENABLED
- else if ((!strcmp(argv[i], "-debugent")) ||
- (!strcmp(argv[i], "--debugent"))) {
- debugent++;
- }
-#endif
-#ifdef LIBXML_C14N_ENABLED
- else if ((!strcmp(argv[i], "-c14n")) ||
- (!strcmp(argv[i], "--c14n"))) {
- canonical++;
- options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
- }
- else if ((!strcmp(argv[i], "-c14n11")) ||
- (!strcmp(argv[i], "--c14n11"))) {
- canonical_11++;
- options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
- }
- else if ((!strcmp(argv[i], "-exc-c14n")) ||
- (!strcmp(argv[i], "--exc-c14n"))) {
- exc_canonical++;
- options |= XML_PARSE_NOENT | XML_PARSE_DTDATTR | XML_PARSE_DTDLOAD;
- }
-#endif
#ifdef LIBXML_CATALOG_ENABLED
- else if ((!strcmp(argv[i], "-catalogs")) ||
- (!strcmp(argv[i], "--catalogs"))) {
- catalogs++;
- } else if ((!strcmp(argv[i], "-nocatalogs")) ||
- (!strcmp(argv[i], "--nocatalogs"))) {
- nocatalogs++;
- }
-#endif
- else if ((!strcmp(argv[i], "-noblanks")) ||
- (!strcmp(argv[i], "--noblanks"))) {
- options |= XML_PARSE_NOBLANKS;
- }
- else if ((!strcmp(argv[i], "-maxmem")) ||
- (!strcmp(argv[i], "--maxmem"))) {
- i++;
- }
-#ifdef LIBXML_OUTPUT_ENABLED
- else if ((!strcmp(argv[i], "-o")) ||
- (!strcmp(argv[i], "-output")) ||
- (!strcmp(argv[i], "--output"))) {
- i++;
- output = argv[i];
- }
- else if ((!strcmp(argv[i], "-format")) ||
- (!strcmp(argv[i], "--format"))) {
- format = 1;
- options |= XML_PARSE_NOBLANKS;
- }
- else if ((!strcmp(argv[i], "-encode")) ||
- (!strcmp(argv[i], "--encode"))) {
- i++;
- encoding = argv[i];
- /*
- * OK it's for testing purposes
- */
- xmlAddEncodingAlias("UTF-8", "DVEnc");
- }
- else if ((!strcmp(argv[i], "-pretty")) ||
- (!strcmp(argv[i], "--pretty"))) {
- i++;
- if (argv[i] != NULL)
- format = atoi(argv[i]);
- }
-#ifdef LIBXML_ZLIB_ENABLED
- else if ((!strcmp(argv[i], "-compress")) ||
- (!strcmp(argv[i], "--compress"))) {
- compress++;
- }
-#endif
-#endif /* LIBXML_OUTPUT_ENABLED */
-#ifdef LIBXML_READER_ENABLED
- else if ((!strcmp(argv[i], "-stream")) ||
- (!strcmp(argv[i], "--stream"))) {
- stream++;
- }
- else if ((!strcmp(argv[i], "-walker")) ||
- (!strcmp(argv[i], "--walker"))) {
- walker++;
- noout++;
- }
-#ifdef LIBXML_PATTERN_ENABLED
- else if ((!strcmp(argv[i], "-pattern")) ||
- (!strcmp(argv[i], "--pattern"))) {
- i++;
- pattern = argv[i];
- }
-#endif
-#endif /* LIBXML_READER_ENABLED */
-#ifdef LIBXML_SAX1_ENABLED
- else if ((!strcmp(argv[i], "-sax1")) ||
- (!strcmp(argv[i], "--sax1"))) {
- options |= XML_PARSE_SAX1;
- }
-#endif /* LIBXML_SAX1_ENABLED */
- else if ((!strcmp(argv[i], "-sax")) ||
- (!strcmp(argv[i], "--sax"))) {
- sax++;
- }
-#ifdef LIBXML_SCHEMAS_ENABLED
- else if ((!strcmp(argv[i], "-relaxng")) ||
- (!strcmp(argv[i], "--relaxng"))) {
- i++;
- relaxng = argv[i];
- options |= XML_PARSE_NOENT;
- } else if ((!strcmp(argv[i], "-schema")) ||
- (!strcmp(argv[i], "--schema"))) {
- i++;
- schema = argv[i];
- options |= XML_PARSE_NOENT;
- }
-#endif
-#ifdef LIBXML_SCHEMATRON_ENABLED
- else if ((!strcmp(argv[i], "-schematron")) ||
- (!strcmp(argv[i], "--schematron"))) {
- i++;
- schematron = argv[i];
- options |= XML_PARSE_NOENT;
- }
-#endif
- else if ((!strcmp(argv[i], "-nonet")) ||
- (!strcmp(argv[i], "--nonet"))) {
- options |= XML_PARSE_NONET;
- } else if ((!strcmp(argv[i], "-nocompact")) ||
- (!strcmp(argv[i], "--nocompact"))) {
- options &= ~XML_PARSE_COMPACT;
- } else if ((!strcmp(argv[i], "-load-trace")) ||
- (!strcmp(argv[i], "--load-trace"))) {
- load_trace++;
- } else if ((!strcmp(argv[i], "-path")) ||
- (!strcmp(argv[i], "--path"))) {
- i++;
- parsePath(BAD_CAST argv[i]);
- }
-#ifdef LIBXML_XPATH_ENABLED
- else if ((!strcmp(argv[i], "-xpath")) ||
- (!strcmp(argv[i], "--xpath"))) {
- i++;
- noout++;
- xpathquery = argv[i];
- }
-#endif
- else if ((!strcmp(argv[i], "-oldxml10")) ||
- (!strcmp(argv[i], "--oldxml10"))) {
- options |= XML_PARSE_OLD10;
- } else if ((!strcmp(argv[i], "-max-ampl")) ||
- (!strcmp(argv[i], "--max-ampl"))) {
- i++;
- if (i >= argc) {
- fprintf(ERR_STREAM, "max-ampl: missing integer value\n");
- return(XMLLINT_ERR_UNCLASS);
- }
- maxAmpl = parseInteger("max-ampl", argv[i], 1, UINT_MAX);
- } else {
- fprintf(ERR_STREAM, "Unknown option %s\n", argv[i]);
- usage(ERR_STREAM, argv[0]);
- return(XMLLINT_ERR_UNCLASS);
- }
- }
-
- if (shell)
- repeat = 1;
-
-#ifdef LIBXML_CATALOG_ENABLED
- if (nocatalogs == 0) {
- if (catalogs) {
+ if (lint->nocatalogs == 0) {
+ if (lint->catalogs) {
const char *catal;
catal = getenv("SGML_CATALOG_FILES");
@@ -3299,123 +3287,133 @@
}
#endif
- if ((htmlout) && (!nowrap)) {
- fprintf(ERR_STREAM,
- "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
- fprintf(ERR_STREAM,
- "\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
- fprintf(ERR_STREAM,
- "<html><head><title>%s output</title></head>\n",
- argv[0]);
- fprintf(ERR_STREAM,
- "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
- argv[0]);
+ if (lint->htmlout) {
+ lint->htmlBuf = xmlMalloc(HTML_BUF_SIZE);
+ if (lint->htmlBuf == NULL) {
+ lint->progresult = XMLLINT_ERR_MEM;
+ goto error;
+ }
+
+ if (!lint->nowrap) {
+ fprintf(ERR_STREAM,
+ "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 Transitional//EN\"\n");
+ fprintf(ERR_STREAM,
+ "\t\"http://www.w3.org/TR/REC-html40/loose.dtd\">\n");
+ fprintf(ERR_STREAM,
+ "<html><head><title>%s output</title></head>\n",
+ argv[0]);
+ fprintf(ERR_STREAM,
+ "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
+ argv[0]);
+ }
}
#ifdef LIBXML_SCHEMATRON_ENABLED
- if ((schematron != NULL) && (sax == 0)
+ if ((lint->schematron != NULL) && (lint->sax == 0)
#ifdef LIBXML_READER_ENABLED
- && (stream == 0)
+ && (lint->stream == 0)
#endif /* LIBXML_READER_ENABLED */
) {
xmlSchematronParserCtxtPtr ctxt;
/* forces loading the DTDs */
- options |= XML_PARSE_DTDLOAD;
- if (timing) {
- startTimer();
+ lint->options |= XML_PARSE_DTDLOAD;
+ if (lint->timing) {
+ startTimer(lint);
}
- ctxt = xmlSchematronNewParserCtxt(schematron);
+ ctxt = xmlSchematronNewParserCtxt(lint->schematron);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
goto error;
}
- wxschematron = xmlSchematronParse(ctxt);
- if (wxschematron == NULL) {
- fprintf(ERR_STREAM,
- "Schematron schema %s failed to compile\n", schematron);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- schematron = NULL;
+ lint->wxschematron = xmlSchematronParse(ctxt);
+ if (lint->wxschematron == NULL) {
+ fprintf(ERR_STREAM, "Schematron schema %s failed to compile\n",
+ lint->schematron);
+ lint->progresult = XMLLINT_ERR_SCHEMACOMP;
+ goto error;
}
xmlSchematronFreeParserCtxt(ctxt);
- if (timing) {
- endTimer("Compiling the schemas");
+ if (lint->timing) {
+ endTimer(lint, "Compiling the schemas");
}
}
#endif
+
#ifdef LIBXML_SCHEMAS_ENABLED
- if ((relaxng != NULL) && (sax == 0)
+ if ((lint->relaxng != NULL) && (lint->sax == 0)
#ifdef LIBXML_READER_ENABLED
- && (stream == 0)
+ && (lint->stream == 0)
#endif /* LIBXML_READER_ENABLED */
) {
xmlRelaxNGParserCtxtPtr ctxt;
/* forces loading the DTDs */
- options |= XML_PARSE_DTDLOAD;
- if (timing) {
- startTimer();
+ lint->options |= XML_PARSE_DTDLOAD;
+ if (lint->timing) {
+ startTimer(lint);
}
- ctxt = xmlRelaxNGNewParserCtxt(relaxng);
+ ctxt = xmlRelaxNGNewParserCtxt(lint->relaxng);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
goto error;
}
- xmlRelaxNGSetResourceLoader(ctxt, xmllintResourceLoader, NULL);
- relaxngschemas = xmlRelaxNGParse(ctxt);
- if (relaxngschemas == NULL) {
- fprintf(ERR_STREAM,
- "Relax-NG schema %s failed to compile\n", relaxng);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- relaxng = NULL;
+ xmlRelaxNGSetResourceLoader(ctxt, xmllintResourceLoader, lint);
+ lint->relaxngschemas = xmlRelaxNGParse(ctxt);
+ if (lint->relaxngschemas == NULL) {
+ fprintf(ERR_STREAM, "Relax-NG schema %s failed to compile\n",
+ lint->relaxng);
+ lint->progresult = XMLLINT_ERR_SCHEMACOMP;
+ goto error;
}
xmlRelaxNGFreeParserCtxt(ctxt);
- if (timing) {
- endTimer("Compiling the schemas");
+ if (lint->timing) {
+ endTimer(lint, "Compiling the schemas");
}
- } else if ((schema != NULL)
+ } else if ((lint->schema != NULL)
#ifdef LIBXML_READER_ENABLED
- && (stream == 0)
+ && (lint->stream == 0)
#endif
) {
xmlSchemaParserCtxtPtr ctxt;
- if (timing) {
- startTimer();
+ if (lint->timing) {
+ startTimer(lint);
}
- ctxt = xmlSchemaNewParserCtxt(schema);
+ ctxt = xmlSchemaNewParserCtxt(lint->schema);
if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ lint->progresult = XMLLINT_ERR_MEM;
goto error;
}
- xmlSchemaSetResourceLoader(ctxt, xmllintResourceLoader, NULL);
- wxschemas = xmlSchemaParse(ctxt);
- if (wxschemas == NULL) {
- fprintf(ERR_STREAM,
- "WXS schema %s failed to compile\n", schema);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- schema = NULL;
+ xmlSchemaSetResourceLoader(ctxt, xmllintResourceLoader, lint);
+ lint->wxschemas = xmlSchemaParse(ctxt);
+ if (lint->wxschemas == NULL) {
+ fprintf(ERR_STREAM, "WXS schema %s failed to compile\n",
+ lint->schema);
+ lint->progresult = XMLLINT_ERR_SCHEMACOMP;
+ goto error;
}
xmlSchemaFreeParserCtxt(ctxt);
- if (timing) {
- endTimer("Compiling the schemas");
+ if (lint->timing) {
+ endTimer(lint, "Compiling the schemas");
}
}
#endif /* LIBXML_SCHEMAS_ENABLED */
+
#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED)
- if ((pattern != NULL) && (walker == 0)) {
- patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
- if (patternc == NULL) {
- fprintf(ERR_STREAM,
- "Pattern %s failed to compile\n", pattern);
- progresult = XMLLINT_ERR_SCHEMAPAT;
- pattern = NULL;
+ if ((lint->pattern != NULL) && (lint->walker == 0)) {
+ lint->patternc = xmlPatterncompile(BAD_CAST lint->pattern, NULL, 0,
+ NULL);
+ if (lint->patternc == NULL) {
+ fprintf(ERR_STREAM, "Pattern %s failed to compile\n",
+ lint->pattern);
+ lint->progresult = XMLLINT_ERR_SCHEMAPAT;
+ goto error;
}
}
#endif /* LIBXML_READER_ENABLED && LIBXML_PATTERN_ENABLED */
for (i = 1; i < argc ; i++) {
- xmlParserCtxtPtr ctxt;
const char *filename = argv[i];
#if HAVE_DECL_MMAP
int memoryFd = -1;
@@ -3427,106 +3425,112 @@
}
#if HAVE_DECL_MMAP
- if (memory) {
+ if (lint->memory) {
struct stat info;
if (stat(filename, &info) < 0) {
- progresult = XMLLINT_ERR_RDFILE;
+ lint->progresult = XMLLINT_ERR_RDFILE;
break;
}
memoryFd = open(filename, O_RDONLY);
if (memoryFd < 0) {
- progresult = XMLLINT_ERR_RDFILE;
+ lint->progresult = XMLLINT_ERR_RDFILE;
break;
}
- memoryData = mmap(NULL, info.st_size + 1, PROT_READ, MAP_SHARED,
- memoryFd, 0);
- if (memoryData == (void *) MAP_FAILED) {
+ lint->memoryData = mmap(NULL, info.st_size + 1, PROT_READ,
+ MAP_SHARED, memoryFd, 0);
+ if (lint->memoryData == (void *) MAP_FAILED) {
close(memoryFd);
fprintf(ERR_STREAM, "mmap failure for file %s\n", filename);
- progresult = XMLLINT_ERR_RDFILE;
+ lint->progresult = XMLLINT_ERR_RDFILE;
break;
}
- memorySize = info.st_size;
+ lint->memorySize = info.st_size;
}
#endif /* HAVE_DECL_MMAP */
- if ((timing) && (repeat > 1))
- startTimer();
+ if ((lint->timing) && (lint->repeat > 1))
+ startTimer(lint);
#ifdef LIBXML_HTML_ENABLED
- if (html) {
- ctxt = htmlNewParserCtxt();
+ if (lint->html) {
+ lint->ctxt = htmlNewParserCtxt();
} else
#endif
{
- ctxt = xmlNewParserCtxt();
+ lint->ctxt = xmlNewParserCtxt();
}
- if (ctxt == NULL) {
- progresult = XMLLINT_ERR_MEM;
+ if (lint->ctxt == NULL) {
+ lint->progresult = XMLLINT_ERR_MEM;
goto error;
}
- for (j = 0; j < repeat; j++) {
+ for (j = 0; j < lint->repeat; j++) {
#ifdef LIBXML_READER_ENABLED
- if (stream != 0) {
- streamFile(filename);
+ if (lint->stream != 0) {
+ streamFile(lint, filename);
} else {
#endif /* LIBXML_READER_ENABLED */
- if (sax) {
- testSAX(filename);
+ if (lint->sax) {
+ testSAX(lint, filename);
} else {
- parseAndPrintFile(filename, ctxt);
+ parseAndPrintFile(lint, filename);
}
#ifdef LIBXML_READER_ENABLED
}
#endif /* LIBXML_READER_ENABLED */
}
- xmlFreeParserCtxt(ctxt);
+ xmlFreeParserCtxt(lint->ctxt);
- if ((timing) && (repeat > 1)) {
- endTimer("%d iterations", repeat);
+ if ((lint->timing) && (lint->repeat > 1)) {
+ endTimer(lint, "%d iterations", lint->repeat);
}
files += 1;
#if HAVE_DECL_MMAP
- if (memory) {
- munmap(memoryData, memorySize);
+ if (lint->memory) {
+ munmap(lint->memoryData, lint->memorySize);
close(memoryFd);
}
#endif
}
- if (generate)
- parseAndPrintFile(NULL, NULL);
- if ((htmlout) && (!nowrap)) {
+
+ if (lint->generate)
+ parseAndPrintFile(lint, NULL);
+
+ if ((lint->htmlout) && (!lint->nowrap)) {
fprintf(ERR_STREAM, "</body></html>\n");
}
- if ((files == 0) && (!generate) && (version == 0)) {
+
+ if ((files == 0) && (!lint->generate) && (lint->version == 0)) {
usage(ERR_STREAM, argv[0]);
- progresult = XMLLINT_ERR_UNCLASS;
+ lint->progresult = XMLLINT_ERR_UNCLASS;
}
error:
+ if (lint->htmlout)
+ xmlFree(lint->htmlBuf);
+
#ifdef LIBXML_SCHEMATRON_ENABLED
- if (wxschematron != NULL)
- xmlSchematronFree(wxschematron);
+ if (lint->wxschematron != NULL)
+ xmlSchematronFree(lint->wxschematron);
#endif
#ifdef LIBXML_SCHEMAS_ENABLED
- if (relaxngschemas != NULL)
- xmlRelaxNGFree(relaxngschemas);
- if (wxschemas != NULL)
- xmlSchemaFree(wxschemas);
+ if (lint->relaxngschemas != NULL)
+ xmlRelaxNGFree(lint->relaxngschemas);
+ if (lint->wxschemas != NULL)
+ xmlSchemaFree(lint->wxschemas);
#endif
#if defined(LIBXML_READER_ENABLED) && defined(LIBXML_PATTERN_ENABLED)
- if (patternc != NULL)
- xmlFreePattern(patternc);
+ if (lint->patternc != NULL)
+ xmlFreePattern(lint->patternc);
#endif
xmlCleanupParser();
- return(progresult);
+ return(lint->progresult);
}
#ifndef XMLLINT_FUZZ