/third_party/libxml2-2.7.7/xmllint.c
C | 3722 lines | 3036 code | 243 blank | 443 comment | 929 complexity | 1aa522b0b00a65af5d43c619f33cf246 MD5 | raw file
Possible License(s): BSD-3-Clause
Large files files are truncated, but you can click here to view the full file
- /*
- * xmllint.c : a small tester program for XML input.
- *
- * See Copyright for the status of this software.
- *
- * daniel@veillard.com
- */
- #include "libxml.h"
- #include <string.h>
- #include <stdarg.h>
- #include <assert.h>
- #if defined (_WIN32) && !defined(__CYGWIN__)
- #if defined (_MSC_VER) || defined(__BORLANDC__)
- #include <winsock2.h>
- #pragma comment(lib, "ws2_32.lib")
- #define gettimeofday(p1,p2)
- #endif /* _MSC_VER */
- #endif /* _WIN32 */
- #ifdef HAVE_SYS_TIME_H
- #include <sys/time.h>
- #endif
- #ifdef HAVE_TIME_H
- #include <time.h>
- #endif
- #ifdef __MINGW32__
- #define _WINSOCKAPI_
- #include <wsockcompat.h>
- #include <winsock2.h>
- #undef XML_SOCKLEN_T
- #define XML_SOCKLEN_T unsigned int
- #endif
- #ifdef HAVE_SYS_TIMEB_H
- #include <sys/timeb.h>
- #endif
- #ifdef HAVE_SYS_TYPES_H
- #include <sys/types.h>
- #endif
- #ifdef HAVE_SYS_STAT_H
- #include <sys/stat.h>
- #endif
- #ifdef HAVE_FCNTL_H
- #include <fcntl.h>
- #endif
- #ifdef HAVE_UNISTD_H
- #include <unistd.h>
- #endif
- #ifdef HAVE_SYS_MMAN_H
- #include <sys/mman.h>
- /* seems needed for Solaris */
- #ifndef MAP_FAILED
- #define MAP_FAILED ((void *) -1)
- #endif
- #endif
- #ifdef HAVE_STDLIB_H
- #include <stdlib.h>
- #endif
- #ifdef HAVE_LIBREADLINE
- #include <readline/readline.h>
- #ifdef HAVE_LIBHISTORY
- #include <readline/history.h>
- #endif
- #endif
- #include <libxml/xmlmemory.h>
- #include <libxml/parser.h>
- #include <libxml/parserInternals.h>
- #include <libxml/HTMLparser.h>
- #include <libxml/HTMLtree.h>
- #include <libxml/tree.h>
- #include <libxml/xpath.h>
- #include <libxml/debugXML.h>
- #include <libxml/xmlerror.h>
- #ifdef LIBXML_XINCLUDE_ENABLED
- #include <libxml/xinclude.h>
- #endif
- #ifdef LIBXML_CATALOG_ENABLED
- #include <libxml/catalog.h>
- #endif
- #include <libxml/globals.h>
- #include <libxml/xmlreader.h>
- #ifdef LIBXML_SCHEMATRON_ENABLED
- #include <libxml/schematron.h>
- #endif
- #ifdef LIBXML_SCHEMAS_ENABLED
- #include <libxml/relaxng.h>
- #include <libxml/xmlschemas.h>
- #endif
- #ifdef LIBXML_PATTERN_ENABLED
- #include <libxml/pattern.h>
- #endif
- #ifdef LIBXML_C14N_ENABLED
- #include <libxml/c14n.h>
- #endif
- #ifdef LIBXML_OUTPUT_ENABLED
- #include <libxml/xmlsave.h>
- #endif
- #ifndef XML_XML_DEFAULT_CATALOG
- #define XML_XML_DEFAULT_CATALOG "file:///etc/xml/catalog"
- #endif
- typedef enum {
- XMLLINT_RETURN_OK = 0, /* No error */
- XMLLINT_ERR_UNCLASS = 1, /* Unclassified */
- XMLLINT_ERR_DTD = 2, /* Error in DTD */
- XMLLINT_ERR_VALID = 3, /* Validation error */
- XMLLINT_ERR_RDFILE = 4, /* CtxtReadFile error */
- XMLLINT_ERR_SCHEMACOMP = 5, /* Schema compilation */
- XMLLINT_ERR_OUT = 6, /* Error writing output */
- XMLLINT_ERR_SCHEMAPAT = 7, /* Error in schema pattern */
- XMLLINT_ERR_RDREGIS = 8, /* Error in Reader registration */
- XMLLINT_ERR_MEM = 9, /* Out of memory error */
- XMLLINT_ERR_XPATH = 10 /* XPath evaluation error */
- } xmllintReturnCode;
- #ifdef LIBXML_DEBUG_ENABLED
- static int shell = 0;
- static int debugent = 0;
- #endif
- static int debug = 0;
- static int maxmem = 0;
- #ifdef LIBXML_TREE_ENABLED
- static int copy = 0;
- #endif /* LIBXML_TREE_ENABLED */
- static int recovery = 0;
- static int noent = 0;
- static int noblanks = 0;
- static int noout = 0;
- static int nowrap = 0;
- #ifdef LIBXML_OUTPUT_ENABLED
- static int format = 0;
- static const char *output = NULL;
- static int compress = 0;
- static int oldout = 0;
- #endif /* LIBXML_OUTPUT_ENABLED */
- #ifdef LIBXML_VALID_ENABLED
- static int valid = 0;
- static int postvalid = 0;
- static char * dtdvalid = NULL;
- static char * dtdvalidfpi = NULL;
- #endif
- #ifdef LIBXML_SCHEMAS_ENABLED
- static char * relaxng = NULL;
- static xmlRelaxNGPtr relaxngschemas = NULL;
- static char * schema = NULL;
- static xmlSchemaPtr wxschemas = NULL;
- #endif
- #ifdef LIBXML_SCHEMATRON_ENABLED
- static char * schematron = NULL;
- static xmlSchematronPtr wxschematron = NULL;
- #endif
- static int repeat = 0;
- static int insert = 0;
- #if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
- static int html = 0;
- static int xmlout = 0;
- #endif
- static int htmlout = 0;
- #ifdef LIBXML_PUSH_ENABLED
- static int push = 0;
- #endif /* LIBXML_PUSH_ENABLED */
- #ifdef HAVE_SYS_MMAN_H
- static int memory = 0;
- #endif
- static int testIO = 0;
- static char *encoding = NULL;
- #ifdef LIBXML_XINCLUDE_ENABLED
- static int xinclude = 0;
- #endif
- static int dtdattrs = 0;
- static int loaddtd = 0;
- static xmllintReturnCode progresult = XMLLINT_RETURN_OK;
- static int timing = 0;
- static int generate = 0;
- static int dropdtd = 0;
- #ifdef LIBXML_CATALOG_ENABLED
- static int catalogs = 0;
- static int nocatalogs = 0;
- #endif
- #ifdef LIBXML_C14N_ENABLED
- static int canonical = 0;
- static int canonical_11 = 0;
- static int exc_canonical = 0;
- #endif
- #ifdef LIBXML_READER_ENABLED
- static int stream = 0;
- static int walker = 0;
- #endif /* LIBXML_READER_ENABLED */
- static int chkregister = 0;
- static int nbregister = 0;
- #ifdef LIBXML_SAX1_ENABLED
- static int sax1 = 0;
- #endif /* LIBXML_SAX1_ENABLED */
- #ifdef LIBXML_PATTERN_ENABLED
- static const char *pattern = NULL;
- static xmlPatternPtr patternc = NULL;
- static xmlStreamCtxtPtr patstream = NULL;
- #endif
- #ifdef LIBXML_XPATH_ENABLED
- static const char *xpathquery = NULL;
- #endif
- static int options = XML_PARSE_COMPACT;
- static int sax = 0;
- static int oldxml10 = 0;
- /************************************************************************
- * *
- * 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) {
- const xmlChar *cur;
- if (path == NULL)
- return;
- while (*path != 0) {
- if (nbpaths >= MAX_PATHS) {
- fprintf(stderr, "MAX_PATHS reached: too many paths\n");
- return;
- }
- cur = path;
- while ((*cur == ' ') || (*cur == PATH_SEPARATOR))
- cur++;
- path = cur;
- while ((*cur != 0) && (*cur != ' ') && (*cur != PATH_SEPARATOR))
- cur++;
- if (cur != path) {
- paths[nbpaths] = xmlStrndup(path, cur - path);
- if (paths[nbpaths] != NULL)
- nbpaths++;
- path = cur;
- }
- }
- }
- static xmlExternalEntityLoader defaultEntityLoader = NULL;
- static xmlParserInputPtr
- xmllintExternalEntityLoader(const char *URL, const char *ID,
- xmlParserCtxtPtr ctxt) {
- xmlParserInputPtr ret;
- warningSAXFunc warning = NULL;
- errorSAXFunc err = NULL;
- int i;
- const char *lastsegment = URL;
- const char *iter = URL;
- if ((nbpaths > 0) && (iter != NULL)) {
- while (*iter != 0) {
- if (*iter == '/')
- lastsegment = iter + 1;
- iter++;
- }
- }
- if ((ctxt != NULL) && (ctxt->sax != NULL)) {
- warning = ctxt->sax->warning;
- err = ctxt->sax->error;
- ctxt->sax->warning = NULL;
- ctxt->sax->error = NULL;
- }
- if (defaultEntityLoader != NULL) {
- ret = defaultEntityLoader(URL, ID, ctxt);
- if (ret != NULL) {
- if (warning != NULL)
- ctxt->sax->warning = warning;
- if (err != NULL)
- ctxt->sax->error = err;
- if (load_trace) {
- fprintf \
- (stderr,
- "Loaded URL=\"%s\" ID=\"%s\"\n",
- URL ? URL : "(null)",
- ID ? ID : "(null)");
- }
- return(ret);
- }
- }
- for (i = 0;i < nbpaths;i++) {
- xmlChar *newURL;
- newURL = xmlStrdup((const xmlChar *) paths[i]);
- newURL = xmlStrcat(newURL, (const xmlChar *) "/");
- newURL = xmlStrcat(newURL, (const xmlChar *) lastsegment);
- if (newURL != NULL) {
- ret = defaultEntityLoader((const char *)newURL, ID, ctxt);
- if (ret != NULL) {
- if (warning != NULL)
- ctxt->sax->warning = warning;
- if (err != NULL)
- ctxt->sax->error = err;
- if (load_trace) {
- fprintf \
- (stderr,
- "Loaded URL=\"%s\" ID=\"%s\"\n",
- newURL,
- ID ? ID : "(null)");
- }
- xmlFree(newURL);
- return(ret);
- }
- xmlFree(newURL);
- }
- }
- if (err != NULL)
- ctxt->sax->error = err;
- if (warning != NULL) {
- ctxt->sax->warning = warning;
- if (URL != NULL)
- warning(ctxt, "failed to load external entity \"%s\"\n", URL);
- else if (ID != NULL)
- warning(ctxt, "failed to load external entity \"%s\"\n", ID);
- }
- return(NULL);
- }
- /************************************************************************
- * *
- * Memory allocation consumption debugging *
- * *
- ************************************************************************/
- static void
- OOM(void)
- {
- fprintf(stderr, "Ran out of memory needs > %d bytes\n", maxmem);
- progresult = XMLLINT_ERR_MEM;
- }
- static void
- myFreeFunc(void *mem)
- {
- xmlMemFree(mem);
- }
- static void *
- myMallocFunc(size_t size)
- {
- void *ret;
- ret = xmlMemMalloc(size);
- if (ret != NULL) {
- if (xmlMemUsed() > maxmem) {
- OOM();
- xmlMemFree(ret);
- return (NULL);
- }
- }
- return (ret);
- }
- static void *
- myReallocFunc(void *mem, size_t size)
- {
- void *ret;
- ret = xmlMemRealloc(mem, size);
- if (ret != NULL) {
- if (xmlMemUsed() > maxmem) {
- OOM();
- xmlMemFree(ret);
- return (NULL);
- }
- }
- return (ret);
- }
- static char *
- myStrdupFunc(const char *str)
- {
- char *ret;
- ret = xmlMemoryStrdup(str);
- if (ret != NULL) {
- if (xmlMemUsed() > maxmem) {
- OOM();
- xmlFree(ret);
- return (NULL);
- }
- }
- return (ret);
- }
- /************************************************************************
- * *
- * Internal timing routines to remove the necessity to have *
- * unix-specific function calls. *
- * *
- ************************************************************************/
- #ifndef HAVE_GETTIMEOFDAY
- #ifdef HAVE_SYS_TIMEB_H
- #ifdef HAVE_SYS_TIME_H
- #ifdef HAVE_FTIME
- static int
- my_gettimeofday(struct timeval *tvp, void *tzp)
- {
- struct timeb timebuffer;
- ftime(&timebuffer);
- if (tvp) {
- tvp->tv_sec = timebuffer.time;
- tvp->tv_usec = timebuffer.millitm * 1000L;
- }
- return (0);
- }
- #define HAVE_GETTIMEOFDAY 1
- #define gettimeofday my_gettimeofday
- #endif /* HAVE_FTIME */
- #endif /* HAVE_SYS_TIME_H */
- #endif /* HAVE_SYS_TIMEB_H */
- #endif /* !HAVE_GETTIMEOFDAY */
- #if defined(HAVE_GETTIMEOFDAY)
- static struct timeval begin, end;
- /*
- * startTimer: call where you want to start timing
- */
- static void
- startTimer(void)
- {
- gettimeofday(&begin, NULL);
- }
- /*
- * endTimer: call where you want to stop timing and to print out a
- * message about the timing performed; format is a printf
- * type argument
- */
- static void XMLCDECL
- endTimer(const char *fmt, ...)
- {
- long msec;
- va_list ap;
- gettimeofday(&end, NULL);
- msec = end.tv_sec - begin.tv_sec;
- msec *= 1000;
- msec += (end.tv_usec - begin.tv_usec) / 1000;
- #ifndef HAVE_STDARG_H
- #error "endTimer required stdarg functions"
- #endif
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, " took %ld ms\n", msec);
- }
- #elif defined(HAVE_TIME_H)
- /*
- * No gettimeofday function, so we have to make do with calling clock.
- * This is obviously less accurate, but there's little we can do about
- * that.
- */
- #ifndef CLOCKS_PER_SEC
- #define CLOCKS_PER_SEC 100
- #endif
- static clock_t begin, end;
- static void
- startTimer(void)
- {
- begin = clock();
- }
- static void XMLCDECL
- endTimer(const char *fmt, ...)
- {
- long msec;
- va_list ap;
- end = clock();
- msec = ((end - begin) * 1000) / CLOCKS_PER_SEC;
- #ifndef HAVE_STDARG_H
- #error "endTimer required stdarg functions"
- #endif
- va_start(ap, fmt);
- vfprintf(stderr, fmt, ap);
- va_end(ap);
- fprintf(stderr, " took %ld ms\n", msec);
- }
- #else
- /*
- * We don't have a gettimeofday or time.h, so we just don't do timing
- */
- static void
- startTimer(void)
- {
- /*
- * Do nothing
- */
- }
- static void XMLCDECL
- endTimer(char *format, ...)
- {
- /*
- * We cannot do anything because we don't have a timing function
- */
- #ifdef HAVE_STDARG_H
- va_start(ap, format);
- vfprintf(stderr, format, ap);
- va_end(ap);
- fprintf(stderr, " was not timed\n", msec);
- #else
- /* We don't have gettimeofday, time or stdarg.h, what crazy world is
- * this ?!
- */
- #endif
- }
- #endif
- /************************************************************************
- * *
- * HTML ouput *
- * *
- ************************************************************************/
- static char buffer[50000];
- static void
- xmlHTMLEncodeSend(void) {
- char *result;
- result = (char *) xmlEncodeEntitiesReentrant(NULL, BAD_CAST buffer);
- if (result) {
- xmlGenericError(xmlGenericErrorContext, "%s", result);
- xmlFree(result);
- }
- buffer[0] = 0;
- }
- /**
- * xmlHTMLPrintFileInfo:
- * @input: an xmlParserInputPtr input
- *
- * Displays the associated file and line informations for the current input
- */
- static void
- xmlHTMLPrintFileInfo(xmlParserInputPtr input) {
- int len;
- xmlGenericError(xmlGenericErrorContext, "<p>");
- len = strlen(buffer);
- if (input != NULL) {
- if (input->filename) {
- snprintf(&buffer[len], sizeof(buffer) - len, "%s:%d: ", input->filename,
- input->line);
- } else {
- snprintf(&buffer[len], sizeof(buffer) - len, "Entity: line %d: ", input->line);
- }
- }
- xmlHTMLEncodeSend();
- }
- /**
- * xmlHTMLPrintFileContext:
- * @input: an xmlParserInputPtr input
- *
- * Displays current context within the input content for error tracking
- */
- static void
- xmlHTMLPrintFileContext(xmlParserInputPtr input) {
- const xmlChar *cur, *base;
- int len;
- int n;
- if (input == NULL) return;
- xmlGenericError(xmlGenericErrorContext, "<pre>\n");
- cur = input->cur;
- base = input->base;
- while ((cur > base) && ((*cur == '\n') || (*cur == '\r'))) {
- cur--;
- }
- n = 0;
- while ((n++ < 80) && (cur > base) && (*cur != '\n') && (*cur != '\r'))
- cur--;
- if ((*cur == '\n') || (*cur == '\r')) cur++;
- base = cur;
- n = 0;
- while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
- len = strlen(buffer);
- snprintf(&buffer[len], sizeof(buffer) - len, "%c",
- (unsigned char) *cur++);
- n++;
- }
- len = strlen(buffer);
- snprintf(&buffer[len], sizeof(buffer) - len, "\n");
- cur = input->cur;
- while ((*cur == '\n') || (*cur == '\r'))
- cur--;
- n = 0;
- while ((cur != base) && (n++ < 80)) {
- len = strlen(buffer);
- snprintf(&buffer[len], sizeof(buffer) - len, " ");
- base++;
- }
- len = strlen(buffer);
- snprintf(&buffer[len], sizeof(buffer) - len, "^\n");
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "</pre>");
- }
- /**
- * xmlHTMLError:
- * @ctx: an XML parser context
- * @msg: the message to display/transmit
- * @...: extra parameters for the message display
- *
- * Display and format an error messages, gives file, line, position and
- * extra parameters.
- */
- static void XMLCDECL
- xmlHTMLError(void *ctx, const char *msg, ...)
- {
- xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
- xmlParserInputPtr input;
- va_list args;
- int len;
- buffer[0] = 0;
- input = ctxt->input;
- if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
- input = ctxt->inputTab[ctxt->inputNr - 2];
- }
- xmlHTMLPrintFileInfo(input);
- xmlGenericError(xmlGenericErrorContext, "<b>error</b>: ");
- va_start(args, msg);
- len = strlen(buffer);
- vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
- va_end(args);
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "</p>\n");
- xmlHTMLPrintFileContext(input);
- xmlHTMLEncodeSend();
- }
- /**
- * xmlHTMLWarning:
- * @ctx: an XML parser context
- * @msg: the message to display/transmit
- * @...: extra parameters for the message display
- *
- * Display and format a warning messages, gives file, line, position and
- * extra parameters.
- */
- static void XMLCDECL
- xmlHTMLWarning(void *ctx, const char *msg, ...)
- {
- xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
- xmlParserInputPtr input;
- va_list args;
- int len;
- buffer[0] = 0;
- input = ctxt->input;
- if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
- input = ctxt->inputTab[ctxt->inputNr - 2];
- }
- xmlHTMLPrintFileInfo(input);
- xmlGenericError(xmlGenericErrorContext, "<b>warning</b>: ");
- va_start(args, msg);
- len = strlen(buffer);
- vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
- va_end(args);
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "</p>\n");
- xmlHTMLPrintFileContext(input);
- xmlHTMLEncodeSend();
- }
- /**
- * xmlHTMLValidityError:
- * @ctx: an XML parser context
- * @msg: the message to display/transmit
- * @...: extra parameters for the message display
- *
- * Display and format an validity error messages, gives file,
- * line, position and extra parameters.
- */
- static void XMLCDECL
- xmlHTMLValidityError(void *ctx, const char *msg, ...)
- {
- xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
- xmlParserInputPtr input;
- va_list args;
- int len;
- buffer[0] = 0;
- input = ctxt->input;
- if ((input->filename == NULL) && (ctxt->inputNr > 1))
- input = ctxt->inputTab[ctxt->inputNr - 2];
- xmlHTMLPrintFileInfo(input);
- xmlGenericError(xmlGenericErrorContext, "<b>validity error</b>: ");
- len = strlen(buffer);
- va_start(args, msg);
- vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
- va_end(args);
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "</p>\n");
- xmlHTMLPrintFileContext(input);
- xmlHTMLEncodeSend();
- progresult = XMLLINT_ERR_VALID;
- }
- /**
- * xmlHTMLValidityWarning:
- * @ctx: an XML parser context
- * @msg: the message to display/transmit
- * @...: extra parameters for the message display
- *
- * Display and format a validity warning messages, gives file, line,
- * position and extra parameters.
- */
- static void XMLCDECL
- xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
- {
- xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx;
- xmlParserInputPtr input;
- va_list args;
- int len;
- buffer[0] = 0;
- input = ctxt->input;
- if ((input->filename == NULL) && (ctxt->inputNr > 1))
- input = ctxt->inputTab[ctxt->inputNr - 2];
- xmlHTMLPrintFileInfo(input);
- xmlGenericError(xmlGenericErrorContext, "<b>validity warning</b>: ");
- va_start(args, msg);
- len = strlen(buffer);
- vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
- va_end(args);
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "</p>\n");
- xmlHTMLPrintFileContext(input);
- xmlHTMLEncodeSend();
- }
- /************************************************************************
- * *
- * Shell Interface *
- * *
- ************************************************************************/
- #ifdef LIBXML_DEBUG_ENABLED
- #ifdef LIBXML_XPATH_ENABLED
- /**
- * xmlShellReadline:
- * @prompt: the prompt value
- *
- * Read a string
- *
- * Returns a pointer to it or NULL on EOF the caller is expected to
- * free the returned string.
- */
- static char *
- xmlShellReadline(char *prompt) {
- #ifdef HAVE_LIBREADLINE
- char *line_read;
- /* Get a line from the user. */
- line_read = readline (prompt);
- /* If the line has any text in it, save it on the history. */
- if (line_read && *line_read)
- add_history (line_read);
- return (line_read);
- #else
- char line_read[501];
- char *ret;
- int len;
- if (prompt != NULL)
- fprintf(stdout, "%s", prompt);
- if (!fgets(line_read, 500, stdin))
- return(NULL);
- line_read[500] = 0;
- len = strlen(line_read);
- ret = (char *) malloc(len + 1);
- if (ret != NULL) {
- memcpy (ret, line_read, len + 1);
- }
- return(ret);
- #endif
- }
- #endif /* LIBXML_XPATH_ENABLED */
- #endif /* LIBXML_DEBUG_ENABLED */
- /************************************************************************
- * *
- * I/O Interfaces *
- * *
- ************************************************************************/
- static int myRead(FILE *f, char * buf, int len) {
- return(fread(buf, 1, len, f));
- }
- static void myClose(FILE *f) {
- if (f != stdin) {
- fclose(f);
- }
- }
- /************************************************************************
- * *
- * SAX based tests *
- * *
- ************************************************************************/
- /*
- * empty SAX block
- */
- static xmlSAXHandler emptySAXHandlerStruct = {
- NULL, /* internalSubset */
- NULL, /* isStandalone */
- NULL, /* hasInternalSubset */
- NULL, /* hasExternalSubset */
- NULL, /* resolveEntity */
- NULL, /* getEntity */
- NULL, /* entityDecl */
- NULL, /* notationDecl */
- NULL, /* attributeDecl */
- NULL, /* elementDecl */
- NULL, /* unparsedEntityDecl */
- NULL, /* setDocumentLocator */
- NULL, /* startDocument */
- NULL, /* endDocument */
- NULL, /* startElement */
- NULL, /* endElement */
- NULL, /* reference */
- NULL, /* characters */
- NULL, /* ignorableWhitespace */
- NULL, /* processingInstruction */
- NULL, /* comment */
- NULL, /* xmlParserWarning */
- NULL, /* xmlParserError */
- NULL, /* xmlParserError */
- NULL, /* getParameterEntity */
- NULL, /* cdataBlock; */
- NULL, /* externalSubset; */
- XML_SAX2_MAGIC,
- NULL,
- NULL, /* startElementNs */
- NULL, /* endElementNs */
- NULL /* xmlStructuredErrorFunc */
- };
- static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
- extern xmlSAXHandlerPtr debugSAXHandler;
- static int callbacks;
- /**
- * isStandaloneDebug:
- * @ctxt: An XML parser context
- *
- * Is this document tagged standalone ?
- *
- * Returns 1 if true
- */
- static int
- isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
- {
- callbacks++;
- if (noout)
- return(0);
- fprintf(stdout, "SAX.isStandalone()\n");
- return(0);
- }
- /**
- * hasInternalSubsetDebug:
- * @ctxt: An XML parser context
- *
- * Does this document has an internal subset
- *
- * Returns 1 if true
- */
- static int
- hasInternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
- {
- callbacks++;
- if (noout)
- return(0);
- fprintf(stdout, "SAX.hasInternalSubset()\n");
- return(0);
- }
- /**
- * hasExternalSubsetDebug:
- * @ctxt: An XML parser context
- *
- * Does this document has an external subset
- *
- * Returns 1 if true
- */
- static int
- hasExternalSubsetDebug(void *ctx ATTRIBUTE_UNUSED)
- {
- callbacks++;
- if (noout)
- return(0);
- fprintf(stdout, "SAX.hasExternalSubset()\n");
- return(0);
- }
- /**
- * internalSubsetDebug:
- * @ctxt: An XML parser context
- *
- * Does this document has an internal subset
- */
- static void
- internalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
- const xmlChar *ExternalID, const xmlChar *SystemID)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.internalSubset(%s,", name);
- if (ExternalID == NULL)
- fprintf(stdout, " ,");
- else
- fprintf(stdout, " %s,", ExternalID);
- if (SystemID == NULL)
- fprintf(stdout, " )\n");
- else
- fprintf(stdout, " %s)\n", SystemID);
- }
- /**
- * externalSubsetDebug:
- * @ctxt: An XML parser context
- *
- * Does this document has an external subset
- */
- static void
- externalSubsetDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
- const xmlChar *ExternalID, const xmlChar *SystemID)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.externalSubset(%s,", name);
- if (ExternalID == NULL)
- fprintf(stdout, " ,");
- else
- fprintf(stdout, " %s,", ExternalID);
- if (SystemID == NULL)
- fprintf(stdout, " )\n");
- else
- fprintf(stdout, " %s)\n", SystemID);
- }
- /**
- * resolveEntityDebug:
- * @ctxt: An XML parser context
- * @publicId: The public ID of the entity
- * @systemId: The system ID of the entity
- *
- * Special entity resolver, better left to the parser, it has
- * more context than the application layer.
- * The default behaviour is to NOT resolve the entities, in that case
- * the ENTITY_REF nodes are built in the structure (and the parameter
- * values).
- *
- * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
- */
- static xmlParserInputPtr
- resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xmlChar *systemId)
- {
- callbacks++;
- if (noout)
- return(NULL);
- /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
- fprintf(stdout, "SAX.resolveEntity(");
- if (publicId != NULL)
- fprintf(stdout, "%s", (char *)publicId);
- else
- fprintf(stdout, " ");
- if (systemId != NULL)
- fprintf(stdout, ", %s)\n", (char *)systemId);
- else
- fprintf(stdout, ", )\n");
- return(NULL);
- }
- /**
- * getEntityDebug:
- * @ctxt: An XML parser context
- * @name: The entity name
- *
- * Get an entity by name
- *
- * Returns the xmlParserInputPtr if inlined or NULL for DOM behaviour.
- */
- static xmlEntityPtr
- getEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
- {
- callbacks++;
- if (noout)
- return(NULL);
- fprintf(stdout, "SAX.getEntity(%s)\n", name);
- return(NULL);
- }
- /**
- * getParameterEntityDebug:
- * @ctxt: An XML parser context
- * @name: The entity name
- *
- * Get a parameter entity by name
- *
- * Returns the xmlParserInputPtr
- */
- static xmlEntityPtr
- getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
- {
- callbacks++;
- if (noout)
- return(NULL);
- fprintf(stdout, "SAX.getParameterEntity(%s)\n", name);
- return(NULL);
- }
- /**
- * entityDeclDebug:
- * @ctxt: An XML parser context
- * @name: the entity name
- * @type: the entity type
- * @publicId: The public ID of the entity
- * @systemId: The system ID of the entity
- * @content: the entity value (without processing).
- *
- * An entity definition has been parsed
- */
- static void
- entityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
- const xmlChar *publicId, const xmlChar *systemId, xmlChar *content)
- {
- const xmlChar *nullstr = BAD_CAST "(null)";
- /* not all libraries handle printing null pointers nicely */
- if (publicId == NULL)
- publicId = nullstr;
- if (systemId == NULL)
- systemId = nullstr;
- if (content == NULL)
- content = (xmlChar *)nullstr;
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.entityDecl(%s, %d, %s, %s, %s)\n",
- name, type, publicId, systemId, content);
- }
- /**
- * attributeDeclDebug:
- * @ctxt: An XML parser context
- * @name: the attribute name
- * @type: the attribute type
- *
- * An attribute definition has been parsed
- */
- static void
- attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
- const xmlChar * name, int type, int def,
- const xmlChar * defaultValue, xmlEnumerationPtr tree)
- {
- callbacks++;
- if (noout)
- return;
- if (defaultValue == NULL)
- fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
- elem, name, type, def);
- else
- fprintf(stdout, "SAX.attributeDecl(%s, %s, %d, %d, %s, ...)\n",
- elem, name, type, def, defaultValue);
- xmlFreeEnumeration(tree);
- }
- /**
- * elementDeclDebug:
- * @ctxt: An XML parser context
- * @name: the element name
- * @type: the element type
- * @content: the element value (without processing).
- *
- * An element definition has been parsed
- */
- static void
- elementDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, int type,
- xmlElementContentPtr content ATTRIBUTE_UNUSED)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.elementDecl(%s, %d, ...)\n",
- name, type);
- }
- /**
- * notationDeclDebug:
- * @ctxt: An XML parser context
- * @name: The name of the notation
- * @publicId: The public ID of the entity
- * @systemId: The system ID of the entity
- *
- * What to do when a notation declaration has been parsed.
- */
- static void
- notationDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
- const xmlChar *publicId, const xmlChar *systemId)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.notationDecl(%s, %s, %s)\n",
- (char *) name, (char *) publicId, (char *) systemId);
- }
- /**
- * unparsedEntityDeclDebug:
- * @ctxt: An XML parser context
- * @name: The name of the entity
- * @publicId: The public ID of the entity
- * @systemId: The system ID of the entity
- * @notationName: the name of the notation
- *
- * What to do when an unparsed entity declaration is parsed
- */
- static void
- unparsedEntityDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name,
- const xmlChar *publicId, const xmlChar *systemId,
- const xmlChar *notationName)
- {
- const xmlChar *nullstr = BAD_CAST "(null)";
- if (publicId == NULL)
- publicId = nullstr;
- if (systemId == NULL)
- systemId = nullstr;
- if (notationName == NULL)
- notationName = nullstr;
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.unparsedEntityDecl(%s, %s, %s, %s)\n",
- (char *) name, (char *) publicId, (char *) systemId,
- (char *) notationName);
- }
- /**
- * setDocumentLocatorDebug:
- * @ctxt: An XML parser context
- * @loc: A SAX Locator
- *
- * Receive the document locator at startup, actually xmlDefaultSAXLocator
- * Everything is available on the context, so this is useless in our case.
- */
- static void
- setDocumentLocatorDebug(void *ctx ATTRIBUTE_UNUSED, xmlSAXLocatorPtr loc ATTRIBUTE_UNUSED)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.setDocumentLocator()\n");
- }
- /**
- * startDocumentDebug:
- * @ctxt: An XML parser context
- *
- * called when the document start being processed.
- */
- static void
- startDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.startDocument()\n");
- }
- /**
- * endDocumentDebug:
- * @ctxt: An XML parser context
- *
- * called when the document end has been detected.
- */
- static void
- endDocumentDebug(void *ctx ATTRIBUTE_UNUSED)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.endDocument()\n");
- }
- /**
- * startElementDebug:
- * @ctxt: An XML parser context
- * @name: The element name
- *
- * called when an opening tag has been processed.
- */
- static void
- startElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name, const xmlChar **atts)
- {
- int i;
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.startElement(%s", (char *) name);
- if (atts != NULL) {
- for (i = 0;(atts[i] != NULL);i++) {
- fprintf(stdout, ", %s='", atts[i++]);
- if (atts[i] != NULL)
- fprintf(stdout, "%s'", atts[i]);
- }
- }
- fprintf(stdout, ")\n");
- }
- /**
- * endElementDebug:
- * @ctxt: An XML parser context
- * @name: The element name
- *
- * called when the end of an element has been detected.
- */
- static void
- endElementDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.endElement(%s)\n", (char *) name);
- }
- /**
- * charactersDebug:
- * @ctxt: An XML parser context
- * @ch: a xmlChar string
- * @len: the number of xmlChar
- *
- * receiving some chars from the parser.
- * Question: how much at a time ???
- */
- static void
- charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
- {
- char out[40];
- int i;
- callbacks++;
- if (noout)
- return;
- for (i = 0;(i<len) && (i < 30);i++)
- out[i] = ch[i];
- out[i] = 0;
- fprintf(stdout, "SAX.characters(%s, %d)\n", out, len);
- }
- /**
- * referenceDebug:
- * @ctxt: An XML parser context
- * @name: The entity name
- *
- * called when an entity reference is detected.
- */
- static void
- referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.reference(%s)\n", name);
- }
- /**
- * ignorableWhitespaceDebug:
- * @ctxt: An XML parser context
- * @ch: a xmlChar string
- * @start: the first char in the string
- * @len: the number of xmlChar
- *
- * receiving some ignorable whitespaces from the parser.
- * Question: how much at a time ???
- */
- static void
- ignorableWhitespaceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
- {
- char out[40];
- int i;
- callbacks++;
- if (noout)
- return;
- for (i = 0;(i<len) && (i < 30);i++)
- out[i] = ch[i];
- out[i] = 0;
- fprintf(stdout, "SAX.ignorableWhitespace(%s, %d)\n", out, len);
- }
- /**
- * processingInstructionDebug:
- * @ctxt: An XML parser context
- * @target: the target name
- * @data: the PI data's
- * @len: the number of xmlChar
- *
- * A processing instruction has been parsed.
- */
- static void
- processingInstructionDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *target,
- const xmlChar *data)
- {
- callbacks++;
- if (noout)
- return;
- if (data != NULL)
- fprintf(stdout, "SAX.processingInstruction(%s, %s)\n",
- (char *) target, (char *) data);
- else
- fprintf(stdout, "SAX.processingInstruction(%s, NULL)\n",
- (char *) target);
- }
- /**
- * cdataBlockDebug:
- * @ctx: the user data (XML parser context)
- * @value: The pcdata content
- * @len: the block length
- *
- * called when a pcdata block has been parsed
- */
- static void
- cdataBlockDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value, int len)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.pcdata(%.20s, %d)\n",
- (char *) value, len);
- }
- /**
- * commentDebug:
- * @ctxt: An XML parser context
- * @value: the comment content
- *
- * A comment has been parsed.
- */
- static void
- commentDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *value)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.comment(%s)\n", value);
- }
- /**
- * warningDebug:
- * @ctxt: An XML parser context
- * @msg: the message to display/transmit
- * @...: extra parameters for the message display
- *
- * Display and format a warning messages, gives file, line, position and
- * extra parameters.
- */
- static void XMLCDECL
- warningDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
- {
- va_list args;
- callbacks++;
- if (noout)
- return;
- va_start(args, msg);
- fprintf(stdout, "SAX.warning: ");
- vfprintf(stdout, msg, args);
- va_end(args);
- }
- /**
- * errorDebug:
- * @ctxt: An XML parser context
- * @msg: the message to display/transmit
- * @...: extra parameters for the message display
- *
- * Display and format a error messages, gives file, line, position and
- * extra parameters.
- */
- static void XMLCDECL
- errorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
- {
- va_list args;
- callbacks++;
- if (noout)
- return;
- va_start(args, msg);
- fprintf(stdout, "SAX.error: ");
- vfprintf(stdout, msg, args);
- va_end(args);
- }
- /**
- * fatalErrorDebug:
- * @ctxt: An XML parser context
- * @msg: the message to display/transmit
- * @...: extra parameters for the message display
- *
- * Display and format a fatalError messages, gives file, line, position and
- * extra parameters.
- */
- static void XMLCDECL
- fatalErrorDebug(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...)
- {
- va_list args;
- callbacks++;
- if (noout)
- return;
- va_start(args, msg);
- fprintf(stdout, "SAX.fatalError: ");
- vfprintf(stdout, msg, args);
- va_end(args);
- }
- static xmlSAXHandler debugSAXHandlerStruct = {
- internalSubsetDebug,
- isStandaloneDebug,
- hasInternalSubsetDebug,
- hasExternalSubsetDebug,
- resolveEntityDebug,
- getEntityDebug,
- entityDeclDebug,
- notationDeclDebug,
- attributeDeclDebug,
- elementDeclDebug,
- unparsedEntityDeclDebug,
- setDocumentLocatorDebug,
- startDocumentDebug,
- endDocumentDebug,
- startElementDebug,
- endElementDebug,
- referenceDebug,
- charactersDebug,
- ignorableWhitespaceDebug,
- processingInstructionDebug,
- commentDebug,
- warningDebug,
- errorDebug,
- fatalErrorDebug,
- getParameterEntityDebug,
- cdataBlockDebug,
- externalSubsetDebug,
- 1,
- NULL,
- NULL,
- NULL,
- NULL
- };
- xmlSAXHandlerPtr debugSAXHandler = &debugSAXHandlerStruct;
- /*
- * SAX2 specific callbacks
- */
- /**
- * startElementNsDebug:
- * @ctxt: An XML parser context
- * @name: The element name
- *
- * called when an opening tag has been processed.
- */
- static void
- startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
- const xmlChar *localname,
- const xmlChar *prefix,
- const xmlChar *URI,
- int nb_namespaces,
- const xmlChar **namespaces,
- int nb_attributes,
- int nb_defaulted,
- const xmlChar **attributes)
- {
- int i;
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.startElementNs(%s", (char *) localname);
- if (prefix == NULL)
- fprintf(stdout, ", NULL");
- else
- fprintf(stdout, ", %s", (char *) prefix);
- if (URI == NULL)
- fprintf(stdout, ", NULL");
- else
- fprintf(stdout, ", '%s'", (char *) URI);
- fprintf(stdout, ", %d", nb_namespaces);
- if (namespaces != NULL) {
- for (i = 0;i < nb_namespaces * 2;i++) {
- fprintf(stdout, ", xmlns");
- if (namespaces[i] != NULL)
- fprintf(stdout, ":%s", namespaces[i]);
- i++;
- fprintf(stdout, "='%s'", namespaces[i]);
- }
- }
- fprintf(stdout, ", %d, %d", nb_attributes, nb_defaulted);
- if (attributes != NULL) {
- for (i = 0;i < nb_attributes * 5;i += 5) {
- if (attributes[i + 1] != NULL)
- fprintf(stdout, ", %s:%s='", attributes[i + 1], attributes[i]);
- else
- fprintf(stdout, ", %s='", attributes[i]);
- fprintf(stdout, "%.4s...', %d", attributes[i + 3],
- (int)(attributes[i + 4] - attributes[i + 3]));
- }
- }
- fprintf(stdout, ")\n");
- }
- /**
- * endElementDebug:
- * @ctxt: An XML parser context
- * @name: The element name
- *
- * called when the end of an element has been detected.
- */
- static void
- endElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
- const xmlChar *localname,
- const xmlChar *prefix,
- const xmlChar *URI)
- {
- callbacks++;
- if (noout)
- return;
- fprintf(stdout, "SAX.endElementNs(%s", (char *) localname);
- if (prefix == NULL)
- fprintf(stdout, ", NULL");
- else
- fprintf(stdout, ", %s", (char *) prefix);
- if (URI == NULL)
- fprintf(stdout, ", NULL)\n");
- else
- fprintf(stdout, ", '%s')\n", (char *) URI);
- }
- static xmlSAXHandler debugSAX2HandlerStruct = {
- internalSubsetDebug,
- isStandaloneDebug,
- hasInternalSubsetDebug,
- hasExternalSubsetDebug,
- resolveEntityDebug,
- getEntityDebug,
- entityDeclDebug,
- notationDeclDebug,
- attributeDeclDebug,
- elementDeclDebug,
- unparsedEntityDeclDebug,
- setDocumentLocatorDebug,
- startDocumentDebug,
- endDocumentDebug,
- NULL,
- NULL,
- referenceDebug,
- charactersDebug,
- ignorableWhitespaceDebug,
- processingInstructionDebug,
- commentDebug,
- warningDebug,
- errorDebug,
- fatalErrorDebug,
- getParameterEntityDebug,
- cdataBlockDebug,
- externalSubsetDebug,
- XML_SAX2_MAGIC,
- NULL,
- startElementNsDebug,
- endElementNsDebug,
- NULL
- };
- static xmlSAXHandlerPtr debugSAX2Handler = &debugSAX2HandlerStruct;
- static void
- testSAX(const char *filename) {
- xmlSAXHandlerPtr handler;
- const char *user_data = "user_data"; /* mostly for debugging */
- xmlParserInputBufferPtr buf = NULL;
- xmlParserInputPtr inputStream;
- xmlParserCtxtPtr ctxt = NULL;
- xmlSAXHandlerPtr old_sax = NULL;
- callbacks = 0;
- if (noout) {
- handler = emptySAXHandler;
- #ifdef LIBXML_SAX1_ENABLED
- } else if (sax1) {
- handler = debugSAXHandler;
- #endif
- } else {
- handler = debugSAX2Handler;
- }
- /*
- * it's not the simplest code but the most generic in term of I/O
- */
- buf = xmlParserInputBufferCreateFilename(filename, XML_CHAR_ENCODING_NONE);
- if (buf == NULL) {
- goto error;
- }
- #ifdef LIBXML_SCHEMAS_ENABLED
- if (wxschemas != NULL) {
- int ret;
- xmlSchemaValidCtxtPtr vctxt;
- vctxt = xmlSchemaNewValidCtxt(wxschemas);
- xmlSchemaSetValidErrors(vctxt,
- (xmlSchemaValidityErrorFunc) fprintf,
- (xmlSchemaValidityWarningFunc) fprintf,
- stderr);
- ret = xmlSchemaValidateStream(vctxt, buf, 0, handler,
- (void *)user_data);
- if (repeat == 0) {
- if (ret == 0) {
- fprintf(stderr, "%s validates\n", filename);
- } else if (ret > 0) {
- fprintf(stderr, "%s fails to validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
- } else {
- fprintf(stderr, "%s validation generated an internal error\n",
- filename);
- progresult = XMLLINT_ERR_VALID;
- }
- }
- xmlSchemaFreeValidCtxt(vctxt);
- } else
- #endif
- {
- /*
- * Create the parser context amd hook the input
- */
- ctxt = xmlNewParserCtxt();
- if (ctxt == NULL) {
- xmlFreeParserInputBuffer(buf);
- goto error;
- }
- old_sax = ctxt->sax;
- ctxt->sax = handler;
- ctxt->userData = (void *) user_data;
- inputStream = xmlNewIOInputStream(ctxt, buf, XML_CHAR_ENCODING_NONE);
- if (inputStream == NULL) {
- xmlFreeParserInputBuffer(buf);
- goto error;
- }
- inputPush(ctxt, inputStream);
- /* do the parsing */
- xmlParseDocument(ctxt);
- if (ctxt->myDoc != NULL) {
- fprintf(stderr, "SAX generated a doc !\n");
- xmlFreeDoc(ctxt->myDoc);
- ctxt->myDoc = NULL;
- }
- }
- error:
- if (ctxt != NULL) {
- ctxt->sax = old_sax;
- xmlFreeParserCtxt(ctxt);
- }
- }
- /************************************************************************
- * *
- * Stream Test processing *
- * *
- ************************************************************************/
- #ifdef LIBXML_READER_ENABLED
- static void processNode(xmlTextReaderPtr reader) {
- const xmlChar *name, *value;
- int type, empty;
- type = xmlTextReaderNodeType(reader);
- empty = xmlTextReaderIsEmptyElement(reader);
- if (debug) {
- name = xmlTextReaderConstName(reader);
- if (name == NULL)
- name = BAD_CAST "--";
- value = xmlTextReaderConstValue(reader);
- printf("%d %d %s %d %d",
- xmlTextReaderDepth(reader),
- type,
- name,
- empty,
- xmlTextReaderHasValue(reader));
- if (value == NULL)
- printf("\n");
- else {
- printf(" %s\n", value);
- }
- }
- #ifdef LIBXML_PATTERN_ENABLED
- if (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));
- if (match) {
- #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
- path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
- printf("Node %s matches pattern %s\n", path, pattern);
- #else
- printf("Node %s matches pattern %s\n",
- xmlTextReaderConstName(reader), pattern);
- #endif
- }
- }
- if (patstream != NULL) {
- int ret;
- if (type == XML_READER_TYPE_ELEMENT) {
- ret = xmlStreamPush(patstream,
- xmlTextReaderConstLocalName(reader),
- xmlTextReaderConstNamespaceUri(reader));
- if (ret < 0) {
- fprintf(stderr, "xmlStreamPush() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- } else if (ret != match) {
- #if defined(LIBXML_TREE_ENABLED) || defined(LIBXML_DEBUG_ENABLED)
- if (path == NULL) {
- path = xmlGetNodePath(
- xmlTextReaderCurrentNode(reader));
- }
- #endif
- fprintf(stderr,
- "xmlPatternMatch and xmlStreamPush disagree\n");
- if (path != NULL)
- fprintf(stderr, " pattern %s node %s\n",
- pattern, path);
- else
- fprintf(stderr, " pattern %s node %s\n",
- pattern, xmlTextReaderConstName(reader));
- }
- }
- if ((type == XML_READER_TYPE_END_ELEMENT) ||
- ((type == XML_READER_TYPE_ELEMENT) && (empty))) {
- ret = xmlStreamPop(patstream);
- if (ret < 0) {
- fprintf(stderr, "xmlStreamPop() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- }
- }
- }
- if (path != NULL)
- xmlFree(path);
- }
- #endif
- }
- static void streamFile(char *filename) {
- xmlTextReaderPtr reader;
- int ret;
- #ifdef HAVE_SYS_MMAN_H
- int fd = -1;
- struct stat info;
- const char *base = NULL;
- xmlParserInputBufferPtr input = NULL;
- if (memory) {
- if (stat(filename, &info) < 0)
- return;
- if ((fd = open(filename, O_RDONLY)) < 0)
- return;
- base = mmap(NULL, info.st_size, PROT_READ, MAP_SHARED, fd, 0) ;
- if (base == (void *) MAP_FAILED)
- return;
- reader = xmlReaderForMemory(base, info.st_size, filename,
- NULL, options);
- } else
- #endif
- reader = xmlReaderForFile(filename, NULL, options);
- #ifdef LIBXML_PATTERN_ENABLED
- if (pattern != NULL) {
- patternc = xmlPatterncompile((const xmlChar *) pattern, NULL, 0, NULL);
- if (patternc == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Pattern %s failed to compile\n", pattern);
- progresult = XMLLINT_ERR_SCHEMAPAT;
- pattern = NULL;
- }
- }
- if (patternc != NULL) {
- patstream = xmlPatternGetStreamCtxt(patternc);
- if (patstream != NULL) {
- ret = xmlStreamPush(patstream, NULL, NULL);
- if (ret < 0) {
- fprintf(stderr, "xmlStreamPush() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- }
- }
- }
- #endif
- if (reader != NULL) {
- #ifdef LIBXML_VALID_ENABLED
- if (valid)
- xmlTextReaderSetParserProp(reader, XML_PARSER_VALIDATE, 1);
- else
- #endif /* LIBXML_VALID_ENABLED */
- xmlTextReaderSetParserProp(reader, XML_PARSER_LOADDTD, 1);
- #ifdef LIBXML_SCHEMAS_ENABLED
- if (relaxng != NULL) {
- if ((timing) && (!repeat)) {
- startTimer();
- }
- ret = xmlTextReaderRelaxNGValidate(reader, relaxng);
- if (ret < 0) {
- xmlGenericError(xmlGenericErrorContext,
- "Relax-NG schema %s failed to compile\n", relaxng);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- relaxng = NULL;
- }
- if ((timing) && (!repeat)) {
- endTimer("Compiling the schemas");
- }
- }
- if (schema != NULL) {
- if ((timing) && (!repeat)) {
- startTimer();
- }
- ret = xmlTextReaderSchemaValidate(reader, schema);
- if (ret < 0) {
- xmlGenericError(xmlGenericErrorContext,
- "XSD schema %s failed to compile\n", schema);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- schema = NULL;
- }
- if ((timing) && (!repeat)) {
- endTimer("Compiling the schemas");
- }
- }
- #endif
- /*
- * Process all nodes in sequence
- */
- if ((timing) && (!repeat)) {
- startTimer();
- }
- ret = xmlTextReaderRead(reader);
- while (ret == 1) {
- if ((debug)
- #ifdef LIBXML_PATTERN_ENABLED
- || (patternc)
- #endif
- )
- processNode(reader);
- ret = xmlTextReaderRead(reader);
- }
- if ((timing) && (!repeat)) {
- #ifdef LIBXML_SCHEMAS_ENABLED
- if (relaxng != NULL)
- endTimer("Parsing and validating");
- else
- #endif
- #ifdef LIBXML_VALID_ENABLED
- if (valid)
- endTimer("Parsing and validating");
- else
- #endif
- endTimer("Parsing");
- }
- #ifdef LIBXML_VALID_ENABLED
- if (valid) {
- if (xmlTextReaderIsValid(reader) != 1) {
- xmlGenericError(xmlGenericErrorContext,
- "Document %s does not validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
- }
- }
- #endif /* LIBXML_VALID_ENABLED */
- #ifdef LIBXML_SCHEMAS_ENABLED
- if ((relaxng != NULL) || (schema != NULL)) {
- if (xmlTextReaderIsValid(reader) != 1) {
- fprintf(stderr, "%s fails to validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
- } else {
- fprintf(stderr, "%s validates\n", filename);
- }
- }
- #endif
- /*
- * Done, cleanup and status
- */
- xmlFreeTextReader(reader);
- if (ret != 0) {
- fprintf(stderr, "%s : failed to parse\n", filename);
- progresult = XMLLINT_ERR_UNCLASS;
- }
- } else {
- fprintf(stderr, "Unable to open %s\n", filename);
- progresult = XMLLINT_ERR_UNCLASS;
- }
- #ifdef LIBXML_PATTERN_ENABLED
- if (patstream != NULL) {
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- }
- #endif
- #ifdef HAVE_SYS_MMAN_H
- if (memory) {
- xmlFreeParserInputBuffer(input);
- munmap((char *) base, info.st_size);
- close(fd);
- }
- #endif
- }
- static void walkDoc(xmlDocPtr doc) {
- xmlTextReaderPtr reader;
- int ret;
- #ifdef LIBXML_PATTERN_ENABLED
- xmlNodePtr root;
- const xmlChar *namespaces[22];
- int i;
- xmlNsPtr ns;
- root = xmlDocGetRootElement(doc);
- for (ns = root->nsDef, i = 0;ns != NULL && i < 20;ns=ns->next) {
- namespaces[i++] = ns->href;
- namespaces[i++] = ns->prefix;
- }
- namespaces[i++] = NULL;
- namespaces[i] = NULL;
- if (pattern != NULL) {
- patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict,
- 0, &namespaces[0]);
- if (patternc == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Pattern %s failed to compile\n", pattern);
- progresult = XMLLINT_ERR_SCHEMAPAT;
- pattern = NULL;
- }
- }
- if (patternc != NULL) {
- patstream = xmlPatternGetStreamCtxt(patternc);
- if (patstream != NULL) {
- ret = xmlStreamPush(patstream, NULL, NULL);
- if (ret < 0) {
- fprintf(stderr, "xmlStreamPush() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- }
- }
- }
- #endif /* LIBXML_PATTERN_ENABLED */
- reader = xmlReaderWalker(doc);
- if (reader != NULL) {
- if ((timing) && (!repeat)) {
- startTimer();
- }
- ret = xmlTextReaderRead(reader);
- while (ret == 1) {
- if ((debug)
- #ifdef LIBXML_PATTERN_ENABLED
- || (patternc)
- #endif
- )
- processNode(reader);
- ret = xmlTextReaderRead(reader);
- }
- if ((timing) && (!repeat)) {
- endTimer("walking through the doc");
- }
- xmlFreeTextReader(reader);
- if (ret != 0) {
- fprintf(stderr, "failed to walk through the doc\n");
- progresult = XMLLINT_ERR_UNCLASS;
- }
- } else {
- fprintf(stderr, "Failed to crate a reader from the document\n");
- progresult = XMLLINT_ERR_UNCLASS;
- }
- #ifdef LIBXML_PATTERN_ENABLED
- if (patstream != NULL) {
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- }
- #endif
- }
- #endif /* LIBXML_READER_ENABLED */
- #ifdef LIBXML_XPATH_ENABLED
- /************************************************************************
- * *
- * XPath Query *
- * *
- ************************************************************************/
- static void doXPathDump(xmlXPathObjectPtr cur) {
- switch(cur->type) {
- case XPATH_NODESET: {
- int i;
- xmlNodePtr node;
- #ifdef LIBXML_OUTPUT_ENABLED
- xmlSaveCtxtPtr ctxt;
- if (cur->nodesetval->nodeNr <= 0) {
- …
Large files files are truncated, but you can click here to view the full file