| Index: third_party/libxml/xmllint.c
|
| diff --git a/third_party/libxml/xmllint.c b/third_party/libxml/xmllint.c
|
| index ee41697d98369b02c93c657a9948f3364183450f..2a75e3bd53d69145c5f53d94159754a82062bc24 100644
|
| --- a/third_party/libxml/xmllint.c
|
| +++ b/third_party/libxml/xmllint.c
|
| @@ -108,15 +108,16 @@
|
|
|
| typedef enum {
|
| XMLLINT_RETURN_OK = 0, /* No error */
|
| - XMLLINT_ERR_UNCLASS, /* Unclassified */
|
| - XMLLINT_ERR_DTD, /* Error in DTD */
|
| - XMLLINT_ERR_VALID, /* Validation error */
|
| - XMLLINT_ERR_RDFILE, /* CtxtReadFile error */
|
| - XMLLINT_ERR_SCHEMACOMP, /* Schema compilation */
|
| - XMLLINT_ERR_OUT, /* Error writing output */
|
| - XMLLINT_ERR_SCHEMAPAT, /* Error in schema pattern */
|
| - XMLLINT_ERR_RDREGIS, /* Error in Reader registration */
|
| - XMLLINT_ERR_MEM /* Out of memory 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;
|
| @@ -184,6 +185,7 @@ 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
|
| @@ -200,8 +202,12 @@ 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;
|
|
|
| /************************************************************************
|
| * *
|
| @@ -246,7 +252,7 @@ void parsePath(const xmlChar *path) {
|
|
|
| static xmlExternalEntityLoader defaultEntityLoader = NULL;
|
|
|
| -static xmlParserInputPtr
|
| +static xmlParserInputPtr
|
| xmllintExternalEntityLoader(const char *URL, const char *ID,
|
| xmlParserCtxtPtr ctxt) {
|
| xmlParserInputPtr ret;
|
| @@ -304,10 +310,10 @@ xmllintExternalEntityLoader(const char *URL, const char *ID,
|
| ctxt->sax->error = err;
|
| if (load_trace) {
|
| fprintf \
|
| - (stderr,
|
| - "Loaded URL=\"%s\" ID=\"%s\"\n",
|
| + (stderr,
|
| + "Loaded URL=\"%s\" ID=\"%s\"\n",
|
| newURL,
|
| - ID ? ID : "(null)");
|
| + ID ? ID : "(null)");
|
| }
|
| xmlFree(newURL);
|
| return(ret);
|
| @@ -327,9 +333,9 @@ xmllintExternalEntityLoader(const char *URL, const char *ID,
|
| return(NULL);
|
| }
|
| /************************************************************************
|
| - * *
|
| + * *
|
| * Memory allocation consumption debugging *
|
| - * *
|
| + * *
|
| ************************************************************************/
|
|
|
| static void
|
| @@ -390,13 +396,13 @@ myStrdupFunc(const char *str)
|
| return (ret);
|
| }
|
| /************************************************************************
|
| - * *
|
| + * *
|
| * Internal timing routines to remove the necessity to have *
|
| * unix-specific function calls. *
|
| - * *
|
| + * *
|
| ************************************************************************/
|
|
|
| -#ifndef HAVE_GETTIMEOFDAY
|
| +#ifndef HAVE_GETTIMEOFDAY
|
| #ifdef HAVE_SYS_TIMEB_H
|
| #ifdef HAVE_SYS_TIME_H
|
| #ifdef HAVE_FTIME
|
| @@ -522,9 +528,9 @@ endTimer(char *format, ...)
|
| }
|
| #endif
|
| /************************************************************************
|
| - * *
|
| - * HTML ouput *
|
| - * *
|
| + * *
|
| + * HTML ouput *
|
| + * *
|
| ************************************************************************/
|
| static char buffer[50000];
|
|
|
| @@ -543,7 +549,7 @@ xmlHTMLEncodeSend(void) {
|
| /**
|
| * xmlHTMLPrintFileInfo:
|
| * @input: an xmlParserInputPtr input
|
| - *
|
| + *
|
| * Displays the associated file and line informations for the current input
|
| */
|
|
|
| @@ -567,7 +573,7 @@ xmlHTMLPrintFileInfo(xmlParserInputPtr input) {
|
| /**
|
| * xmlHTMLPrintFileContext:
|
| * @input: an xmlParserInputPtr input
|
| - *
|
| + *
|
| * Displays current context within the input content for error tracking
|
| */
|
|
|
| @@ -592,7 +598,7 @@ xmlHTMLPrintFileContext(xmlParserInputPtr input) {
|
| n = 0;
|
| while ((*cur != 0) && (*cur != '\n') && (*cur != '\r') && (n < 79)) {
|
| len = strlen(buffer);
|
| - snprintf(&buffer[len], sizeof(buffer) - len, "%c",
|
| + snprintf(&buffer[len], sizeof(buffer) - len, "%c",
|
| (unsigned char) *cur++);
|
| n++;
|
| }
|
| @@ -618,7 +624,7 @@ xmlHTMLPrintFileContext(xmlParserInputPtr input) {
|
| * @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.
|
| */
|
| @@ -635,7 +641,7 @@ xmlHTMLError(void *ctx, const char *msg, ...)
|
| if ((input != NULL) && (input->filename == NULL) && (ctxt->inputNr > 1)) {
|
| input = ctxt->inputTab[ctxt->inputNr - 2];
|
| }
|
| -
|
| +
|
| xmlHTMLPrintFileInfo(input);
|
|
|
| xmlGenericError(xmlGenericErrorContext, "<b>error</b>: ");
|
| @@ -655,7 +661,7 @@ xmlHTMLError(void *ctx, const char *msg, ...)
|
| * @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.
|
| */
|
| @@ -672,13 +678,13 @@ xmlHTMLWarning(void *ctx, const char *msg, ...)
|
| 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);
|
| + len = strlen(buffer);
|
| vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
|
| va_end(args);
|
| xmlHTMLEncodeSend();
|
| @@ -693,7 +699,7 @@ xmlHTMLWarning(void *ctx, const char *msg, ...)
|
| * @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.
|
| */
|
| @@ -709,7 +715,7 @@ xmlHTMLValidityError(void *ctx, const char *msg, ...)
|
| input = ctxt->input;
|
| if ((input->filename == NULL) && (ctxt->inputNr > 1))
|
| input = ctxt->inputTab[ctxt->inputNr - 2];
|
| -
|
| +
|
| xmlHTMLPrintFileInfo(input);
|
|
|
| xmlGenericError(xmlGenericErrorContext, "<b>validity error</b>: ");
|
| @@ -730,7 +736,7 @@ xmlHTMLValidityError(void *ctx, const char *msg, ...)
|
| * @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.
|
| */
|
| @@ -748,10 +754,10 @@ xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
|
| input = ctxt->inputTab[ctxt->inputNr - 2];
|
|
|
| xmlHTMLPrintFileInfo(input);
|
| -
|
| +
|
| xmlGenericError(xmlGenericErrorContext, "<b>validity warning</b>: ");
|
| va_start(args, msg);
|
| - len = strlen(buffer);
|
| + len = strlen(buffer);
|
| vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
|
| va_end(args);
|
| xmlHTMLEncodeSend();
|
| @@ -762,9 +768,9 @@ xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
|
| }
|
|
|
| /************************************************************************
|
| - * *
|
| - * Shell Interface *
|
| - * *
|
| + * *
|
| + * Shell Interface *
|
| + * *
|
| ************************************************************************/
|
| #ifdef LIBXML_DEBUG_ENABLED
|
| #ifdef LIBXML_XPATH_ENABLED
|
| @@ -773,7 +779,7 @@ xmlHTMLValidityWarning(void *ctx, const char *msg, ...)
|
| * @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.
|
| */
|
| @@ -812,9 +818,9 @@ xmlShellReadline(char *prompt) {
|
| #endif /* LIBXML_DEBUG_ENABLED */
|
|
|
| /************************************************************************
|
| - * *
|
| - * I/O Interfaces *
|
| - * *
|
| + * *
|
| + * I/O Interfaces *
|
| + * *
|
| ************************************************************************/
|
|
|
| static int myRead(FILE *f, char * buf, int len) {
|
| @@ -828,7 +834,7 @@ static void myClose(FILE *f) {
|
|
|
| /************************************************************************
|
| * *
|
| - * SAX based tests *
|
| + * SAX based tests *
|
| * *
|
| ************************************************************************/
|
|
|
| @@ -998,7 +1004,7 @@ resolveEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *publicId, const xm
|
| return(NULL);
|
| /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
|
|
|
| -
|
| +
|
| fprintf(stdout, "SAX.resolveEntity(");
|
| if (publicId != NULL)
|
| fprintf(stdout, "%s", (char *)publicId);
|
| @@ -1053,8 +1059,8 @@ getParameterEntityDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
| /**
|
| * entityDeclDebug:
|
| * @ctxt: An XML parser context
|
| - * @name: the entity name
|
| - * @type: the entity type
|
| + * @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).
|
| @@ -1083,8 +1089,8 @@ const xmlChar *nullstr = BAD_CAST "(null)";
|
| /**
|
| * attributeDeclDebug:
|
| * @ctxt: An XML parser context
|
| - * @name: the attribute name
|
| - * @type: the attribute type
|
| + * @name: the attribute name
|
| + * @type: the attribute type
|
| *
|
| * An attribute definition has been parsed
|
| */
|
| @@ -1108,8 +1114,8 @@ attributeDeclDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar * elem,
|
| /**
|
| * elementDeclDebug:
|
| * @ctxt: An XML parser context
|
| - * @name: the element name
|
| - * @type: the element type
|
| + * @name: the element name
|
| + * @type: the element type
|
| * @content: the element value (without processing).
|
| *
|
| * An element definition has been parsed
|
| @@ -1295,7 +1301,7 @@ charactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
|
| * @ctxt: An XML parser context
|
| * @name: The entity name
|
| *
|
| - * called when an entity reference is detected.
|
| + * called when an entity reference is detected.
|
| */
|
| static void
|
| referenceDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *name)
|
| @@ -1531,7 +1537,7 @@ startElementNsDebug(void *ctx ATTRIBUTE_UNUSED,
|
| 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");
|
| @@ -1694,7 +1700,7 @@ testSAX(const char *filename) {
|
| goto error;
|
| }
|
| inputPush(ctxt, inputStream);
|
| -
|
| +
|
| /* do the parsing */
|
| xmlParseDocument(ctxt);
|
|
|
| @@ -1713,9 +1719,9 @@ error:
|
| }
|
|
|
| /************************************************************************
|
| - * *
|
| - * Stream Test processing *
|
| - * *
|
| + * *
|
| + * Stream Test processing *
|
| + * *
|
| ************************************************************************/
|
| #ifdef LIBXML_READER_ENABLED
|
| static void processNode(xmlTextReaderPtr reader) {
|
| @@ -1732,8 +1738,8 @@ static void processNode(xmlTextReaderPtr reader) {
|
|
|
| value = xmlTextReaderConstValue(reader);
|
|
|
| -
|
| - printf("%d %d %s %d %d",
|
| +
|
| + printf("%d %d %s %d %d",
|
| xmlTextReaderDepth(reader),
|
| type,
|
| name,
|
| @@ -1749,14 +1755,19 @@ static void processNode(xmlTextReaderPtr reader) {
|
| 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) {
|
| @@ -1771,19 +1782,23 @@ static void processNode(xmlTextReaderPtr reader) {
|
| 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");
|
| - fprintf(stderr,
|
| - " pattern %s node %s\n",
|
| - pattern, path);
|
| + 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);
|
| @@ -1810,7 +1825,7 @@ static void streamFile(char *filename) {
|
| xmlParserInputBufferPtr input = NULL;
|
|
|
| if (memory) {
|
| - if (stat(filename, &info) < 0)
|
| + if (stat(filename, &info) < 0)
|
| return;
|
| if ((fd = open(filename, O_RDONLY)) < 0)
|
| return;
|
| @@ -1979,7 +1994,7 @@ static void walkDoc(xmlDocPtr doc) {
|
| namespaces[i++] = ns->prefix;
|
| }
|
| namespaces[i++] = NULL;
|
| - namespaces[i++] = NULL;
|
| + namespaces[i] = NULL;
|
|
|
| if (pattern != NULL) {
|
| patternc = xmlPatterncompile((const xmlChar *) pattern, doc->dict,
|
| @@ -2039,10 +2054,104 @@ static void walkDoc(xmlDocPtr doc) {
|
| }
|
| #endif /* LIBXML_READER_ENABLED */
|
|
|
| +#ifdef LIBXML_XPATH_ENABLED
|
| /************************************************************************
|
| - * *
|
| - * Tree Test processing *
|
| - * *
|
| + * *
|
| + * 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) {
|
| + fprintf(stderr, "XPath set is empty\n");
|
| + progresult = XMLLINT_ERR_XPATH;
|
| + break;
|
| + }
|
| + ctxt = xmlSaveToFd(1, NULL, 0);
|
| + if (ctxt == NULL) {
|
| + fprintf(stderr, "Out of memory for XPath\n");
|
| + progresult = XMLLINT_ERR_MEM;
|
| + return;
|
| + }
|
| + for (i = 0;i < cur->nodesetval->nodeNr;i++) {
|
| + node = cur->nodesetval->nodeTab[i];
|
| + xmlSaveTree(ctxt, node);
|
| + }
|
| + xmlSaveClose(ctxt);
|
| +#else
|
| + printf("xpath returned %d nodes\n", cur->nodesetval->nodeNr);
|
| +#endif
|
| + break;
|
| + }
|
| + case XPATH_BOOLEAN:
|
| + if (cur->boolval) printf("true");
|
| + else printf("false");
|
| + break;
|
| + case XPATH_NUMBER:
|
| + switch (xmlXPathIsInf(cur->floatval)) {
|
| + case 1:
|
| + printf("Infinity");
|
| + break;
|
| + case -1:
|
| + printf("-Infinity");
|
| + break;
|
| + default:
|
| + if (xmlXPathIsNaN(cur->floatval)) {
|
| + printf("NaN");
|
| + } else {
|
| + printf("%0g", cur->floatval);
|
| + }
|
| + }
|
| + break;
|
| + case XPATH_STRING:
|
| + printf("%s", (const char *) cur->stringval);
|
| + break;
|
| + case XPATH_UNDEFINED:
|
| + fprintf(stderr, "XPath Object is uninitialized\n");
|
| + progresult = XMLLINT_ERR_XPATH;
|
| + break;
|
| + default:
|
| + fprintf(stderr, "XPath object of unexpected type\n");
|
| + progresult = XMLLINT_ERR_XPATH;
|
| + break;
|
| + }
|
| +}
|
| +
|
| +static void doXPathQuery(xmlDocPtr doc, const char *query) {
|
| + xmlXPathContextPtr ctxt;
|
| + xmlXPathObjectPtr res;
|
| +
|
| + ctxt = xmlXPathNewContext(doc);
|
| + if (ctxt == NULL) {
|
| + fprintf(stderr, "Out of memory for XPath\n");
|
| + progresult = XMLLINT_ERR_MEM;
|
| + return;
|
| + }
|
| + ctxt->node = xmlDocGetRootElement(doc);
|
| + res = xmlXPathEval(BAD_CAST query, ctxt);
|
| + xmlXPathFreeContext(ctxt);
|
| +
|
| + if (res == NULL) {
|
| + fprintf(stderr, "XPath evaluation failure\n");
|
| + progresult = XMLLINT_ERR_XPATH;
|
| + return;
|
| + }
|
| + doXPathDump(res);
|
| + xmlXPathFreeObject(res);
|
| +}
|
| +#endif /* LIBXML_XPATH_ENABLED */
|
| +
|
| +/************************************************************************
|
| + * *
|
| + * Tree Test processing *
|
| + * *
|
| ************************************************************************/
|
| static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| xmlDocPtr doc = NULL;
|
| @@ -2052,7 +2161,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
|
|
| if ((timing) && (!repeat))
|
| startTimer();
|
| -
|
| +
|
|
|
| #ifdef LIBXML_TREE_ENABLED
|
| if (filename == NULL) {
|
| @@ -2103,7 +2212,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| int fd;
|
| struct stat info;
|
| const char *base;
|
| - if (stat(filename, &info) < 0)
|
| + if (stat(filename, &info) < 0)
|
| return;
|
| if ((fd = open(filename, O_RDONLY)) < 0)
|
| return;
|
| @@ -2113,7 +2222,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
|
|
| doc = htmlReadMemory((char *) base, info.st_size, filename,
|
| NULL, options);
|
| -
|
| +
|
| munmap((char *) base, info.st_size);
|
| close(fd);
|
| }
|
| @@ -2164,6 +2273,8 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| doc = NULL;
|
| }
|
| }
|
| + if (f != stdin)
|
| + fclose(f);
|
| }
|
| } else
|
| #endif /* LIBXML_PUSH_ENABLED */
|
| @@ -2198,7 +2309,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| ctxt = xmlNewParserCtxt();
|
| else
|
| ctxt = rectxt;
|
| - if (ctxt == NULL) {
|
| + if (ctxt == NULL) {
|
| doc = NULL;
|
| } else {
|
| ctxt->sax->error = xmlHTMLError;
|
| @@ -2216,7 +2327,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| int fd;
|
| struct stat info;
|
| const char *base;
|
| - if (stat(filename, &info) < 0)
|
| + if (stat(filename, &info) < 0)
|
| return;
|
| if ((fd = open(filename, O_RDONLY)) < 0)
|
| return;
|
| @@ -2230,7 +2341,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| else
|
| doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size,
|
| filename, NULL, options);
|
| -
|
| +
|
| munmap((char *) base, info.st_size);
|
| close(fd);
|
| #endif
|
| @@ -2242,7 +2353,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| ctxt = xmlNewParserCtxt();
|
| else
|
| ctxt = rectxt;
|
| - if (ctxt == NULL) {
|
| + if (ctxt == NULL) {
|
| doc = NULL;
|
| } else {
|
| doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
|
| @@ -2305,6 +2416,12 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| }
|
| #endif
|
|
|
| +#ifdef LIBXML_XPATH_ENABLED
|
| + if (xpathquery != NULL) {
|
| + doXPathQuery(doc, xpathquery);
|
| + }
|
| +#endif
|
| +
|
| #ifdef LIBXML_DEBUG_ENABLED
|
| #ifdef LIBXML_XPATH_ENABLED
|
| /*
|
| @@ -2363,7 +2480,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| }
|
| }
|
| }
|
| - }
|
| + }
|
| }else
|
| #endif /* LIBXML_VALID_ENABLED */
|
| #ifdef LIBXML_READER_ENABLED
|
| @@ -2428,7 +2545,19 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| xmlChar *result = NULL;
|
| int size;
|
|
|
| - size = xmlC14NDocDumpMemory(doc, NULL, 0, NULL, 1, &result);
|
| + size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_0, NULL, 1, &result);
|
| + if (size >= 0) {
|
| + write(1, result, size);
|
| + xmlFree(result);
|
| + } else {
|
| + fprintf(stderr, "Failed to canonicalize\n");
|
| + progresult = XMLLINT_ERR_OUT;
|
| + }
|
| + } else if (canonical) {
|
| + xmlChar *result = NULL;
|
| + int size;
|
| +
|
| + size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_1_1, NULL, 1, &result);
|
| if (size >= 0) {
|
| write(1, result, size);
|
| xmlFree(result);
|
| @@ -2441,7 +2570,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| xmlChar *result = NULL;
|
| int size;
|
|
|
| - size = xmlC14NDocDumpMemory(doc, NULL, 1, NULL, 1, &result);
|
| + size = xmlC14NDocDumpMemory(doc, NULL, XML_C14N_EXCLUSIVE_1_0, NULL, 1, &result);
|
| if (size >= 0) {
|
| write(1, result, size);
|
| xmlFree(result);
|
| @@ -2459,7 +2588,7 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| if (encoding != NULL) {
|
| if ( format ) {
|
| xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1);
|
| - } else {
|
| + } else {
|
| xmlDocDumpMemoryEnc(doc, &result, &len, encoding);
|
| }
|
| } else {
|
| @@ -2527,6 +2656,11 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| if (format)
|
| saveOpts |= XML_SAVE_FORMAT;
|
|
|
| +#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
|
| + if (xmlout)
|
| + saveOpts |= XML_SAVE_AS_XML;
|
| +#endif
|
| +
|
| if (output == NULL)
|
| ctxt = xmlSaveToFd(1, encoding, saveOpts);
|
| else
|
| @@ -2579,9 +2713,9 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| startTimer();
|
| }
|
| if (dtdvalid != NULL)
|
| - dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
|
| + dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
|
| else
|
| - dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
|
| + dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
|
| if ((timing) && (!repeat)) {
|
| endTimer("Parsing DTD");
|
| }
|
| @@ -2752,9 +2886,11 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| #endif
|
|
|
| #ifdef LIBXML_DEBUG_ENABLED
|
| +#if defined(LIBXML_HTML_ENABLED) || defined(LIBXML_VALID_ENABLED)
|
| if ((debugent) && (!html))
|
| xmlDebugDumpEntities(stderr, doc);
|
| #endif
|
| +#endif
|
|
|
| /*
|
| * free it.
|
| @@ -2769,9 +2905,9 @@ static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
|
| }
|
|
|
| /************************************************************************
|
| - * *
|
| - * Usage and Main *
|
| - * *
|
| + * *
|
| + * Usage and Main *
|
| + * *
|
| ************************************************************************/
|
|
|
| static void showVersion(const char *name) {
|
| @@ -2785,28 +2921,28 @@ static void showVersion(const char *name) {
|
| if (xmlHasFeature(XML_WITH_PATTERN)) fprintf(stderr, "Patterns ");
|
| if (xmlHasFeature(XML_WITH_WRITER)) fprintf(stderr, "Writer ");
|
| if (xmlHasFeature(XML_WITH_SAX1)) fprintf(stderr, "SAXv1 ");
|
| - if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP ");
|
| - if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP ");
|
| + if (xmlHasFeature(XML_WITH_FTP)) fprintf(stderr, "FTP ");
|
| + if (xmlHasFeature(XML_WITH_HTTP)) fprintf(stderr, "HTTP ");
|
| if (xmlHasFeature(XML_WITH_VALID)) fprintf(stderr, "DTDValid ");
|
| - if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML ");
|
| - if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy ");
|
| - if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N ");
|
| - if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog ");
|
| - if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath ");
|
| - if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer ");
|
| - if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude ");
|
| - if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv ");
|
| - if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X ");
|
| - if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode ");
|
| - if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps ");
|
| - if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata ");
|
| - if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr ");
|
| - if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas ");
|
| - if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron ");
|
| - if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules ");
|
| - if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug ");
|
| - if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug ");
|
| - if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug ");
|
| + if (xmlHasFeature(XML_WITH_HTML)) fprintf(stderr, "HTML ");
|
| + if (xmlHasFeature(XML_WITH_LEGACY)) fprintf(stderr, "Legacy ");
|
| + if (xmlHasFeature(XML_WITH_C14N)) fprintf(stderr, "C14N ");
|
| + if (xmlHasFeature(XML_WITH_CATALOG)) fprintf(stderr, "Catalog ");
|
| + if (xmlHasFeature(XML_WITH_XPATH)) fprintf(stderr, "XPath ");
|
| + if (xmlHasFeature(XML_WITH_XPTR)) fprintf(stderr, "XPointer ");
|
| + if (xmlHasFeature(XML_WITH_XINCLUDE)) fprintf(stderr, "XInclude ");
|
| + if (xmlHasFeature(XML_WITH_ICONV)) fprintf(stderr, "Iconv ");
|
| + if (xmlHasFeature(XML_WITH_ISO8859X)) fprintf(stderr, "ISO8859X ");
|
| + if (xmlHasFeature(XML_WITH_UNICODE)) fprintf(stderr, "Unicode ");
|
| + if (xmlHasFeature(XML_WITH_REGEXP)) fprintf(stderr, "Regexps ");
|
| + if (xmlHasFeature(XML_WITH_AUTOMATA)) fprintf(stderr, "Automata ");
|
| + if (xmlHasFeature(XML_WITH_EXPR)) fprintf(stderr, "Expr ");
|
| + if (xmlHasFeature(XML_WITH_SCHEMAS)) fprintf(stderr, "Schemas ");
|
| + if (xmlHasFeature(XML_WITH_SCHEMATRON)) fprintf(stderr, "Schematron ");
|
| + if (xmlHasFeature(XML_WITH_MODULES)) fprintf(stderr, "Modules ");
|
| + if (xmlHasFeature(XML_WITH_DEBUG)) fprintf(stderr, "Debug ");
|
| + if (xmlHasFeature(XML_WITH_DEBUG_MEM)) fprintf(stderr, "MemDebug ");
|
| + if (xmlHasFeature(XML_WITH_DEBUG_RUN)) fprintf(stderr, "RunDebug ");
|
| if (xmlHasFeature(XML_WITH_ZLIB)) fprintf(stderr, "Zlib ");
|
| fprintf(stderr, "\n");
|
| }
|
| @@ -2832,6 +2968,7 @@ static void usage(const char *name) {
|
| printf("\t--copy : used to test the internal copy implementation\n");
|
| #endif /* LIBXML_TREE_ENABLED */
|
| printf("\t--recover : output what was parsable on broken XML documents\n");
|
| + printf("\t--huge : remove any internal arbitrary parser limits\n");
|
| printf("\t--noent : substitute entity references by their value\n");
|
| printf("\t--noout : don't output the result tree\n");
|
| printf("\t--path 'paths': provide a set of paths for resources\n");
|
| @@ -2874,7 +3011,8 @@ static void usage(const char *name) {
|
| printf("\t--encode encoding : output in the given encoding\n");
|
| printf("\t--dropdtd : remove the DOCTYPE of the input docs\n");
|
| #endif /* LIBXML_OUTPUT_ENABLED */
|
| - printf("\t--c14n : save in W3C canonical format (with comments)\n");
|
| + printf("\t--c14n : save in W3C canonical format v1.0 (with comments)\n");
|
| + printf("\t--c14n11 : save in W3C canonical format v1.1 (with comments)\n");
|
| printf("\t--exc-c14n : save in W3C exclusive canonical format (with comments)\n");
|
| #ifdef LIBXML_C14N_ENABLED
|
| #endif /* LIBXML_C14N_ENABLED */
|
| @@ -2890,6 +3028,7 @@ static void usage(const char *name) {
|
| #ifdef LIBXML_XINCLUDE_ENABLED
|
| printf("\t--xinclude : do XInclude processing\n");
|
| printf("\t--noxincludenode : same but do not generate XInclude nodes\n");
|
| + printf("\t--nofixup-base-uris : do not fixup xml:base uris\n");
|
| #endif
|
| printf("\t--loaddtd : fetch external DTD\n");
|
| printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
|
| @@ -2912,6 +3051,10 @@ static void usage(const char *name) {
|
| printf("\t--sax1: use the old SAX1 interfaces for processing\n");
|
| #endif
|
| printf("\t--sax: do not build a tree but work just at the SAX level\n");
|
| + printf("\t--oldxml10: use XML-1.0 parsing rules before the 5th edition\n");
|
| +#ifdef LIBXML_XPATH_ENABLED
|
| + printf("\t--xpath expr: evaluate the XPath expression, inply --noout\n");
|
| +#endif
|
|
|
| printf("\nLibxml project home page: http://xmlsoft.org/\n");
|
| printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
|
| @@ -2938,7 +3081,7 @@ main(int argc, char **argv) {
|
| int files = 0;
|
| int version = 0;
|
| const char* indent;
|
| -
|
| +
|
| if (argc <= 1) {
|
| usage(argv[0]);
|
| return(1);
|
| @@ -2958,7 +3101,7 @@ main(int argc, char **argv) {
|
| (!strcmp(argv[i], "--shell"))) {
|
| shell++;
|
| noout = 1;
|
| - } else
|
| + } else
|
| #endif
|
| #ifdef LIBXML_TREE_ENABLED
|
| if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
|
| @@ -2969,6 +3112,9 @@ main(int argc, char **argv) {
|
| (!strcmp(argv[i], "--recover"))) {
|
| recovery++;
|
| 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"))) {
|
| noent++;
|
| @@ -3091,6 +3237,12 @@ main(int argc, char **argv) {
|
| 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
|
| #ifdef LIBXML_OUTPUT_ENABLED
|
| #ifdef HAVE_ZLIB_H
|
| @@ -3118,19 +3270,24 @@ main(int argc, char **argv) {
|
| (!strcmp(argv[i], "--debugent"))) {
|
| debugent++;
|
| xmlParserDebugEntities = 1;
|
| - }
|
| + }
|
| #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")) ||
|
| @@ -3139,7 +3296,7 @@ main(int argc, char **argv) {
|
| } else if ((!strcmp(argv[i], "-nocatalogs")) ||
|
| (!strcmp(argv[i], "--nocatalogs"))) {
|
| nocatalogs++;
|
| - }
|
| + }
|
| #endif
|
| else if ((!strcmp(argv[i], "-encode")) ||
|
| (!strcmp(argv[i], "--encode"))) {
|
| @@ -3187,16 +3344,17 @@ main(int argc, char **argv) {
|
| #ifdef LIBXML_SAX1_ENABLED
|
| else if ((!strcmp(argv[i], "-sax1")) ||
|
| (!strcmp(argv[i], "--sax1"))) {
|
| - sax1++;
|
| + sax1++;
|
| + options |= XML_PARSE_SAX1;
|
| }
|
| #endif /* LIBXML_SAX1_ENABLED */
|
| else if ((!strcmp(argv[i], "-sax")) ||
|
| (!strcmp(argv[i], "--sax"))) {
|
| - sax++;
|
| + sax++;
|
| }
|
| else if ((!strcmp(argv[i], "-chkregister")) ||
|
| (!strcmp(argv[i], "--chkregister"))) {
|
| - chkregister++;
|
| + chkregister++;
|
| #ifdef LIBXML_SCHEMAS_ENABLED
|
| } else if ((!strcmp(argv[i], "-relaxng")) ||
|
| (!strcmp(argv[i], "--relaxng"))) {
|
| @@ -3237,6 +3395,17 @@ main(int argc, char **argv) {
|
| i++;
|
| pattern = argv[i];
|
| #endif
|
| +#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"))) {
|
| + oldxml10++;
|
| + options |= XML_PARSE_OLD10;
|
| } else {
|
| fprintf(stderr, "Unknown option %s\n", argv[i]);
|
| usage(argv[0]);
|
| @@ -3270,12 +3439,12 @@ main(int argc, char **argv) {
|
| xmlRegisterNodeDefault(registerNode);
|
| xmlDeregisterNodeDefault(deregisterNode);
|
| }
|
| -
|
| +
|
| indent = getenv("XMLLINT_INDENT");
|
| if(indent != NULL) {
|
| xmlTreeIndentString = indent;
|
| }
|
| -
|
| +
|
|
|
| defaultEntityLoader = xmlGetExternalEntityLoader();
|
| xmlSetExternalEntityLoader(xmllintExternalEntityLoader);
|
| @@ -3297,7 +3466,7 @@ main(int argc, char **argv) {
|
| xmlGenericError(xmlGenericErrorContext,
|
| "<html><head><title>%s output</title></head>\n",
|
| argv[0]);
|
| - xmlGenericError(xmlGenericErrorContext,
|
| + xmlGenericError(xmlGenericErrorContext,
|
| "<body bgcolor=\"#ffffff\"><h1 align=\"center\">%s output</h1>\n",
|
| argv[0]);
|
| }
|
| @@ -3311,7 +3480,7 @@ main(int argc, char **argv) {
|
| xmlSchematronParserCtxtPtr ctxt;
|
|
|
| /* forces loading the DTDs */
|
| - xmlLoadExtDtdDefaultValue |= 1;
|
| + xmlLoadExtDtdDefaultValue |= 1;
|
| options |= XML_PARSE_DTDLOAD;
|
| if (timing) {
|
| startTimer();
|
| @@ -3345,7 +3514,7 @@ main(int argc, char **argv) {
|
| xmlRelaxNGParserCtxtPtr ctxt;
|
|
|
| /* forces loading the DTDs */
|
| - xmlLoadExtDtdDefaultValue |= 1;
|
| + xmlLoadExtDtdDefaultValue |= 1;
|
| options |= XML_PARSE_DTDLOAD;
|
| if (timing) {
|
| startTimer();
|
| @@ -3425,7 +3594,7 @@ main(int argc, char **argv) {
|
| (!strcmp(argv[i], "--dtdvalid"))) {
|
| i++;
|
| continue;
|
| - }
|
| + }
|
| if ((!strcmp(argv[i], "-path")) ||
|
| (!strcmp(argv[i], "--path"))) {
|
| i++;
|
| @@ -3464,6 +3633,13 @@ main(int argc, char **argv) {
|
| continue;
|
| }
|
| #endif
|
| +#ifdef LIBXML_XPATH_ENABLED
|
| + if ((!strcmp(argv[i], "-xpath")) ||
|
| + (!strcmp(argv[i], "--xpath"))) {
|
| + i++;
|
| + continue;
|
| + }
|
| +#endif
|
| if ((timing) && (repeat))
|
| startTimer();
|
| /* Remember file names. "-" means stdin. <sven@zen.org> */
|
| @@ -3515,7 +3691,7 @@ main(int argc, char **argv) {
|
| }
|
| }
|
| }
|
| - if (generate)
|
| + if (generate)
|
| parseAndPrintFile(NULL, NULL);
|
| if ((htmlout) && (!nowrap)) {
|
| xmlGenericError(xmlGenericErrorContext, "</body></html>\n");
|
|
|