diff --git a/Demos/CcdPhysicsDemo/main.cpp b/Demos/CcdPhysicsDemo/main.cpp
index fdb11f946..327e5430b 100644
--- a/Demos/CcdPhysicsDemo/main.cpp
+++ b/Demos/CcdPhysicsDemo/main.cpp
@@ -32,5 +32,6 @@ int main(int argc,char** argv)
glutmain(argc, argv,640,480,"Bullet Physics Demo. http://bullet.sf.net",ccdDemo);
delete ccdDemo;
+ return 0;
}
diff --git a/Extras/LibXML/runsuite.c b/Extras/LibXML/runsuite.c
deleted file mode 100644
index 744875c7b..000000000
--- a/Extras/LibXML/runsuite.c
+++ /dev/null
@@ -1,1184 +0,0 @@
-/*
- * runsuite.c: C program to run libxml2 againts published testsuites
- *
- * See Copyright for the status of this software.
- *
- * daniel@veillard.com
- */
-
-#ifdef HAVE_CONFIG_H
-#include "libxml.h"
-#else
-#include
-#endif
-
-#if !defined(_WIN32) || defined(__CYGWIN__)
-#include
-#endif
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-#include
-#if defined(LIBXML_SCHEMAS_ENABLED) && defined(LIBXML_XPATH_ENABLED)
-#include
-
-#include
-#include
-
-#include
-#include
-#include
-
-#define LOGFILE "runsuite.log"
-static FILE *logfile = NULL;
-static int verbose = 0;
-
-
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-
-#define vsnprintf _vsnprintf
-
-#define snprintf _snprintf
-
-#endif
-
-/************************************************************************
- * *
- * File name and path utilities *
- * *
- ************************************************************************/
-
-static int checkTestFile(const char *filename) {
- struct stat buf;
-
- if (stat(filename, &buf) == -1)
- return(0);
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
- if (!(buf.st_mode & _S_IFREG))
- return(0);
-#else
- if (!S_ISREG(buf.st_mode))
- return(0);
-#endif
-
- return(1);
-}
-
-static xmlChar *composeDir(const xmlChar *dir, const xmlChar *path) {
- char buf[500];
-
- if (dir == NULL) return(xmlStrdup(path));
- if (path == NULL) return(NULL);
-
- snprintf(buf, 500, "%s/%s", (const char *) dir, (const char *) path);
- return(xmlStrdup((const xmlChar *) buf));
-}
-
-/************************************************************************
- * *
- * Libxml2 specific routines *
- * *
- ************************************************************************/
-
-static int nb_tests = 0;
-static int nb_errors = 0;
-static int nb_internals = 0;
-static int nb_schematas = 0;
-static int nb_unimplemented = 0;
-static int nb_leaks = 0;
-static int extraMemoryFromResolver = 0;
-
-static int
-fatalError(void) {
- fprintf(stderr, "Exitting tests on fatal error\n");
- exit(1);
-}
-
-/*
- * that's needed to implement
- */
-#define MAX_ENTITIES 20
-static char *testEntitiesName[MAX_ENTITIES];
-static char *testEntitiesValue[MAX_ENTITIES];
-static int nb_entities = 0;
-static void resetEntities(void) {
- int i;
-
- for (i = 0;i < nb_entities;i++) {
- if (testEntitiesName[i] != NULL)
- xmlFree(testEntitiesName[i]);
- if (testEntitiesValue[i] != NULL)
- xmlFree(testEntitiesValue[i]);
- }
- nb_entities = 0;
-}
-static int addEntity(char *name, char *content) {
- if (nb_entities >= MAX_ENTITIES) {
- fprintf(stderr, "Too many entities defined\n");
- return(-1);
- }
- testEntitiesName[nb_entities] = name;
- testEntitiesValue[nb_entities] = content;
- nb_entities++;
- return(0);
-}
-
-/*
- * We need to trap calls to the resolver to not account memory for the catalog
- * which is shared to the current running test. We also don't want to have
- * network downloads modifying tests.
- */
-static xmlParserInputPtr
-testExternalEntityLoader(const char *URL, const char *ID,
- xmlParserCtxtPtr ctxt) {
- xmlParserInputPtr ret;
- int i;
-
- for (i = 0;i < nb_entities;i++) {
- if (!strcmp(testEntitiesName[i], URL)) {
- ret = xmlNewStringInputStream(ctxt,
- (const xmlChar *) testEntitiesValue[i]);
- if (ret != NULL) {
- ret->filename = (const char *)
- xmlStrdup((xmlChar *)testEntitiesName[i]);
- }
- return(ret);
- }
- }
- if (checkTestFile(URL)) {
- ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
- } else {
- int memused = xmlMemUsed();
- ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
- extraMemoryFromResolver += xmlMemUsed() - memused;
- }
-#if 0
- if (ret == NULL) {
- fprintf(stderr, "Failed to find resource %s\n", URL);
- }
-#endif
-
- return(ret);
-}
-
-/*
- * Trapping the error messages at the generic level to grab the equivalent of
- * stderr messages on CLI tools.
- */
-static char testErrors[32769];
-static int testErrorsSize = 0;
-
-static void test_log(const char *msg, ...) {
- va_list args;
- if (logfile != NULL) {
- fprintf(logfile, "\n------------\n");
- va_start(args, msg);
- vfprintf(logfile, msg, args);
- va_end(args);
- fprintf(logfile, "%s", testErrors);
- testErrorsSize = 0; testErrors[0] = 0;
- }
- if (verbose) {
- va_start(args, msg);
- vfprintf(stderr, msg, args);
- va_end(args);
- }
-}
-
-static void
-testErrorHandler(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) {
- va_list args;
- int res;
-
- if (testErrorsSize >= 32768)
- return;
- va_start(args, msg);
- res = vsnprintf(&testErrors[testErrorsSize],
- 32768 - testErrorsSize,
- msg, args);
- va_end(args);
- if (testErrorsSize + res >= 32768) {
- /* buffer is full */
- testErrorsSize = 32768;
- testErrors[testErrorsSize] = 0;
- } else {
- testErrorsSize += res;
- }
- testErrors[testErrorsSize] = 0;
-}
-
-static xmlXPathContextPtr ctxtXPath;
-
-static void
-initializeLibxml2(void) {
- xmlGetWarningsDefaultValue = 0;
- xmlPedanticParserDefault(0);
-
- xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
- xmlInitParser();
- xmlSetExternalEntityLoader(testExternalEntityLoader);
- ctxtXPath = xmlXPathNewContext(NULL);
- /*
- * Deactivate the cache if created; otherwise we have to create/free it
- * for every test, since it will confuse the memory leak detection.
- * Note that normally this need not be done, since the cache is not
- * created until set explicitely with xmlXPathContextSetCache();
- * but for test purposes it is sometimes usefull to activate the
- * cache by default for the whole library.
- */
- if (ctxtXPath->cache != NULL)
- xmlXPathContextSetCache(ctxtXPath, 0, -1, 0);
- /* used as default nanemspace in xstc tests */
- xmlXPathRegisterNs(ctxtXPath, BAD_CAST "ts", BAD_CAST "TestSuite");
- xmlXPathRegisterNs(ctxtXPath, BAD_CAST "xlink",
- BAD_CAST "http://www.w3.org/1999/xlink");
- xmlSetGenericErrorFunc(NULL, testErrorHandler);
-#ifdef LIBXML_SCHEMAS_ENABLED
- xmlSchemaInitTypes();
- xmlRelaxNGInitTypes();
-#endif
-}
-
-static xmlNodePtr
-getNext(xmlNodePtr cur, const char *xpath) {
- xmlNodePtr ret = NULL;
- xmlXPathObjectPtr res;
- xmlXPathCompExprPtr comp;
-
- if ((cur == NULL) || (cur->doc == NULL) || (xpath == NULL))
- return(NULL);
- ctxtXPath->doc = cur->doc;
- ctxtXPath->node = cur;
- comp = xmlXPathCompile(BAD_CAST xpath);
- if (comp == NULL) {
- fprintf(stderr, "Failed to compile %s\n", xpath);
- return(NULL);
- }
- res = xmlXPathCompiledEval(comp, ctxtXPath);
- xmlXPathFreeCompExpr(comp);
- if (res == NULL)
- return(NULL);
- if ((res->type == XPATH_NODESET) &&
- (res->nodesetval != NULL) &&
- (res->nodesetval->nodeNr > 0) &&
- (res->nodesetval->nodeTab != NULL))
- ret = res->nodesetval->nodeTab[0];
- xmlXPathFreeObject(res);
- return(ret);
-}
-
-static xmlChar *
-getString(xmlNodePtr cur, const char *xpath) {
- xmlChar *ret = NULL;
- xmlXPathObjectPtr res;
- xmlXPathCompExprPtr comp;
-
- if ((cur == NULL) || (cur->doc == NULL) || (xpath == NULL))
- return(NULL);
- ctxtXPath->doc = cur->doc;
- ctxtXPath->node = cur;
- comp = xmlXPathCompile(BAD_CAST xpath);
- if (comp == NULL) {
- fprintf(stderr, "Failed to compile %s\n", xpath);
- return(NULL);
- }
- res = xmlXPathCompiledEval(comp, ctxtXPath);
- xmlXPathFreeCompExpr(comp);
- if (res == NULL)
- return(NULL);
- if (res->type == XPATH_STRING) {
- ret = res->stringval;
- res->stringval = NULL;
- }
- xmlXPathFreeObject(res);
- return(ret);
-}
-
-/************************************************************************
- * *
- * Test test/xsdtest/xsdtestsuite.xml *
- * *
- ************************************************************************/
-
-static int
-xsdIncorectTestCase(xmlNodePtr cur) {
- xmlNodePtr test;
- xmlBufferPtr buf;
- xmlRelaxNGParserCtxtPtr pctxt;
- xmlRelaxNGPtr rng = NULL;
- int ret = 0, memt;
-
- cur = getNext(cur, "./incorrect[1]");
- if (cur == NULL) {
- return(0);
- }
-
- test = getNext(cur, "./*");
- if (test == NULL) {
- test_log("Failed to find test in correct line %ld\n",
- xmlGetLineNo(cur));
- return(1);
- }
-
- memt = xmlMemUsed();
- extraMemoryFromResolver = 0;
- /*
- * dump the schemas to a buffer, then reparse it and compile the schemas
- */
- buf = xmlBufferCreate();
- if (buf == NULL) {
- fprintf(stderr, "out of memory !\n");
- fatalError();
- }
- xmlNodeDump(buf, test->doc, test, 0, 0);
- pctxt = xmlRelaxNGNewMemParserCtxt((const char *)buf->content, buf->use);
- xmlRelaxNGSetParserErrors(pctxt,
- (xmlRelaxNGValidityErrorFunc) testErrorHandler,
- (xmlRelaxNGValidityWarningFunc) testErrorHandler,
- pctxt);
- rng = xmlRelaxNGParse(pctxt);
- xmlRelaxNGFreeParserCtxt(pctxt);
- if (rng != NULL) {
- test_log("Failed to detect incorect RNG line %ld\n",
- xmlGetLineNo(test));
- ret = 1;
- goto done;
- }
-
-done:
- if (buf != NULL)
- xmlBufferFree(buf);
- if (rng != NULL)
- xmlRelaxNGFree(rng);
- xmlResetLastError();
- if ((memt != xmlMemUsed()) && (extraMemoryFromResolver == 0)) {
- test_log("Validation of tests starting line %ld leaked %d\n",
- xmlGetLineNo(cur), xmlMemUsed() - memt);
- nb_leaks++;
- }
- return(ret);
-}
-
-static void
-installResources(xmlNodePtr tst, const xmlChar *base) {
- xmlNodePtr test;
- xmlBufferPtr buf;
- xmlChar *name, *content, *res;
-
- buf = xmlBufferCreate();
- if (buf == NULL) {
- fprintf(stderr, "out of memory !\n");
- fatalError();
- }
- xmlNodeDump(buf, tst->doc, tst, 0, 0);
-
- while (tst != NULL) {
- test = getNext(tst, "./*");
- if (test != NULL) {
- xmlBufferEmpty(buf);
- xmlNodeDump(buf, test->doc, test, 0, 0);
- name = getString(tst, "string(@name)");
- content = xmlStrdup(buf->content);
- if ((name != NULL) && (content != NULL)) {
- res = composeDir(base, name);
- xmlFree(name);
- addEntity((char *) res, (char *) content);
- } else {
- if (name != NULL) xmlFree(name);
- if (content != NULL) xmlFree(content);
- }
- }
- tst = getNext(tst, "following-sibling::resource[1]");
- }
- if (buf != NULL)
- xmlBufferFree(buf);
-}
-
-static void
-installDirs(xmlNodePtr tst, const xmlChar *base) {
- xmlNodePtr test;
- xmlChar *name, *res;
-
- name = getString(tst, "string(@name)");
- if (name == NULL)
- return;
- res = composeDir(base, name);
- xmlFree(name);
- if (res == NULL) {
- return;
- }
- /* Now process resources and subdir recursively */
- test = getNext(tst, "./resource[1]");
- if (test != NULL) {
- installResources(test, res);
- }
- test = getNext(tst, "./dir[1]");
- while (test != NULL) {
- installDirs(test, res);
- test = getNext(test, "following-sibling::dir[1]");
- }
- xmlFree(res);
-}
-
-static int
-xsdTestCase(xmlNodePtr tst) {
- xmlNodePtr test, tmp, cur;
- xmlBufferPtr buf;
- xmlDocPtr doc = NULL;
- xmlRelaxNGParserCtxtPtr pctxt;
- xmlRelaxNGValidCtxtPtr ctxt;
- xmlRelaxNGPtr rng = NULL;
- int ret = 0, mem, memt;
- xmlChar *dtd;
-
- resetEntities();
- testErrorsSize = 0; testErrors[0] = 0;
-
- tmp = getNext(tst, "./dir[1]");
- if (tmp != NULL) {
- installDirs(tmp, NULL);
- }
- tmp = getNext(tst, "./resource[1]");
- if (tmp != NULL) {
- installResources(tmp, NULL);
- }
-
- cur = getNext(tst, "./correct[1]");
- if (cur == NULL) {
- return(xsdIncorectTestCase(tst));
- }
-
- test = getNext(cur, "./*");
- if (test == NULL) {
- fprintf(stderr, "Failed to find test in correct line %ld\n",
- xmlGetLineNo(cur));
- return(1);
- }
-
- memt = xmlMemUsed();
- extraMemoryFromResolver = 0;
- /*
- * dump the schemas to a buffer, then reparse it and compile the schemas
- */
- buf = xmlBufferCreate();
- if (buf == NULL) {
- fprintf(stderr, "out of memory !\n");
- fatalError();
- }
- xmlNodeDump(buf, test->doc, test, 0, 0);
- pctxt = xmlRelaxNGNewMemParserCtxt((const char *)buf->content, buf->use);
- xmlRelaxNGSetParserErrors(pctxt,
- (xmlRelaxNGValidityErrorFunc) testErrorHandler,
- (xmlRelaxNGValidityWarningFunc) testErrorHandler,
- pctxt);
- rng = xmlRelaxNGParse(pctxt);
- xmlRelaxNGFreeParserCtxt(pctxt);
- if (extraMemoryFromResolver)
- memt = 0;
-
- if (rng == NULL) {
- test_log("Failed to parse RNGtest line %ld\n",
- xmlGetLineNo(test));
- nb_errors++;
- ret = 1;
- goto done;
- }
- /*
- * now scan all the siblings of correct to process the tests
- */
- tmp = getNext(cur, "following-sibling::valid[1]");
- while (tmp != NULL) {
- dtd = xmlGetProp(tmp, BAD_CAST "dtd");
- test = getNext(tmp, "./*");
- if (test == NULL) {
- fprintf(stderr, "Failed to find test in line %ld\n",
- xmlGetLineNo(tmp));
-
- } else {
- xmlBufferEmpty(buf);
- if (dtd != NULL)
- xmlBufferAdd(buf, dtd, -1);
- xmlNodeDump(buf, test->doc, test, 0, 0);
-
- /*
- * We are ready to run the test
- */
- mem = xmlMemUsed();
- extraMemoryFromResolver = 0;
- doc = xmlReadMemory((const char *)buf->content, buf->use,
- "test", NULL, 0);
- if (doc == NULL) {
- test_log("Failed to parse valid instance line %ld\n",
- xmlGetLineNo(tmp));
- nb_errors++;
- } else {
- nb_tests++;
- ctxt = xmlRelaxNGNewValidCtxt(rng);
- xmlRelaxNGSetValidErrors(ctxt,
- (xmlRelaxNGValidityErrorFunc) testErrorHandler,
- (xmlRelaxNGValidityWarningFunc) testErrorHandler,
- ctxt);
- ret = xmlRelaxNGValidateDoc(ctxt, doc);
- xmlRelaxNGFreeValidCtxt(ctxt);
- if (ret > 0) {
- test_log("Failed to validate valid instance line %ld\n",
- xmlGetLineNo(tmp));
- nb_errors++;
- } else if (ret < 0) {
- test_log("Internal error validating instance line %ld\n",
- xmlGetLineNo(tmp));
- nb_errors++;
- }
- xmlFreeDoc(doc);
- }
- xmlResetLastError();
- if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) {
- test_log("Validation of instance line %ld leaked %d\n",
- xmlGetLineNo(tmp), xmlMemUsed() - mem);
- xmlMemoryDump();
- nb_leaks++;
- }
- }
- if (dtd != NULL)
- xmlFree(dtd);
- tmp = getNext(tmp, "following-sibling::valid[1]");
- }
- /*
- * now scan all the siblings of correct to process the tests
- */
- tmp = getNext(cur, "following-sibling::invalid[1]");
- while (tmp != NULL) {
- test = getNext(tmp, "./*");
- if (test == NULL) {
- fprintf(stderr, "Failed to find test in line %ld\n",
- xmlGetLineNo(tmp));
-
- } else {
- xmlBufferEmpty(buf);
- xmlNodeDump(buf, test->doc, test, 0, 0);
-
- /*
- * We are ready to run the test
- */
- mem = xmlMemUsed();
- extraMemoryFromResolver = 0;
- doc = xmlReadMemory((const char *)buf->content, buf->use,
- "test", NULL, 0);
- if (doc == NULL) {
- test_log("Failed to parse valid instance line %ld\n",
- xmlGetLineNo(tmp));
- nb_errors++;
- } else {
- nb_tests++;
- ctxt = xmlRelaxNGNewValidCtxt(rng);
- xmlRelaxNGSetValidErrors(ctxt,
- (xmlRelaxNGValidityErrorFunc) testErrorHandler,
- (xmlRelaxNGValidityWarningFunc) testErrorHandler,
- ctxt);
- ret = xmlRelaxNGValidateDoc(ctxt, doc);
- xmlRelaxNGFreeValidCtxt(ctxt);
- if (ret == 0) {
- test_log("Failed to detect invalid instance line %ld\n",
- xmlGetLineNo(tmp));
- nb_errors++;
- } else if (ret < 0) {
- test_log("Internal error validating instance line %ld\n",
- xmlGetLineNo(tmp));
- nb_errors++;
- }
- xmlFreeDoc(doc);
- }
- xmlResetLastError();
- if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) {
- test_log("Validation of instance line %ld leaked %d\n",
- xmlGetLineNo(tmp), xmlMemUsed() - mem);
- xmlMemoryDump();
- nb_leaks++;
- }
- }
- tmp = getNext(tmp, "following-sibling::invalid[1]");
- }
-
-done:
- if (buf != NULL)
- xmlBufferFree(buf);
- if (rng != NULL)
- xmlRelaxNGFree(rng);
- xmlResetLastError();
- if ((memt != xmlMemUsed()) && (memt != 0)) {
- test_log("Validation of tests starting line %ld leaked %d\n",
- xmlGetLineNo(cur), xmlMemUsed() - memt);
- nb_leaks++;
- }
- return(ret);
-}
-
-static int
-xsdTestSuite(xmlNodePtr cur) {
- if (verbose) {
- xmlChar *doc = getString(cur, "string(documentation)");
-
- if (doc != NULL) {
- printf("Suite %s\n", doc);
- xmlFree(doc);
- }
- }
- cur = getNext(cur, "./testCase[1]");
- while (cur != NULL) {
- xsdTestCase(cur);
- cur = getNext(cur, "following-sibling::testCase[1]");
- }
-
- return(0);
-}
-
-static int
-xsdTest(void) {
- xmlDocPtr doc;
- xmlNodePtr cur;
- const char *filename = "test/xsdtest/xsdtestsuite.xml";
- int ret = 0;
-
- doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
- if (doc == NULL) {
- fprintf(stderr, "Failed to parse %s\n", filename);
- return(-1);
- }
- printf("## XML Schemas datatypes test suite from James Clark\n");
-
- cur = xmlDocGetRootElement(doc);
- if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
- fprintf(stderr, "Unexpected format %s\n", filename);
- ret = -1;
- goto done;
- }
-
- cur = getNext(cur, "./testSuite[1]");
- if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
- fprintf(stderr, "Unexpected format %s\n", filename);
- ret = -1;
- goto done;
- }
- while (cur != NULL) {
- xsdTestSuite(cur);
- cur = getNext(cur, "following-sibling::testSuite[1]");
- }
-
-done:
- if (doc != NULL)
- xmlFreeDoc(doc);
- return(ret);
-}
-
-static int
-rngTestSuite(xmlNodePtr cur) {
- if (verbose) {
- xmlChar *doc = getString(cur, "string(documentation)");
-
- if (doc != NULL) {
- printf("Suite %s\n", doc);
- xmlFree(doc);
- } else {
- doc = getString(cur, "string(section)");
- if (doc != NULL) {
- printf("Section %s\n", doc);
- xmlFree(doc);
- }
- }
- }
- cur = getNext(cur, "./testSuite[1]");
- while (cur != NULL) {
- xsdTestSuite(cur);
- cur = getNext(cur, "following-sibling::testSuite[1]");
- }
-
- return(0);
-}
-
-static int
-rngTest1(void) {
- xmlDocPtr doc;
- xmlNodePtr cur;
- const char *filename = "test/relaxng/OASIS/spectest.xml";
- int ret = 0;
-
- doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
- if (doc == NULL) {
- fprintf(stderr, "Failed to parse %s\n", filename);
- return(-1);
- }
- printf("## Relax NG test suite from James Clark\n");
-
- cur = xmlDocGetRootElement(doc);
- if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
- fprintf(stderr, "Unexpected format %s\n", filename);
- ret = -1;
- goto done;
- }
-
- cur = getNext(cur, "./testSuite[1]");
- if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
- fprintf(stderr, "Unexpected format %s\n", filename);
- ret = -1;
- goto done;
- }
- while (cur != NULL) {
- rngTestSuite(cur);
- cur = getNext(cur, "following-sibling::testSuite[1]");
- }
-
-done:
- if (doc != NULL)
- xmlFreeDoc(doc);
- return(ret);
-}
-
-static int
-rngTest2(void) {
- xmlDocPtr doc;
- xmlNodePtr cur;
- const char *filename = "test/relaxng/testsuite.xml";
- int ret = 0;
-
- doc = xmlReadFile(filename, NULL, XML_PARSE_NOENT);
- if (doc == NULL) {
- fprintf(stderr, "Failed to parse %s\n", filename);
- return(-1);
- }
- printf("## Relax NG test suite for libxml2\n");
-
- cur = xmlDocGetRootElement(doc);
- if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
- fprintf(stderr, "Unexpected format %s\n", filename);
- ret = -1;
- goto done;
- }
-
- cur = getNext(cur, "./testSuite[1]");
- if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSuite"))) {
- fprintf(stderr, "Unexpected format %s\n", filename);
- ret = -1;
- goto done;
- }
- while (cur != NULL) {
- xsdTestSuite(cur);
- cur = getNext(cur, "following-sibling::testSuite[1]");
- }
-
-done:
- if (doc != NULL)
- xmlFreeDoc(doc);
- return(ret);
-}
-
-/************************************************************************
- * *
- * Schemas test suites from W3C/NIST/MS/Sun *
- * *
- ************************************************************************/
-
-static int
-xstcTestInstance(xmlNodePtr cur, xmlSchemaPtr schemas,
- const xmlChar *spath, const char *base) {
- xmlChar *href = NULL;
- xmlChar *path = NULL;
- xmlChar *validity = NULL;
- xmlSchemaValidCtxtPtr ctxt = NULL;
- xmlDocPtr doc = NULL;
- int ret = 0, mem;
-
- xmlResetLastError();
- testErrorsSize = 0; testErrors[0] = 0;
- mem = xmlMemUsed();
- href = getString(cur,
- "string(ts:instanceDocument/@xlink:href)");
- if ((href == NULL) || (href[0] == 0)) {
- test_log("testGroup line %ld misses href for schemaDocument\n",
- xmlGetLineNo(cur));
- ret = -1;
- goto done;
- }
- path = xmlBuildURI(href, BAD_CAST base);
- if (path == NULL) {
- fprintf(stderr,
- "Failed to build path to schemas testGroup line %ld : %s\n",
- xmlGetLineNo(cur), href);
- ret = -1;
- goto done;
- }
- if (checkTestFile((const char *) path) <= 0) {
- test_log("schemas for testGroup line %ld is missing: %s\n",
- xmlGetLineNo(cur), path);
- ret = -1;
- goto done;
- }
- validity = getString(cur,
- "string(ts:expected/@validity)");
- if (validity == NULL) {
- fprintf(stderr, "instanceDocument line %ld misses expected validity\n",
- xmlGetLineNo(cur));
- ret = -1;
- goto done;
- }
- nb_tests++;
- doc = xmlReadFile((const char *) path, NULL, XML_PARSE_NOENT);
- if (doc == NULL) {
- fprintf(stderr, "instance %s fails to parse\n", path);
- ret = -1;
- nb_errors++;
- goto done;
- }
-
- ctxt = xmlSchemaNewValidCtxt(schemas);
- xmlSchemaSetValidErrors(ctxt,
- (xmlSchemaValidityErrorFunc) testErrorHandler,
- (xmlSchemaValidityWarningFunc) testErrorHandler,
- ctxt);
- ret = xmlSchemaValidateDoc(ctxt, doc);
-
- if (xmlStrEqual(validity, BAD_CAST "valid")) {
- if (ret > 0) {
- test_log("valid instance %s failed to validate against %s\n",
- path, spath);
- nb_errors++;
- } else if (ret < 0) {
- test_log("valid instance %s got internal error validating %s\n",
- path, spath);
- nb_internals++;
- nb_errors++;
- }
- } else if (xmlStrEqual(validity, BAD_CAST "invalid")) {
- if (ret == 0) {
- test_log("Failed to detect invalid instance %s against %s\n",
- path, spath);
- nb_errors++;
- }
- } else {
- test_log("instanceDocument line %ld has unexpected validity value%s\n",
- xmlGetLineNo(cur), validity);
- ret = -1;
- goto done;
- }
-
-done:
- if (href != NULL) xmlFree(href);
- if (path != NULL) xmlFree(path);
- if (validity != NULL) xmlFree(validity);
- if (ctxt != NULL) xmlSchemaFreeValidCtxt(ctxt);
- if (doc != NULL) xmlFreeDoc(doc);
- xmlResetLastError();
- if (mem != xmlMemUsed()) {
- test_log("Validation of tests starting line %ld leaked %d\n",
- xmlGetLineNo(cur), xmlMemUsed() - mem);
- nb_leaks++;
- }
- return(ret);
-}
-
-static int
-xstcTestGroup(xmlNodePtr cur, const char *base) {
- xmlChar *href = NULL;
- xmlChar *path = NULL;
- xmlChar *validity = NULL;
- xmlSchemaPtr schemas = NULL;
- xmlSchemaParserCtxtPtr ctxt;
- xmlNodePtr instance;
- int ret = 0, mem;
-
- xmlResetLastError();
- testErrorsSize = 0; testErrors[0] = 0;
- mem = xmlMemUsed();
- href = getString(cur,
- "string(ts:schemaTest/ts:schemaDocument/@xlink:href)");
- if ((href == NULL) || (href[0] == 0)) {
- test_log("testGroup line %ld misses href for schemaDocument\n",
- xmlGetLineNo(cur));
- ret = -1;
- goto done;
- }
- path = xmlBuildURI(href, BAD_CAST base);
- if (path == NULL) {
- test_log("Failed to build path to schemas testGroup line %ld : %s\n",
- xmlGetLineNo(cur), href);
- ret = -1;
- goto done;
- }
- if (checkTestFile((const char *) path) <= 0) {
- test_log("schemas for testGroup line %ld is missing: %s\n",
- xmlGetLineNo(cur), path);
- ret = -1;
- goto done;
- }
- validity = getString(cur,
- "string(ts:schemaTest/ts:expected/@validity)");
- if (validity == NULL) {
- test_log("testGroup line %ld misses expected validity\n",
- xmlGetLineNo(cur));
- ret = -1;
- goto done;
- }
- nb_tests++;
- if (xmlStrEqual(validity, BAD_CAST "valid")) {
- nb_schematas++;
- ctxt = xmlSchemaNewParserCtxt((const char *) path);
- xmlSchemaSetParserErrors(ctxt,
- (xmlSchemaValidityErrorFunc) testErrorHandler,
- (xmlSchemaValidityWarningFunc) testErrorHandler,
- ctxt);
- schemas = xmlSchemaParse(ctxt);
- xmlSchemaFreeParserCtxt(ctxt);
- if (schemas == NULL) {
- test_log("valid schemas %s failed to parse\n",
- path);
- ret = 1;
- nb_errors++;
- }
- if ((ret == 0) && (strstr(testErrors, "nimplemented") != NULL)) {
- test_log("valid schemas %s hit an unimplemented block\n",
- path);
- ret = 1;
- nb_unimplemented++;
- nb_errors++;
- }
- instance = getNext(cur, "./ts:instanceTest[1]");
- while (instance != NULL) {
- if (schemas != NULL) {
- xstcTestInstance(instance, schemas, path, base);
- } else {
- /*
- * We'll automatically mark the instances as failed
- * if the schema was broken.
- */
- nb_errors++;
- }
- instance = getNext(instance,
- "following-sibling::ts:instanceTest[1]");
- }
- } else if (xmlStrEqual(validity, BAD_CAST "invalid")) {
- nb_schematas++;
- ctxt = xmlSchemaNewParserCtxt((const char *) path);
- xmlSchemaSetParserErrors(ctxt,
- (xmlSchemaValidityErrorFunc) testErrorHandler,
- (xmlSchemaValidityWarningFunc) testErrorHandler,
- ctxt);
- schemas = xmlSchemaParse(ctxt);
- xmlSchemaFreeParserCtxt(ctxt);
- if (schemas != NULL) {
- test_log("Failed to detect error in schemas %s\n",
- path);
- nb_errors++;
- ret = 1;
- }
- if ((ret == 0) && (strstr(testErrors, "nimplemented") != NULL)) {
- nb_unimplemented++;
- test_log("invalid schemas %s hit an unimplemented block\n",
- path);
- ret = 1;
- nb_errors++;
- }
- } else {
- test_log("testGroup line %ld misses unexpected validity value%s\n",
- xmlGetLineNo(cur), validity);
- ret = -1;
- goto done;
- }
-
-done:
- if (href != NULL) xmlFree(href);
- if (path != NULL) xmlFree(path);
- if (validity != NULL) xmlFree(validity);
- if (schemas != NULL) xmlSchemaFree(schemas);
- xmlResetLastError();
- if ((mem != xmlMemUsed()) && (extraMemoryFromResolver == 0)) {
- test_log("Processing test line %ld %s leaked %d\n",
- xmlGetLineNo(cur), path, xmlMemUsed() - mem);
- nb_leaks++;
- }
- return(ret);
-}
-
-static int
-xstcMetadata(const char *metadata, const char *base) {
- xmlDocPtr doc;
- xmlNodePtr cur;
- xmlChar *contributor;
- xmlChar *name;
- int ret = 0;
-
- doc = xmlReadFile(metadata, NULL, XML_PARSE_NOENT);
- if (doc == NULL) {
- fprintf(stderr, "Failed to parse %s\n", metadata);
- return(-1);
- }
-
- cur = xmlDocGetRootElement(doc);
- if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testSet"))) {
- fprintf(stderr, "Unexpected format %s\n", metadata);
- return(-1);
- }
- contributor = xmlGetProp(cur, BAD_CAST "contributor");
- if (contributor == NULL) {
- contributor = xmlStrdup(BAD_CAST "Unknown");
- }
- name = xmlGetProp(cur, BAD_CAST "name");
- if (name == NULL) {
- name = xmlStrdup(BAD_CAST "Unknown");
- }
- printf("## %s test suite for Schemas version %s\n", contributor, name);
- xmlFree(contributor);
- xmlFree(name);
-
- cur = getNext(cur, "./ts:testGroup[1]");
- if ((cur == NULL) || (!xmlStrEqual(cur->name, BAD_CAST "testGroup"))) {
- fprintf(stderr, "Unexpected format %s\n", metadata);
- ret = -1;
- goto done;
- }
- while (cur != NULL) {
- xstcTestGroup(cur, base);
- cur = getNext(cur, "following-sibling::ts:testGroup[1]");
- }
-
-done:
- xmlFreeDoc(doc);
- return(ret);
-}
-
-/************************************************************************
- * *
- * The driver for the tests *
- * *
- ************************************************************************/
-
-int
-main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
- int ret = 0;
- int old_errors, old_tests, old_leaks;
-
- logfile = fopen(LOGFILE, "w");
- if (logfile == NULL) {
- fprintf(stderr,
- "Could not open the log file, running in verbose mode\n");
- verbose = 1;
- }
- initializeLibxml2();
-
- if ((argc >= 2) && (!strcmp(argv[1], "-v")))
- verbose = 1;
-
-
- old_errors = nb_errors;
- old_tests = nb_tests;
- old_leaks = nb_leaks;
- xsdTest();
- if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
- printf("Ran %d tests, no errors\n", nb_tests - old_tests);
- else
- printf("Ran %d tests, %d errors, %d leaks\n",
- nb_tests - old_tests,
- nb_errors - old_errors,
- nb_leaks - old_leaks);
- old_errors = nb_errors;
- old_tests = nb_tests;
- old_leaks = nb_leaks;
- rngTest1();
- if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
- printf("Ran %d tests, no errors\n", nb_tests - old_tests);
- else
- printf("Ran %d tests, %d errors, %d leaks\n",
- nb_tests - old_tests,
- nb_errors - old_errors,
- nb_leaks - old_leaks);
- old_errors = nb_errors;
- old_tests = nb_tests;
- old_leaks = nb_leaks;
- rngTest2();
- if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
- printf("Ran %d tests, no errors\n", nb_tests - old_tests);
- else
- printf("Ran %d tests, %d errors, %d leaks\n",
- nb_tests - old_tests,
- nb_errors - old_errors,
- nb_leaks - old_leaks);
- old_errors = nb_errors;
- old_tests = nb_tests;
- old_leaks = nb_leaks;
- nb_internals = 0;
- nb_schematas = 0;
- xstcMetadata("xstc/Tests/Metadata/NISTXMLSchemaDatatypes.testSet",
- "xstc/Tests/Metadata/");
- if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
- printf("Ran %d tests (%d schemata), no errors\n",
- nb_tests - old_tests, nb_schematas);
- else
- printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
- nb_tests - old_tests,
- nb_schematas,
- nb_errors - old_errors,
- nb_internals,
- nb_leaks - old_leaks);
- old_errors = nb_errors;
- old_tests = nb_tests;
- old_leaks = nb_leaks;
- nb_internals = 0;
- nb_schematas = 0;
- xstcMetadata("xstc/Tests/Metadata/SunXMLSchema1-0-20020116.testSet",
- "xstc/Tests/");
- if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
- printf("Ran %d tests (%d schemata), no errors\n",
- nb_tests - old_tests, nb_schematas);
- else
- printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
- nb_tests - old_tests,
- nb_schematas,
- nb_errors - old_errors,
- nb_internals,
- nb_leaks - old_leaks);
- old_errors = nb_errors;
- old_tests = nb_tests;
- old_leaks = nb_leaks;
- nb_internals = 0;
- nb_schematas = 0;
- xstcMetadata("xstc/Tests/Metadata/MSXMLSchema1-0-20020116.testSet",
- "xstc/Tests/");
- if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
- printf("Ran %d tests (%d schemata), no errors\n",
- nb_tests - old_tests, nb_schematas);
- else
- printf("Ran %d tests (%d schemata), %d errors (%d internals), %d leaks\n",
- nb_tests - old_tests,
- nb_schematas,
- nb_errors - old_errors,
- nb_internals,
- nb_leaks - old_leaks);
-
- if ((nb_errors == 0) && (nb_leaks == 0)) {
- ret = 0;
- printf("Total %d tests, no errors\n",
- nb_tests);
- } else {
- ret = 1;
- printf("Total %d tests, %d errors, %d leaks\n",
- nb_tests, nb_errors, nb_leaks);
- }
- xmlXPathFreeContext(ctxtXPath);
- xmlCleanupParser();
- xmlMemoryDump();
-
- if (logfile != NULL)
- fclose(logfile);
- return(ret);
-}
-#else /* !SCHEMAS */
-int
-main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
- fprintf(stderr, "runsuite requires support for schemas and xpath in libxml2\n");
-}
-#endif
diff --git a/Extras/LibXML/runtest.c b/Extras/LibXML/runtest.c
deleted file mode 100644
index cf0fb63a3..000000000
--- a/Extras/LibXML/runtest.c
+++ /dev/null
@@ -1,4425 +0,0 @@
-/*
- * runtest.c: C program to run libxml2 regression tests without
- * requiring make or Python, and reducing platform dependancies
- * to a strict minimum.
- *
- * To compile on Unixes:
- * cc -o runtest `xml2-config --cflags` runtest.c `xml2-config --libs` -lpthread
- *
- * See Copyright for the status of this software.
- *
- * daniel@veillard.com
- */
-
-#ifdef HAVE_CONFIG_H
-#include "libxml.h"
-#else
-#include
-#endif
-
-#if !defined(_WIN32) || defined(__CYGWIN__)
-#include
-#endif
-#include
-#include
-#include
-#include
-
-#include
-#include
-#include
-
-#ifdef LIBXML_OUTPUT_ENABLED
-#ifdef LIBXML_READER_ENABLED
-#include
-#endif
-
-#ifdef LIBXML_XINCLUDE_ENABLED
-#include
-#endif
-
-#ifdef LIBXML_XPATH_ENABLED
-#include
-#include
-#ifdef LIBXML_XPTR_ENABLED
-#include
-#endif
-#endif
-
-#ifdef LIBXML_SCHEMAS_ENABLED
-#include
-#include
-#include
-#endif
-
-#ifdef LIBXML_PATTERN_ENABLED
-#include
-#endif
-
-#ifdef LIBXML_C14N_ENABLED
-#include
-#endif
-
-#ifdef LIBXML_HTML_ENABLED
-#include
-#include
-
-/*
- * pseudo flag for the unification of HTML and XML tests
- */
-#define XML_PARSE_HTML 1 << 24
-#endif
-
-#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED)
-#include
-#include
-#include
-#include
-#include
-#endif
-
-/*
- * O_BINARY is just for Windows compatibility - if it isn't defined
- * on this system, avoid any compilation error
- */
-#ifdef O_BINARY
-#define RD_FLAGS O_RDONLY | O_BINARY
-#else
-#define RD_FLAGS O_RDONLY
-#endif
-
-typedef int (*functest) (const char *filename, const char *result,
- const char *error, int options);
-
-typedef struct testDesc testDesc;
-typedef testDesc *testDescPtr;
-struct testDesc {
- const char *desc; /* descripton of the test */
- functest func; /* function implementing the test */
- const char *in; /* glob to path for input files */
- const char *out; /* output directory */
- const char *suffix;/* suffix for output files */
- const char *err; /* suffix for error output files */
- int options; /* parser options for the test */
-};
-
-static int checkTestFile(const char *filename);
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
-
-#include
-#include
-
-typedef struct
-{
- size_t gl_pathc; /* Count of paths matched so far */
- char **gl_pathv; /* List of matched pathnames. */
- size_t gl_offs; /* Slots to reserve in 'gl_pathv'. */
-} glob_t;
-
-#define GLOB_DOOFFS 0
-static int glob(const char *pattern, int flags,
- int errfunc(const char *epath, int eerrno),
- glob_t *pglob) {
- glob_t *ret;
- WIN32_FIND_DATA FindFileData;
- HANDLE hFind;
- unsigned int nb_paths = 0;
- char directory[500];
- int len;
-
- if ((pattern == NULL) || (pglob == NULL)) return(-1);
-
- strncpy(directory, pattern, 499);
- for (len = strlen(directory);len >= 0;len--) {
- if (directory[len] == '/') {
- len++;
- directory[len] = 0;
- break;
- }
- }
- if (len <= 0)
- len = 0;
-
-
- ret = pglob;
- memset(ret, 0, sizeof(glob_t));
-
- hFind = FindFirstFileA(pattern, &FindFileData);
- if (hFind == INVALID_HANDLE_VALUE)
- return(0);
- nb_paths = 20;
- ret->gl_pathv = (char **) malloc(nb_paths * sizeof(char *));
- if (ret->gl_pathv == NULL) {
- FindClose(hFind);
- return(-1);
- }
- strncpy(directory + len, FindFileData.cFileName, 499 - len);
- ret->gl_pathv[ret->gl_pathc] = strdup(directory);
- if (ret->gl_pathv[ret->gl_pathc] == NULL)
- goto done;
- ret->gl_pathc++;
- while(FindNextFileA(hFind, &FindFileData)) {
- if (FindFileData.cFileName[0] == '.')
- continue;
- if (ret->gl_pathc + 2 > nb_paths) {
- char **tmp = realloc(ret->gl_pathv, nb_paths * 2 * sizeof(char *));
- if (tmp == NULL)
- break;
- ret->gl_pathv = tmp;
- nb_paths *= 2;
- }
- strncpy(directory + len, FindFileData.cFileName, 499 - len);
- ret->gl_pathv[ret->gl_pathc] = strdup(directory);
- if (ret->gl_pathv[ret->gl_pathc] == NULL)
- break;
- ret->gl_pathc++;
- }
- ret->gl_pathv[ret->gl_pathc] = NULL;
-
-done:
- FindClose(hFind);
- return(0);
-}
-
-
-
-static void globfree(glob_t *pglob) {
- unsigned int i;
- if (pglob == NULL)
- return;
-
- for (i = 0;i < pglob->gl_pathc;i++) {
- if (pglob->gl_pathv[i] != NULL)
- free(pglob->gl_pathv[i]);
- }
-}
-#define vsnprintf _vsnprintf
-#define snprintf _snprintf
-#else
-#include
-#endif
-
-/************************************************************************
- * *
- * Libxml2 specific routines *
- * *
- ************************************************************************/
-
-static int nb_tests = 0;
-static int nb_errors = 0;
-static int nb_leaks = 0;
-static int extraMemoryFromResolver = 0;
-
-static int
-fatalError(void) {
- fprintf(stderr, "Exitting tests on fatal error\n");
- exit(1);
-}
-
-/*
- * We need to trap calls to the resolver to not account memory for the catalog
- * which is shared to the current running test. We also don't want to have
- * network downloads modifying tests.
- */
-static xmlParserInputPtr
-testExternalEntityLoader(const char *URL, const char *ID,
- xmlParserCtxtPtr ctxt) {
- xmlParserInputPtr ret;
-
- if (checkTestFile(URL)) {
- ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
- } else {
- int memused = xmlMemUsed();
- ret = xmlNoNetExternalEntityLoader(URL, ID, ctxt);
- extraMemoryFromResolver += xmlMemUsed() - memused;
- }
-
- return(ret);
-}
-
-/*
- * Trapping the error messages at the generic level to grab the equivalent of
- * stderr messages on CLI tools.
- */
-static char testErrors[32769];
-static int testErrorsSize = 0;
-
-static void XMLCDECL
-testErrorHandler(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) {
- va_list args;
- int res;
-
- if (testErrorsSize >= 32768)
- return;
- va_start(args, msg);
- res = vsnprintf(&testErrors[testErrorsSize],
- 32768 - testErrorsSize,
- msg, args);
- va_end(args);
- if (testErrorsSize + res >= 32768) {
- /* buffer is full */
- testErrorsSize = 32768;
- testErrors[testErrorsSize] = 0;
- } else {
- testErrorsSize += res;
- }
- testErrors[testErrorsSize] = 0;
-}
-
-static void XMLCDECL
-channel(void *ctx ATTRIBUTE_UNUSED, const char *msg, ...) {
- va_list args;
- int res;
-
- if (testErrorsSize >= 32768)
- return;
- va_start(args, msg);
- res = vsnprintf(&testErrors[testErrorsSize],
- 32768 - testErrorsSize,
- msg, args);
- va_end(args);
- if (testErrorsSize + res >= 32768) {
- /* buffer is full */
- testErrorsSize = 32768;
- testErrors[testErrorsSize] = 0;
- } else {
- testErrorsSize += res;
- }
- testErrors[testErrorsSize] = 0;
-}
-
-/**
- * xmlParserPrintFileContext:
- * @input: an xmlParserInputPtr input
- *
- * Displays current context within the input content for error tracking
- */
-
-static void
-xmlParserPrintFileContextInternal(xmlParserInputPtr input ,
- xmlGenericErrorFunc chanl, void *data ) {
- const xmlChar *cur, *base;
- unsigned int n, col; /* GCC warns if signed, because compared with sizeof() */
- xmlChar content[81]; /* space for 80 chars + line terminator */
- xmlChar *ctnt;
-
- if (input == NULL) return;
- cur = input->cur;
- base = input->base;
- /* skip backwards over any end-of-lines */
- while ((cur > base) && ((*(cur) == '\n') || (*(cur) == '\r'))) {
- cur--;
- }
- n = 0;
- /* search backwards for beginning-of-line (to max buff size) */
- while ((n++ < (sizeof(content)-1)) && (cur > base) &&
- (*(cur) != '\n') && (*(cur) != '\r'))
- cur--;
- if ((*(cur) == '\n') || (*(cur) == '\r')) cur++;
- /* calculate the error position in terms of the current position */
- col = input->cur - cur;
- /* search forward for end-of-line (to max buff size) */
- n = 0;
- ctnt = content;
- /* copy selected text to our buffer */
- while ((*cur != 0) && (*(cur) != '\n') &&
- (*(cur) != '\r') && (n < sizeof(content)-1)) {
- *ctnt++ = *cur++;
- n++;
- }
- *ctnt = 0;
- /* print out the selected text */
- chanl(data ,"%s\n", content);
- /* create blank line with problem pointer */
- n = 0;
- ctnt = content;
- /* (leave buffer space for pointer + line terminator) */
- while ((nfile;
- line = err->line;
- code = err->code;
- domain = err->domain;
- level = err->level;
- node = err->node;
- if ((domain == XML_FROM_PARSER) || (domain == XML_FROM_HTML) ||
- (domain == XML_FROM_DTD) || (domain == XML_FROM_NAMESPACE) ||
- (domain == XML_FROM_IO) || (domain == XML_FROM_VALID)) {
- ctxt = err->ctxt;
- }
- str = err->message;
-
- if (code == XML_ERR_OK)
- return;
-
- if ((node != NULL) && (node->type == XML_ELEMENT_NODE))
- name = node->name;
-
- /*
- * Maintain the compatibility with the legacy error handling
- */
- if (ctxt != NULL) {
- input = ctxt->input;
- if ((input != NULL) && (input->filename == NULL) &&
- (ctxt->inputNr > 1)) {
- cur = input;
- input = ctxt->inputTab[ctxt->inputNr - 2];
- }
- if (input != NULL) {
- if (input->filename)
- channel(data, "%s:%d: ", input->filename, input->line);
- else if ((line != 0) && (domain == XML_FROM_PARSER))
- channel(data, "Entity: line %d: ", input->line);
- }
- } else {
- if (file != NULL)
- channel(data, "%s:%d: ", file, line);
- else if ((line != 0) && (domain == XML_FROM_PARSER))
- channel(data, "Entity: line %d: ", line);
- }
- if (name != NULL) {
- channel(data, "element %s: ", name);
- }
- if (code == XML_ERR_OK)
- return;
- switch (domain) {
- case XML_FROM_PARSER:
- channel(data, "parser ");
- break;
- case XML_FROM_NAMESPACE:
- channel(data, "namespace ");
- break;
- case XML_FROM_DTD:
- case XML_FROM_VALID:
- channel(data, "validity ");
- break;
- case XML_FROM_HTML:
- channel(data, "HTML parser ");
- break;
- case XML_FROM_MEMORY:
- channel(data, "memory ");
- break;
- case XML_FROM_OUTPUT:
- channel(data, "output ");
- break;
- case XML_FROM_IO:
- channel(data, "I/O ");
- break;
- case XML_FROM_XINCLUDE:
- channel(data, "XInclude ");
- break;
- case XML_FROM_XPATH:
- channel(data, "XPath ");
- break;
- case XML_FROM_XPOINTER:
- channel(data, "parser ");
- break;
- case XML_FROM_REGEXP:
- channel(data, "regexp ");
- break;
- case XML_FROM_MODULE:
- channel(data, "module ");
- break;
- case XML_FROM_SCHEMASV:
- channel(data, "Schemas validity ");
- break;
- case XML_FROM_SCHEMASP:
- channel(data, "Schemas parser ");
- break;
- case XML_FROM_RELAXNGP:
- channel(data, "Relax-NG parser ");
- break;
- case XML_FROM_RELAXNGV:
- channel(data, "Relax-NG validity ");
- break;
- case XML_FROM_CATALOG:
- channel(data, "Catalog ");
- break;
- case XML_FROM_C14N:
- channel(data, "C14N ");
- break;
- case XML_FROM_XSLT:
- channel(data, "XSLT ");
- break;
- default:
- break;
- }
- if (code == XML_ERR_OK)
- return;
- switch (level) {
- case XML_ERR_NONE:
- channel(data, ": ");
- break;
- case XML_ERR_WARNING:
- channel(data, "warning : ");
- break;
- case XML_ERR_ERROR:
- channel(data, "error : ");
- break;
- case XML_ERR_FATAL:
- channel(data, "error : ");
- break;
- }
- if (code == XML_ERR_OK)
- return;
- if (str != NULL) {
- int len;
- len = xmlStrlen((const xmlChar *)str);
- if ((len > 0) && (str[len - 1] != '\n'))
- channel(data, "%s\n", str);
- else
- channel(data, "%s", str);
- } else {
- channel(data, "%s\n", "out of memory error");
- }
- if (code == XML_ERR_OK)
- return;
-
- if (ctxt != NULL) {
- xmlParserPrintFileContextInternal(input, channel, data);
- if (cur != NULL) {
- if (cur->filename)
- channel(data, "%s:%d: \n", cur->filename, cur->line);
- else if ((line != 0) && (domain == XML_FROM_PARSER))
- channel(data, "Entity: line %d: \n", cur->line);
- xmlParserPrintFileContextInternal(cur, channel, data);
- }
- }
- if ((domain == XML_FROM_XPATH) && (err->str1 != NULL) &&
- (err->int1 < 100) &&
- (err->int1 < xmlStrlen((const xmlChar *)err->str1))) {
- xmlChar buf[150];
- int i;
-
- channel(data, "%s\n", err->str1);
- for (i=0;i < err->int1;i++)
- buf[i] = ' ';
- buf[i++] = '^';
- buf[i] = 0;
- channel(data, "%s\n", buf);
- }
-}
-
-static void
-initializeLibxml2(void) {
- xmlGetWarningsDefaultValue = 0;
- xmlPedanticParserDefault(0);
-
- xmlMemSetup(xmlMemFree, xmlMemMalloc, xmlMemRealloc, xmlMemoryStrdup);
- xmlInitParser();
- xmlSetExternalEntityLoader(testExternalEntityLoader);
- xmlSetStructuredErrorFunc(NULL, testStructuredErrorHandler);
-#ifdef LIBXML_SCHEMAS_ENABLED
- xmlSchemaInitTypes();
- xmlRelaxNGInitTypes();
-#endif
-}
-
-
-/************************************************************************
- * *
- * File name and path utilities *
- * *
- ************************************************************************/
-
-static const char *baseFilename(const char *filename) {
- const char *cur;
- if (filename == NULL)
- return(NULL);
- cur = &filename[strlen(filename)];
- while ((cur > filename) && (*cur != '/'))
- cur--;
- if (*cur == '/')
- return(cur + 1);
- return(cur);
-}
-
-static char *resultFilename(const char *filename, const char *out,
- const char *suffix) {
- const char *base;
- char res[500];
-
-/*************
- if ((filename[0] == 't') && (filename[1] == 'e') &&
- (filename[2] == 's') && (filename[3] == 't') &&
- (filename[4] == '/'))
- filename = &filename[5];
- *************/
-
- base = baseFilename(filename);
- if (suffix == NULL)
- suffix = ".tmp";
- if (out == NULL)
- out = "";
- snprintf(res, 499, "%s%s%s", out, base, suffix);
- res[499] = 0;
- return(strdup(res));
-}
-
-static int checkTestFile(const char *filename) {
- struct stat buf;
-
- if (stat(filename, &buf) == -1)
- return(0);
-
-#if defined(_WIN32) && !defined(__CYGWIN__)
- if (!(buf.st_mode & _S_IFREG))
- return(0);
-#else
- if (!S_ISREG(buf.st_mode))
- return(0);
-#endif
-
- return(1);
-}
-
-static int compareFiles(const char *r1, const char *r2) {
- int res1, res2;
- int fd1, fd2;
- char bytes1[4096];
- char bytes2[4096];
-
- fd1 = open(r1, RD_FLAGS);
- if (fd1 < 0)
- return(-1);
- fd2 = open(r2, RD_FLAGS);
- if (fd2 < 0) {
- close(fd1);
- return(-1);
- }
- while (1) {
- res1 = read(fd1, bytes1, 4096);
- res2 = read(fd2, bytes2, 4096);
- if ((res1 != res2) || (res1 < 0)) {
- close(fd1);
- close(fd2);
- return(1);
- }
- if (res1 == 0)
- break;
- if (memcmp(bytes1, bytes2, res1) != 0) {
- close(fd1);
- close(fd2);
- return(1);
- }
- }
- close(fd1);
- close(fd2);
- return(0);
-}
-
-static int compareFileMem(const char *filename, const char *mem, int size) {
- int res;
- int fd;
- char bytes[4096];
- int idx = 0;
- struct stat info;
-
- if (stat(filename, &info) < 0)
- return(-1);
- if (info.st_size != size)
- return(-1);
- fd = open(filename, RD_FLAGS);
- if (fd < 0)
- return(-1);
- while (idx < size) {
- res = read(fd, bytes, 4096);
- if (res <= 0)
- break;
- if (res + idx > size)
- break;
- if (memcmp(bytes, &mem[idx], res) != 0) {
- int ix;
- for (ix=0; ix 0) {
- siz += res;
- }
- close(fd);
-#if !defined(_WIN32)
- if (siz != info.st_size) {
- free(base);
- return(-1);
- }
-#endif
- base[siz] = 0;
- *mem = base;
- *size = siz;
- return(0);
-}
-
-static int unloadMem(const char *mem) {
- free((char *)mem);
- return(0);
-}
-
-/************************************************************************
- * *
- * Tests implementations *
- * *
- ************************************************************************/
-
-/************************************************************************
- * *
- * Parse to SAX based tests *
- * *
- ************************************************************************/
-
-static FILE *SAXdebug = NULL;
-
-/*
- * 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; */
- 1,
- NULL,
- NULL, /* startElementNs */
- NULL, /* endElementNs */
- NULL /* xmlStructuredErrorFunc */
-};
-
-static xmlSAXHandlerPtr emptySAXHandler = &emptySAXHandlerStruct;
-static int callbacks = 0;
-static int quiet = 0;
-
-/**
- * isStandaloneDebug:
- * @ctxt: An XML parser context
- *
- * Is this document tagged standalone ?
- *
- * Returns 1 if true
- */
-static int
-isStandaloneDebug(void *ctx ATTRIBUTE_UNUSED)
-{
- callbacks++;
- if (quiet)
- return(0);
- fprintf(SAXdebug, "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 (quiet)
- return(0);
- fprintf(SAXdebug, "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 (quiet)
- return(0);
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "SAX.internalSubset(%s,", name);
- if (ExternalID == NULL)
- fprintf(SAXdebug, " ,");
- else
- fprintf(SAXdebug, " %s,", ExternalID);
- if (SystemID == NULL)
- fprintf(SAXdebug, " )\n");
- else
- fprintf(SAXdebug, " %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 (quiet)
- return;
- fprintf(SAXdebug, "SAX.externalSubset(%s,", name);
- if (ExternalID == NULL)
- fprintf(SAXdebug, " ,");
- else
- fprintf(SAXdebug, " %s,", ExternalID);
- if (SystemID == NULL)
- fprintf(SAXdebug, " )\n");
- else
- fprintf(SAXdebug, " %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 (quiet)
- return(NULL);
- /* xmlParserCtxtPtr ctxt = (xmlParserCtxtPtr) ctx; */
-
-
- fprintf(SAXdebug, "SAX.resolveEntity(");
- if (publicId != NULL)
- fprintf(SAXdebug, "%s", (char *)publicId);
- else
- fprintf(SAXdebug, " ");
- if (systemId != NULL)
- fprintf(SAXdebug, ", %s)\n", (char *)systemId);
- else
- fprintf(SAXdebug, ", )\n");
-/*********
- if (systemId != NULL) {
- return(xmlNewInputFromFile(ctxt, (char *) systemId));
- }
- *********/
- 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 (quiet)
- return(NULL);
- fprintf(SAXdebug, "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 (quiet)
- return(NULL);
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "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 (quiet)
- return;
- if (defaultValue == NULL)
- fprintf(SAXdebug, "SAX.attributeDecl(%s, %s, %d, %d, NULL, ...)\n",
- elem, name, type, def);
- else
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "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 (quiet)
- return;
- fprintf(SAXdebug, "SAX.startElement(%s", (char *) name);
- if (atts != NULL) {
- for (i = 0;(atts[i] != NULL);i++) {
- fprintf(SAXdebug, ", %s='", atts[i++]);
- if (atts[i] != NULL)
- fprintf(SAXdebug, "%s'", atts[i]);
- }
- }
- fprintf(SAXdebug, ")\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 (quiet)
- return;
- fprintf(SAXdebug, "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 output[40];
- int i;
-
- callbacks++;
- if (quiet)
- return;
- for (i = 0;(i 0) {
- outlen = sizeof output - 1;
- htmlEncodeEntities(output, &outlen, att, &attlen, '\'');
- output[outlen] = 0;
- fprintf(SAXdebug, "%s", (char *) output);
- att += attlen;
- }
- fprintf(SAXdebug, "'");
- }
- }
- }
- fprintf(SAXdebug, ")\n");
-}
-
-/**
- * htmlcharactersDebug:
- * @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
-htmlcharactersDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
-{
- unsigned char output[40];
- int inlen = len, outlen = 30;
-
- htmlEncodeEntities(output, &outlen, ch, &inlen, 0);
- output[outlen] = 0;
-
- fprintf(SAXdebug, "SAX.characters(%s, %d)\n", output, len);
-}
-
-/**
- * htmlcdataDebug:
- * @ctxt: An XML parser context
- * @ch: a xmlChar string
- * @len: the number of xmlChar
- *
- * receiving some cdata chars from the parser.
- * Question: how much at a time ???
- */
-static void
-htmlcdataDebug(void *ctx ATTRIBUTE_UNUSED, const xmlChar *ch, int len)
-{
- unsigned char output[40];
- int inlen = len, outlen = 30;
-
- htmlEncodeEntities(output, &outlen, ch, &inlen, 0);
- output[outlen] = 0;
-
- fprintf(SAXdebug, "SAX.cdata(%s, %d)\n", output, len);
-}
-
-static xmlSAXHandler debugHTMLSAXHandlerStruct = {
- internalSubsetDebug,
- isStandaloneDebug,
- hasInternalSubsetDebug,
- hasExternalSubsetDebug,
- resolveEntityDebug,
- getEntityDebug,
- entityDeclDebug,
- notationDeclDebug,
- attributeDeclDebug,
- elementDeclDebug,
- unparsedEntityDeclDebug,
- setDocumentLocatorDebug,
- startDocumentDebug,
- endDocumentDebug,
- htmlstartElementDebug,
- endElementDebug,
- referenceDebug,
- htmlcharactersDebug,
- ignorableWhitespaceDebug,
- processingInstructionDebug,
- commentDebug,
- warningDebug,
- errorDebug,
- fatalErrorDebug,
- getParameterEntityDebug,
- htmlcdataDebug,
- externalSubsetDebug,
- 1,
- NULL,
- NULL,
- NULL,
- NULL
-};
-
-static xmlSAXHandlerPtr debugHTMLSAXHandler = &debugHTMLSAXHandlerStruct;
-#endif /* LIBXML_HTML_ENABLED */
-
-#ifdef LIBXML_SAX1_ENABLED
-/**
- * saxParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file using the SAX API and check for errors.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-saxParseTest(const char *filename, const char *result,
- const char *err ATTRIBUTE_UNUSED,
- int options) {
- int ret;
- char *temp;
-
- nb_tests++;
- temp = resultFilename(filename, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "out of memory\n");
- fatalError();
- }
- SAXdebug = fopen(temp, "wb");
- if (SAXdebug == NULL) {
- fprintf(stderr, "Failed to write to %s\n", temp);
- free(temp);
- return(-1);
- }
-
- /* for SAX we really want the callbacks though the context handlers */
- xmlSetStructuredErrorFunc(NULL, NULL);
- xmlSetGenericErrorFunc(NULL, testErrorHandler);
-
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML) {
- htmlSAXParseFile(filename, NULL, emptySAXHandler, NULL);
- ret = 0;
- } else
-#endif
- ret = xmlSAXUserParseFile(emptySAXHandler, NULL, filename);
- if (ret == XML_WAR_UNDECLARED_ENTITY) {
- fprintf(SAXdebug, "xmlSAXUserParseFile returned error %d\n", ret);
- ret = 0;
- }
- if (ret != 0) {
- fprintf(stderr, "Failed to parse %s\n", filename);
- return(1);
- }
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML) {
- htmlSAXParseFile(filename, NULL, debugHTMLSAXHandler, NULL);
- ret = 0;
- } else
-#endif
- if (options & XML_PARSE_SAX1) {
- ret = xmlSAXUserParseFile(debugSAXHandler, NULL, filename);
- } else {
- ret = xmlSAXUserParseFile(debugSAX2Handler, NULL, filename);
- }
- if (ret == XML_WAR_UNDECLARED_ENTITY) {
- fprintf(SAXdebug, "xmlSAXUserParseFile returned error %d\n", ret);
- ret = 0;
- }
- fclose(SAXdebug);
- if (compareFiles(temp, result)) {
- fprintf(stderr, "Got a difference for %s\n", filename);
- ret = 1;
- } else
- unlink(temp);
- free(temp);
-
- /* switch back to structured error handling */
- xmlSetGenericErrorFunc(NULL, NULL);
- xmlSetStructuredErrorFunc(NULL, testStructuredErrorHandler);
-
- return(ret);
-}
-#endif
-
-/************************************************************************
- * *
- * Parse to tree based tests *
- * *
- ************************************************************************/
-/**
- * oldParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages: unused
- *
- * Parse a file using the old xmlParseFile API, then serialize back
- * reparse the result and serialize again, then check for deviation
- * in serialization.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-oldParseTest(const char *filename, const char *result,
- const char *err ATTRIBUTE_UNUSED,
- int options ATTRIBUTE_UNUSED) {
- xmlDocPtr doc;
- char *temp;
- int res = 0;
-
- nb_tests++;
- /*
- * base of the test, parse with the old API
- */
-#ifdef LIBXML_SAX1_ENABLED
- doc = xmlParseFile(filename);
-#else
- doc = xmlReadFile(filename, NULL, 0);
-#endif
- if (doc == NULL)
- return(1);
- temp = resultFilename(filename, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "out of memory\n");
- fatalError();
- }
- xmlSaveFile(temp, doc);
- if (compareFiles(temp, result)) {
- res = 1;
- }
- xmlFreeDoc(doc);
-
- /*
- * Parse the saved result to make sure the round trip is okay
- */
-#ifdef LIBXML_SAX1_ENABLED
- doc = xmlParseFile(temp);
-#else
- doc = xmlReadFile(temp, NULL, 0);
-#endif
- if (doc == NULL)
- return(1);
- xmlSaveFile(temp, doc);
- if (compareFiles(temp, result)) {
- res = 1;
- }
- xmlFreeDoc(doc);
-
- unlink(temp);
- free(temp);
- return(res);
-}
-
-#ifdef LIBXML_PUSH_ENABLED
-/**
- * pushParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages: unused
- *
- * Parse a file using the Push API, then serialize back
- * to check for content.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-pushParseTest(const char *filename, const char *result,
- const char *err ATTRIBUTE_UNUSED,
- int options) {
- xmlParserCtxtPtr ctxt;
- xmlDocPtr doc;
- const char *base;
- int size, res;
- int cur = 0;
-
- nb_tests++;
- /*
- * load the document in memory and work from there.
- */
- if (loadMem(filename, &base, &size) != 0) {
- fprintf(stderr, "Failed to load %s\n", filename);
- return(-1);
- }
-
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML)
- ctxt = htmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename,
- XML_CHAR_ENCODING_NONE);
- else
-#endif
- ctxt = xmlCreatePushParserCtxt(NULL, NULL, base + cur, 4, filename);
- xmlCtxtUseOptions(ctxt, options);
- cur += 4;
- while (cur < size) {
- if (cur + 1024 >= size) {
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML)
- htmlParseChunk(ctxt, base + cur, size - cur, 1);
- else
-#endif
- xmlParseChunk(ctxt, base + cur, size - cur, 1);
- break;
- } else {
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML)
- htmlParseChunk(ctxt, base + cur, 1024, 0);
- else
-#endif
- xmlParseChunk(ctxt, base + cur, 1024, 0);
- cur += 1024;
- }
- }
- doc = ctxt->myDoc;
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML)
- res = 1;
- else
-#endif
- res = ctxt->wellFormed;
- xmlFreeParserCtxt(ctxt);
- free((char *)base);
- if (!res) {
- xmlFreeDoc(doc);
- fprintf(stderr, "Failed to parse %s\n", filename);
- return(-1);
- }
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML)
- htmlDocDumpMemory(doc, (xmlChar **) &base, &size);
- else
-#endif
- xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
- xmlFreeDoc(doc);
- res = compareFileMem(result, base, size);
- if ((base == NULL) || (res != 0)) {
- if (base != NULL)
- xmlFree((char *)base);
- fprintf(stderr, "Result for %s failed\n", filename);
- return(-1);
- }
- xmlFree((char *)base);
- if (err != NULL) {
- res = compareFileMem(err, testErrors, testErrorsSize);
- if (res != 0) {
- fprintf(stderr, "Error for %s failed\n", filename);
- return(-1);
- }
- }
- return(0);
-}
-#endif
-
-/**
- * memParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages: unused
- *
- * Parse a file using the old xmlReadMemory API, then serialize back
- * reparse the result and serialize again, then check for deviation
- * in serialization.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-memParseTest(const char *filename, const char *result,
- const char *err ATTRIBUTE_UNUSED,
- int options ATTRIBUTE_UNUSED) {
- xmlDocPtr doc;
- const char *base;
- int size, res;
-
- nb_tests++;
- /*
- * load and parse the memory
- */
- if (loadMem(filename, &base, &size) != 0) {
- fprintf(stderr, "Failed to load %s\n", filename);
- return(-1);
- }
-
- doc = xmlReadMemory(base, size, filename, NULL, 0);
- unloadMem(base);
- if (doc == NULL) {
- return(1);
- }
- xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
- xmlFreeDoc(doc);
- res = compareFileMem(result, base, size);
- if ((base == NULL) || (res != 0)) {
- if (base != NULL)
- xmlFree((char *)base);
- fprintf(stderr, "Result for %s failed\n", filename);
- return(-1);
- }
- xmlFree((char *)base);
- return(0);
-}
-
-/**
- * noentParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages: unused
- *
- * Parse a file with entity resolution, then serialize back
- * reparse the result and serialize again, then check for deviation
- * in serialization.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-noentParseTest(const char *filename, const char *result,
- const char *err ATTRIBUTE_UNUSED,
- int options) {
- xmlDocPtr doc;
- char *temp;
- int res = 0;
-
- nb_tests++;
- /*
- * base of the test, parse with the old API
- */
- doc = xmlReadFile(filename, NULL, options);
- if (doc == NULL)
- return(1);
- temp = resultFilename(filename, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "Out of memory\n");
- fatalError();
- }
- xmlSaveFile(temp, doc);
- if (compareFiles(temp, result)) {
- res = 1;
- }
- xmlFreeDoc(doc);
-
- /*
- * Parse the saved result to make sure the round trip is okay
- */
- doc = xmlReadFile(filename, NULL, options);
- if (doc == NULL)
- return(1);
- xmlSaveFile(temp, doc);
- if (compareFiles(temp, result)) {
- res = 1;
- }
- xmlFreeDoc(doc);
-
- unlink(temp);
- free(temp);
- return(res);
-}
-
-/**
- * errParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file using the xmlReadFile API and check for errors.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-errParseTest(const char *filename, const char *result, const char *err,
- int options) {
- xmlDocPtr doc;
- const char *base = NULL;
- int size, res = 0;
-
- nb_tests++;
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML) {
- doc = htmlReadFile(filename, NULL, options);
- } else
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
- if (options & XML_PARSE_XINCLUDE) {
- doc = xmlReadFile(filename, NULL, options);
- xmlXIncludeProcessFlags(doc, options);
- } else
-#endif
- {
- xmlGetWarningsDefaultValue = 1;
- doc = xmlReadFile(filename, NULL, options);
- }
- xmlGetWarningsDefaultValue = 0;
- if (result) {
- if (doc == NULL) {
- base = "";
- size = 0;
- } else {
-#ifdef LIBXML_HTML_ENABLED
- if (options & XML_PARSE_HTML) {
- htmlDocDumpMemory(doc, (xmlChar **) &base, &size);
- } else
-#endif
- xmlDocDumpMemory(doc, (xmlChar **) &base, &size);
- }
- res = compareFileMem(result, base, size);
- }
- if (doc != NULL) {
- if (base != NULL)
- xmlFree((char *)base);
- xmlFreeDoc(doc);
- }
- if (res != 0) {
- fprintf(stderr, "Result for %s failed\n", filename);
- return(-1);
- }
- if (err != NULL) {
- res = compareFileMem(err, testErrors, testErrorsSize);
- if (res != 0) {
- fprintf(stderr, "Error for %s failed\n", filename);
- return(-1);
- }
- } else if (options & XML_PARSE_DTDVALID) {
- if (testErrorsSize != 0)
- fprintf(stderr, "Validation for %s failed\n", filename);
- }
-
- return(0);
-}
-
-#ifdef LIBXML_READER_ENABLED
-/************************************************************************
- * *
- * Reader based tests *
- * *
- ************************************************************************/
-
-static void processNode(FILE *out, xmlTextReaderPtr reader) {
- const xmlChar *name, *value;
- int type, empty;
-
- type = xmlTextReaderNodeType(reader);
- empty = xmlTextReaderIsEmptyElement(reader);
-
- name = xmlTextReaderConstName(reader);
- if (name == NULL)
- name = BAD_CAST "--";
-
- value = xmlTextReaderConstValue(reader);
-
-
- fprintf(out, "%d %d %s %d %d",
- xmlTextReaderDepth(reader),
- type,
- name,
- empty,
- xmlTextReaderHasValue(reader));
- if (value == NULL)
- fprintf(out, "\n");
- else {
- fprintf(out, " %s\n", value);
- }
-}
-static int
-streamProcessTest(const char *filename, const char *result, const char *err,
- xmlTextReaderPtr reader, const char *rng) {
- int ret;
- char *temp = NULL;
- FILE *t = NULL;
-
- if (reader == NULL)
- return(-1);
-
- nb_tests++;
- if (result != NULL) {
- temp = resultFilename(filename, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "Out of memory\n");
- fatalError();
- }
- t = fopen(temp, "wb");
- if (t == NULL) {
- fprintf(stderr, "Can't open temp file %s\n", temp);
- free(temp);
- return(-1);
- }
- }
-#ifdef LIBXML_SCHEMAS_ENABLED
- if (rng != NULL) {
- ret = xmlTextReaderRelaxNGValidate(reader, rng);
- if (ret < 0) {
- testErrorHandler(NULL, "Relax-NG schema %s failed to compile\n",
- rng);
- fclose(t);
- unlink(temp);
- free(temp);
- return(0);
- }
- }
-#endif
- xmlGetWarningsDefaultValue = 1;
- ret = xmlTextReaderRead(reader);
- while (ret == 1) {
- if ((t != NULL) && (rng == NULL))
- processNode(t, reader);
- ret = xmlTextReaderRead(reader);
- }
- if (ret != 0) {
- testErrorHandler(NULL, "%s : failed to parse\n", filename);
- }
- if (rng != NULL) {
- if (xmlTextReaderIsValid(reader) != 1) {
- testErrorHandler(NULL, "%s fails to validate\n", filename);
- } else {
- testErrorHandler(NULL, "%s validates\n", filename);
- }
- }
- xmlGetWarningsDefaultValue = 0;
- if (t != NULL) {
- fclose(t);
- ret = compareFiles(temp, result);
- unlink(temp);
- free(temp);
- if (ret) {
- fprintf(stderr, "Result for %s failed\n", filename);
- return(-1);
- }
- }
- if (err != NULL) {
- ret = compareFileMem(err, testErrors, testErrorsSize);
- if (ret != 0) {
- fprintf(stderr, "Error for %s failed\n", filename);
- printf("%s", testErrors);
- return(-1);
- }
- }
-
- return(0);
-}
-
-/**
- * streamParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file using the reader API and check for errors.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-streamParseTest(const char *filename, const char *result, const char *err,
- int options) {
- xmlTextReaderPtr reader;
- int ret;
-
- reader = xmlReaderForFile(filename, NULL, options);
- ret = streamProcessTest(filename, result, err, reader, NULL);
- xmlFreeTextReader(reader);
- return(ret);
-}
-
-/**
- * walkerParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file using the walker, i.e. a reader built from a atree.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-walkerParseTest(const char *filename, const char *result, const char *err,
- int options) {
- xmlDocPtr doc;
- xmlTextReaderPtr reader;
- int ret;
-
- doc = xmlReadFile(filename, NULL, options);
- if (doc == NULL) {
- fprintf(stderr, "Failed to parse %s\n", filename);
- return(-1);
- }
- reader = xmlReaderWalker(doc);
- ret = streamProcessTest(filename, result, err, reader, NULL);
- xmlFreeTextReader(reader);
- xmlFreeDoc(doc);
- return(ret);
-}
-
-/**
- * streamMemParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file using the reader API from memory and check for errors.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-streamMemParseTest(const char *filename, const char *result, const char *err,
- int options) {
- xmlTextReaderPtr reader;
- int ret;
- const char *base;
- int size;
-
- /*
- * load and parse the memory
- */
- if (loadMem(filename, &base, &size) != 0) {
- fprintf(stderr, "Failed to load %s\n", filename);
- return(-1);
- }
- reader = xmlReaderForMemory(base, size, filename, NULL, options);
- ret = streamProcessTest(filename, result, err, reader, NULL);
- free((char *)base);
- xmlFreeTextReader(reader);
- return(ret);
-}
-#endif
-
-#ifdef LIBXML_XPATH_ENABLED
-#ifdef LIBXML_DEBUG_ENABLED
-/************************************************************************
- * *
- * XPath and XPointer based tests *
- * *
- ************************************************************************/
-
-static FILE *xpathOutput;
-static xmlDocPtr xpathDocument;
-
-static void
-testXPath(const char *str, int xptr, int expr) {
- xmlXPathObjectPtr res;
- xmlXPathContextPtr ctxt;
-
- nb_tests++;
-#if defined(LIBXML_XPTR_ENABLED)
- if (xptr) {
- ctxt = xmlXPtrNewContext(xpathDocument, NULL, NULL);
- res = xmlXPtrEval(BAD_CAST str, ctxt);
- } else {
-#endif
- ctxt = xmlXPathNewContext(xpathDocument);
- ctxt->node = xmlDocGetRootElement(xpathDocument);
- if (expr)
- res = xmlXPathEvalExpression(BAD_CAST str, ctxt);
- else {
- /* res = xmlXPathEval(BAD_CAST str, ctxt); */
- xmlXPathCompExprPtr comp;
-
- comp = xmlXPathCompile(BAD_CAST str);
- if (comp != NULL) {
- res = xmlXPathCompiledEval(comp, ctxt);
- xmlXPathFreeCompExpr(comp);
- } else
- res = NULL;
- }
-#if defined(LIBXML_XPTR_ENABLED)
- }
-#endif
- xmlXPathDebugDumpObject(xpathOutput, res, 0);
- xmlXPathFreeObject(res);
- xmlXPathFreeContext(ctxt);
-}
-
-/**
- * xpathExprTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing XPath standalone expressions and evaluate them
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-xpathCommonTest(const char *filename, const char *result,
- int xptr, int expr) {
- FILE *input;
- char expression[5000];
- int len, ret = 0;
- char *temp;
-
- temp = resultFilename(filename, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "Out of memory\n");
- fatalError();
- }
- xpathOutput = fopen(temp, "wb");
- if (xpathOutput == NULL) {
- fprintf(stderr, "failed to open output file %s\n", temp);
- free(temp);
- return(-1);
- }
-
- input = fopen(filename, "rb");
- if (input == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Cannot open %s for reading\n", filename);
- free(temp);
- return(-1);
- }
- while (fgets(expression, 4500, input) != NULL) {
- len = strlen(expression);
- len--;
- while ((len >= 0) &&
- ((expression[len] == '\n') || (expression[len] == '\t') ||
- (expression[len] == '\r') || (expression[len] == ' '))) len--;
- expression[len + 1] = 0;
- if (len >= 0) {
- fprintf(xpathOutput,
- "\n========================\nExpression: %s\n",
- expression) ;
- testXPath(expression, xptr, expr);
- }
- }
-
- fclose(input);
- fclose(xpathOutput);
- if (result != NULL) {
- ret = compareFiles(temp, result);
- if (ret) {
- fprintf(stderr, "Result for %s failed\n", filename);
- }
- }
-
- unlink(temp);
- free(temp);
- return(ret);
-}
-
-/**
- * xpathExprTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing XPath standalone expressions and evaluate them
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-xpathExprTest(const char *filename, const char *result,
- const char *err ATTRIBUTE_UNUSED,
- int options ATTRIBUTE_UNUSED) {
- return(xpathCommonTest(filename, result, 0, 1));
-}
-
-/**
- * xpathDocTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing XPath expressions and evaluate them against
- * a set of corresponding documents.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-xpathDocTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *err ATTRIBUTE_UNUSED,
- int options) {
-
- char pattern[500];
- char result[500];
- glob_t globbuf;
- size_t i;
- int ret = 0, res;
-
- xpathDocument = xmlReadFile(filename, NULL,
- options | XML_PARSE_DTDATTR | XML_PARSE_NOENT);
- if (xpathDocument == NULL) {
- fprintf(stderr, "Failed to load %s\n", filename);
- return(-1);
- }
-
- snprintf(pattern, 499, "./test/XPath/tests/%s*", baseFilename(filename));
- pattern[499] = 0;
- globbuf.gl_offs = 0;
- glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
- for (i = 0;i < globbuf.gl_pathc;i++) {
- snprintf(result, 499, "result/XPath/tests/%s",
- baseFilename(globbuf.gl_pathv[i]));
- res = xpathCommonTest(globbuf.gl_pathv[i], &result[0], 0, 0);
- if (res != 0)
- ret = res;
- }
- globfree(&globbuf);
-
- xmlFreeDoc(xpathDocument);
- return(ret);
-}
-
-#ifdef LIBXML_XPTR_ENABLED
-/**
- * xptrDocTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing XPath expressions and evaluate them against
- * a set of corresponding documents.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-xptrDocTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *err ATTRIBUTE_UNUSED,
- int options) {
-
- char pattern[500];
- char result[500];
- glob_t globbuf;
- size_t i;
- int ret = 0, res;
-
- xpathDocument = xmlReadFile(filename, NULL,
- options | XML_PARSE_DTDATTR | XML_PARSE_NOENT);
- if (xpathDocument == NULL) {
- fprintf(stderr, "Failed to load %s\n", filename);
- return(-1);
- }
-
- snprintf(pattern, 499, "./test/XPath/xptr/%s*", baseFilename(filename));
- pattern[499] = 0;
- globbuf.gl_offs = 0;
- glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
- for (i = 0;i < globbuf.gl_pathc;i++) {
- snprintf(result, 499, "result/XPath/xptr/%s",
- baseFilename(globbuf.gl_pathv[i]));
- res = xpathCommonTest(globbuf.gl_pathv[i], &result[0], 1, 0);
- if (res != 0)
- ret = res;
- }
- globfree(&globbuf);
-
- xmlFreeDoc(xpathDocument);
- return(ret);
-}
-#endif /* LIBXML_XPTR_ENABLED */
-
-/**
- * xmlidDocTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing xml:id and check for errors and verify
- * that XPath queries will work on them as expected.
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-xmlidDocTest(const char *filename,
- const char *result,
- const char *err,
- int options) {
-
- int res = 0;
- int ret = 0;
- char *temp;
-
- xpathDocument = xmlReadFile(filename, NULL,
- options | XML_PARSE_DTDATTR | XML_PARSE_NOENT);
- if (xpathDocument == NULL) {
- fprintf(stderr, "Failed to load %s\n", filename);
- return(-1);
- }
-
- temp = resultFilename(filename, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "Out of memory\n");
- fatalError();
- }
- xpathOutput = fopen(temp, "wb");
- if (xpathOutput == NULL) {
- fprintf(stderr, "failed to open output file %s\n", temp);
- xmlFreeDoc(xpathDocument);
- free(temp);
- return(-1);
- }
-
- testXPath("id('bar')", 0, 0);
-
- fclose(xpathOutput);
- if (result != NULL) {
- ret = compareFiles(temp, result);
- if (ret) {
- fprintf(stderr, "Result for %s failed\n", filename);
- res = 1;
- }
- }
-
- unlink(temp);
- free(temp);
- xmlFreeDoc(xpathDocument);
-
- if (err != NULL) {
- ret = compareFileMem(err, testErrors, testErrorsSize);
- if (ret != 0) {
- fprintf(stderr, "Error for %s failed\n", filename);
- res = 1;
- }
- }
- return(res);
-}
-
-#endif /* LIBXML_DEBUG_ENABLED */
-#endif /* XPATH */
-/************************************************************************
- * *
- * URI based tests *
- * *
- ************************************************************************/
-
-static void
-handleURI(const char *str, const char *base, FILE *o) {
- int ret;
- xmlURIPtr uri;
- xmlChar *res = NULL;
-
- uri = xmlCreateURI();
-
- if (base == NULL) {
- ret = xmlParseURIReference(uri, str);
- if (ret != 0)
- fprintf(o, "%s : error %d\n", str, ret);
- else {
- xmlNormalizeURIPath(uri->path);
- xmlPrintURI(o, uri);
- fprintf(o, "\n");
- }
- } else {
- res = xmlBuildURI((xmlChar *)str, (xmlChar *) base);
- if (res != NULL) {
- fprintf(o, "%s\n", (char *) res);
- }
- else
- fprintf(o, "::ERROR::\n");
- }
- if (res != NULL)
- xmlFree(res);
- xmlFreeURI(uri);
-}
-
-/**
- * uriCommonTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing URI and check for errors
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-uriCommonTest(const char *filename,
- const char *result,
- const char *err,
- const char *base) {
- char *temp;
- FILE *o, *f;
- char str[1024];
- int res = 0, i, ret;
-
- temp = resultFilename(filename, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "Out of memory\n");
- fatalError();
- }
- o = fopen(temp, "wb");
- if (o == NULL) {
- fprintf(stderr, "failed to open output file %s\n", temp);
- free(temp);
- return(-1);
- }
- f = fopen(filename, "rb");
- if (f == NULL) {
- fprintf(stderr, "failed to open input file %s\n", filename);
- fclose(o);
- unlink(temp);
- free(temp);
- return(-1);
- }
-
- while (1) {
- /*
- * read one line in string buffer.
- */
- if (fgets (&str[0], sizeof (str) - 1, f) == NULL)
- break;
-
- /*
- * remove the ending spaces
- */
- i = strlen(str);
- while ((i > 0) &&
- ((str[i - 1] == '\n') || (str[i - 1] == '\r') ||
- (str[i - 1] == ' ') || (str[i - 1] == '\t'))) {
- i--;
- str[i] = 0;
- }
- nb_tests++;
- handleURI(str, base, o);
- }
-
- fclose(f);
- fclose(o);
-
- if (result != NULL) {
- ret = compareFiles(temp, result);
- if (ret) {
- fprintf(stderr, "Result for %s failed\n", filename);
- res = 1;
- }
- }
- if (err != NULL) {
- ret = compareFileMem(err, testErrors, testErrorsSize);
- if (ret != 0) {
- fprintf(stderr, "Error for %s failed\n", filename);
- res = 1;
- }
- }
-
- unlink(temp);
- free(temp);
- return(res);
-}
-
-/**
- * uriParseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing URI and check for errors
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-uriParseTest(const char *filename,
- const char *result,
- const char *err,
- int options ATTRIBUTE_UNUSED) {
- return(uriCommonTest(filename, result, err, NULL));
-}
-
-/**
- * uriBaseTest:
- * @filename: the file to parse
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing URI, compose them against a fixed base and
- * check for errors
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-uriBaseTest(const char *filename,
- const char *result,
- const char *err,
- int options ATTRIBUTE_UNUSED) {
- return(uriCommonTest(filename, result, err,
- "http://foo.com/path/to/index.html?orig#help"));
-}
-
-static int urip_success = 1;
-static int urip_current = 0;
-static const char *urip_testURLs[] = {
- "urip://example.com/a b.html",
- "urip://example.com/a%20b.html",
- "file:///path/to/a b.html",
- "file:///path/to/a%20b.html",
- "/path/to/a b.html",
- "/path/to/a%20b.html",
- "urip://example.com/résumé.html",
- "urip://example.com/test?a=1&b=2%263&c=4#foo",
- NULL
-};
-static const char *urip_rcvsURLs[] = {
- /* it is an URI the strings must be escaped */
- "urip://example.com/a%20b.html",
- /* check that % escaping is not broken */
- "urip://example.com/a%20b.html",
- /* it's an URI path the strings must be escaped */
- "file:///path/to/a%20b.html",
- /* check that % escaping is not broken */
- "file:///path/to/a%20b.html",
- /* this is not an URI, this is a path, so this should not be escaped */
- "/path/to/a b.html",
- /* check that paths with % are not broken */
- "/path/to/a%20b.html",
- /* out of context the encoding can't be guessed byte by byte conversion */
- "urip://example.com/r%E9sum%E9.html",
- /* verify we don't destroy URIs especially the query part */
- "urip://example.com/test?a=1&b=2%263&c=4#foo",
- NULL
-};
-static const char *urip_res = "
";
-static const char *urip_cur = NULL;
-static int urip_rlen;
-
-/**
- * uripMatch:
- * @URI: an URI to test
- *
- * Check for an urip: query
- *
- * Returns 1 if yes and 0 if another Input module should be used
- */
-static int
-uripMatch(const char * URI) {
- if ((URI == NULL) || (!strcmp(URI, "file:///etc/xml/catalog")))
- return(0);
- /* Verify we received the escaped URL */
- if (strcmp(urip_rcvsURLs[urip_current], URI))
- urip_success = 0;
- return(1);
-}
-
-/**
- * uripOpen:
- * @URI: an URI to test
- *
- * Return a pointer to the urip: query handler, in this example simply
- * the urip_current pointer...
- *
- * Returns an Input context or NULL in case or error
- */
-static void *
-uripOpen(const char * URI) {
- if ((URI == NULL) || (!strcmp(URI, "file:///etc/xml/catalog")))
- return(NULL);
- /* Verify we received the escaped URL */
- if (strcmp(urip_rcvsURLs[urip_current], URI))
- urip_success = 0;
- urip_cur = urip_res;
- urip_rlen = strlen(urip_res);
- return((void *) urip_cur);
-}
-
-/**
- * uripClose:
- * @context: the read context
- *
- * Close the urip: query handler
- *
- * Returns 0 or -1 in case of error
- */
-static int
-uripClose(void * context) {
- if (context == NULL) return(-1);
- urip_cur = NULL;
- urip_rlen = 0;
- return(0);
-}
-
-/**
- * uripRead:
- * @context: the read context
- * @buffer: where to store data
- * @len: number of bytes to read
- *
- * Implement an urip: query read.
- *
- * Returns the number of bytes read or -1 in case of error
- */
-static int
-uripRead(void * context, char * buffer, int len) {
- const char *ptr = (const char *) context;
-
- if ((context == NULL) || (buffer == NULL) || (len < 0))
- return(-1);
-
- if (len > urip_rlen) len = urip_rlen;
- memcpy(buffer, ptr, len);
- urip_rlen -= len;
- return(len);
-}
-
-static int
-urip_checkURL(const char *URL) {
- xmlDocPtr doc;
-
- doc = xmlReadFile(URL, NULL, 0);
- if (doc == NULL)
- return(-1);
- xmlFreeDoc(doc);
- return(1);
-}
-
-/**
- * uriPathTest:
- * @filename: ignored
- * @result: ignored
- * @err: ignored
- *
- * Run a set of tests to check how Path and URI are handled before
- * being passed to the I/O layer
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-uriPathTest(const char *filename ATTRIBUTE_UNUSED,
- const char *result ATTRIBUTE_UNUSED,
- const char *err ATTRIBUTE_UNUSED,
- int options ATTRIBUTE_UNUSED) {
- int parsed;
- int failures = 0;
-
- /*
- * register the new I/O handlers
- */
- if (xmlRegisterInputCallbacks(uripMatch, uripOpen, uripRead, uripClose) < 0)
- {
- fprintf(stderr, "failed to register HTTP handler\n");
- return(-1);
- }
-
- for (urip_current = 0;urip_testURLs[urip_current] != NULL;urip_current++) {
- urip_success = 1;
- parsed = urip_checkURL(urip_testURLs[urip_current]);
- if (urip_success != 1) {
- fprintf(stderr, "failed the URL passing test for %s",
- urip_testURLs[urip_current]);
- failures++;
- } else if (parsed != 1) {
- fprintf(stderr, "failed the parsing test for %s",
- urip_testURLs[urip_current]);
- failures++;
- }
- nb_tests++;
- }
-
- xmlPopInputCallbacks();
- return(failures);
-}
-
-#ifdef LIBXML_SCHEMAS_ENABLED
-/************************************************************************
- * *
- * Schemas tests *
- * *
- ************************************************************************/
-static int
-schemasOneTest(const char *sch,
- const char *filename,
- const char *result,
- const char *err,
- int options,
- xmlSchemaPtr schemas) {
- xmlDocPtr doc;
- xmlSchemaValidCtxtPtr ctxt;
- int ret = 0;
- char *temp;
- FILE *schemasOutput;
-
- doc = xmlReadFile(filename, NULL, options);
- if (doc == NULL) {
- fprintf(stderr, "failed to parse instance %s for %s\n", filename, sch);
- return(-1);
- }
-
- temp = resultFilename(result, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "Out of memory\n");
- fatalError();
- }
- schemasOutput = fopen(temp, "wb");
- if (schemasOutput == NULL) {
- fprintf(stderr, "failed to open output file %s\n", temp);
- xmlFreeDoc(doc);
- free(temp);
- return(-1);
- }
-
- ctxt = xmlSchemaNewValidCtxt(schemas);
- xmlSchemaSetValidErrors(ctxt,
- (xmlSchemaValidityErrorFunc) testErrorHandler,
- (xmlSchemaValidityWarningFunc) testErrorHandler,
- ctxt);
- ret = xmlSchemaValidateDoc(ctxt, doc);
- if (ret == 0) {
- fprintf(schemasOutput, "%s validates\n", filename);
- } else if (ret > 0) {
- fprintf(schemasOutput, "%s fails to validate\n", filename);
- } else {
- fprintf(schemasOutput, "%s validation generated an internal error\n",
- filename);
- }
- fclose(schemasOutput);
- if (result) {
- if (compareFiles(temp, result)) {
- fprintf(stderr, "Result for %s on %s failed\n", filename, sch);
- ret = 1;
- }
- }
- unlink(temp);
- free(temp);
-
- if ((ret != 0) && (err != NULL)) {
- if (compareFileMem(err, testErrors, testErrorsSize)) {
- fprintf(stderr, "Error for %s on %s failed\n", filename, sch);
- ret = 1;
- } else {
- ret = 0;
- }
- }
-
- xmlSchemaFreeValidCtxt(ctxt);
- xmlFreeDoc(doc);
- return(ret);
-}
-/**
- * schemasTest:
- * @filename: the schemas file
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a file containing URI, compose them against a fixed base and
- * check for errors
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-schemasTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *errr ATTRIBUTE_UNUSED,
- int options) {
- const char *base = baseFilename(filename);
- const char *base2;
- const char *instance;
- xmlSchemaParserCtxtPtr ctxt;
- xmlSchemaPtr schemas;
- int res = 0, len, ret;
- char pattern[500];
- char prefix[500];
- char result[500];
- char err[500];
- glob_t globbuf;
- size_t i;
- char count = 0;
-
- /* first compile the schemas if possible */
- ctxt = xmlSchemaNewParserCtxt(filename);
- xmlSchemaSetParserErrors(ctxt,
- (xmlSchemaValidityErrorFunc) testErrorHandler,
- (xmlSchemaValidityWarningFunc) testErrorHandler,
- ctxt);
- schemas = xmlSchemaParse(ctxt);
- xmlSchemaFreeParserCtxt(ctxt);
-
- /*
- * most of the mess is about the output filenames generated by the Makefile
- */
- len = strlen(base);
- if ((len > 499) || (len < 5)) {
- xmlSchemaFree(schemas);
- return(-1);
- }
- len -= 4; /* remove trailing .xsd */
- if (base[len - 2] == '_') {
- len -= 2; /* remove subtest number */
- }
- if (base[len - 2] == '_') {
- len -= 2; /* remove subtest number */
- }
- memcpy(prefix, base, len);
- prefix[len] = 0;
-
- snprintf(pattern, 499, "./test/schemas/%s_?.xml", prefix);
- pattern[499] = 0;
-
- if (base[len] == '_') {
- len += 2;
- memcpy(prefix, base, len);
- prefix[len] = 0;
- }
-
- globbuf.gl_offs = 0;
- glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
- for (i = 0;i < globbuf.gl_pathc;i++) {
- testErrorsSize = 0;
- testErrors[0] = 0;
- instance = globbuf.gl_pathv[i];
- base2 = baseFilename(instance);
- len = strlen(base2);
- if ((len > 6) && (base2[len - 6] == '_')) {
- count = base2[len - 5];
- snprintf(result, 499, "result/schemas/%s_%c",
- prefix, count);
- result[499] = 0;
- snprintf(err, 499, "result/schemas/%s_%c.err",
- prefix, count);
- err[499] = 0;
- } else {
- fprintf(stderr, "don't know how to process %s\n", instance);
- continue;
- }
- if (schemas == NULL) {
- } else {
- nb_tests++;
- ret = schemasOneTest(filename, instance, result, err,
- options, schemas);
- if (ret != 0)
- res = ret;
- }
- }
- globfree(&globbuf);
- xmlSchemaFree(schemas);
-
- return(res);
-}
-
-/************************************************************************
- * *
- * Schemas tests *
- * *
- ************************************************************************/
-static int
-rngOneTest(const char *sch,
- const char *filename,
- const char *result,
- const char *err,
- int options,
- xmlRelaxNGPtr schemas) {
- xmlDocPtr doc;
- xmlRelaxNGValidCtxtPtr ctxt;
- int ret = 0;
- char *temp;
- FILE *schemasOutput;
-
- doc = xmlReadFile(filename, NULL, options);
- if (doc == NULL) {
- fprintf(stderr, "failed to parse instance %s for %s\n", filename, sch);
- return(-1);
- }
-
- temp = resultFilename(result, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "Out of memory\n");
- fatalError();
- }
- schemasOutput = fopen(temp, "wb");
- if (schemasOutput == NULL) {
- fprintf(stderr, "failed to open output file %s\n", temp);
- xmlFreeDoc(doc);
- free(temp);
- return(-1);
- }
-
- ctxt = xmlRelaxNGNewValidCtxt(schemas);
- xmlRelaxNGSetValidErrors(ctxt,
- (xmlRelaxNGValidityErrorFunc) testErrorHandler,
- (xmlRelaxNGValidityWarningFunc) testErrorHandler,
- ctxt);
- ret = xmlRelaxNGValidateDoc(ctxt, doc);
- if (ret == 0) {
- testErrorHandler(NULL, "%s validates\n", filename);
- } else if (ret > 0) {
- testErrorHandler(NULL, "%s fails to validate\n", filename);
- } else {
- testErrorHandler(NULL, "%s validation generated an internal error\n",
- filename);
- }
- fclose(schemasOutput);
- if (result) {
- if (compareFiles(temp, result)) {
- fprintf(stderr, "Result for %s on %s failed\n", filename, sch);
- ret = 1;
- }
- }
- unlink(temp);
- free(temp);
-
- if (err != NULL) {
- if (compareFileMem(err, testErrors, testErrorsSize)) {
- fprintf(stderr, "Error for %s on %s failed\n", filename, sch);
- ret = 1;
- printf("%s", testErrors);
- }
- }
-
-
- xmlRelaxNGFreeValidCtxt(ctxt);
- xmlFreeDoc(doc);
- return(ret);
-}
-/**
- * rngTest:
- * @filename: the schemas file
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse an RNG schemas and then apply it to the related .xml
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-rngTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *errr ATTRIBUTE_UNUSED,
- int options) {
- const char *base = baseFilename(filename);
- const char *base2;
- const char *instance;
- xmlRelaxNGParserCtxtPtr ctxt;
- xmlRelaxNGPtr schemas;
- int res = 0, len, ret;
- char pattern[500];
- char prefix[500];
- char result[500];
- char err[500];
- glob_t globbuf;
- size_t i;
- char count = 0;
-
- /* first compile the schemas if possible */
- ctxt = xmlRelaxNGNewParserCtxt(filename);
- xmlRelaxNGSetParserErrors(ctxt,
- (xmlRelaxNGValidityErrorFunc) testErrorHandler,
- (xmlRelaxNGValidityWarningFunc) testErrorHandler,
- ctxt);
- schemas = xmlRelaxNGParse(ctxt);
- xmlRelaxNGFreeParserCtxt(ctxt);
-
- /*
- * most of the mess is about the output filenames generated by the Makefile
- */
- len = strlen(base);
- if ((len > 499) || (len < 5)) {
- xmlRelaxNGFree(schemas);
- return(-1);
- }
- len -= 4; /* remove trailing .rng */
- memcpy(prefix, base, len);
- prefix[len] = 0;
-
- snprintf(pattern, 499, "./test/relaxng/%s_?.xml", prefix);
- pattern[499] = 0;
-
- globbuf.gl_offs = 0;
- glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
- for (i = 0;i < globbuf.gl_pathc;i++) {
- testErrorsSize = 0;
- testErrors[0] = 0;
- instance = globbuf.gl_pathv[i];
- base2 = baseFilename(instance);
- len = strlen(base2);
- if ((len > 6) && (base2[len - 6] == '_')) {
- count = base2[len - 5];
- snprintf(result, 499, "result/relaxng/%s_%c",
- prefix, count);
- result[499] = 0;
- snprintf(err, 499, "result/relaxng/%s_%c.err",
- prefix, count);
- err[499] = 0;
- } else {
- fprintf(stderr, "don't know how to process %s\n", instance);
- continue;
- }
- if (schemas == NULL) {
- } else {
- nb_tests++;
- ret = rngOneTest(filename, instance, result, err,
- options, schemas);
- if (res != 0)
- ret = res;
- }
- }
- globfree(&globbuf);
- xmlRelaxNGFree(schemas);
-
- return(res);
-}
-
-#ifdef LIBXML_READER_ENABLED
-/**
- * rngStreamTest:
- * @filename: the schemas file
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a set of files with streaming, applying an RNG schemas
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-rngStreamTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *errr ATTRIBUTE_UNUSED,
- int options) {
- const char *base = baseFilename(filename);
- const char *base2;
- const char *instance;
- int res = 0, len, ret;
- char pattern[500];
- char prefix[500];
- char result[500];
- char err[500];
- glob_t globbuf;
- size_t i;
- char count = 0;
- xmlTextReaderPtr reader;
- int disable_err = 0;
-
- /*
- * most of the mess is about the output filenames generated by the Makefile
- */
- len = strlen(base);
- if ((len > 499) || (len < 5)) {
- fprintf(stderr, "len(base) == %d !\n", len);
- return(-1);
- }
- len -= 4; /* remove trailing .rng */
- memcpy(prefix, base, len);
- prefix[len] = 0;
-
- /*
- * strictly unifying the error messages is nearly impossible this
- * hack is also done in the Makefile
- */
- if ((!strcmp(prefix, "tutor10_1")) || (!strcmp(prefix, "tutor10_2")) ||
- (!strcmp(prefix, "tutor3_2")) || (!strcmp(prefix, "307377")))
- disable_err = 1;
-
- snprintf(pattern, 499, "./test/relaxng/%s_?.xml", prefix);
- pattern[499] = 0;
-
- globbuf.gl_offs = 0;
- glob(pattern, GLOB_DOOFFS, NULL, &globbuf);
- for (i = 0;i < globbuf.gl_pathc;i++) {
- testErrorsSize = 0;
- testErrors[0] = 0;
- instance = globbuf.gl_pathv[i];
- base2 = baseFilename(instance);
- len = strlen(base2);
- if ((len > 6) && (base2[len - 6] == '_')) {
- count = base2[len - 5];
- snprintf(result, 499, "result/relaxng/%s_%c",
- prefix, count);
- result[499] = 0;
- snprintf(err, 499, "result/relaxng/%s_%c.err",
- prefix, count);
- err[499] = 0;
- } else {
- fprintf(stderr, "don't know how to process %s\n", instance);
- continue;
- }
- reader = xmlReaderForFile(instance, NULL, options);
- if (reader == NULL) {
- fprintf(stderr, "Failed to build reder for %s\n", instance);
- }
- if (disable_err == 1)
- ret = streamProcessTest(instance, result, NULL, reader, filename);
- else
- ret = streamProcessTest(instance, result, err, reader, filename);
- xmlFreeTextReader(reader);
- if (ret != 0) {
- fprintf(stderr, "instance %s failed\n", instance);
- res = ret;
- }
- }
- globfree(&globbuf);
-
- return(res);
-}
-#endif /* READER */
-
-#endif
-
-#ifdef LIBXML_PATTERN_ENABLED
-#ifdef LIBXML_READER_ENABLED
-/************************************************************************
- * *
- * Patterns tests *
- * *
- ************************************************************************/
-static void patternNode(FILE *out, xmlTextReaderPtr reader,
- const char *pattern, xmlPatternPtr patternc,
- xmlStreamCtxtPtr patstream) {
- xmlChar *path = NULL;
- int match = -1;
- int type, empty;
-
- type = xmlTextReaderNodeType(reader);
- empty = xmlTextReaderIsEmptyElement(reader);
-
- if (type == XML_READER_TYPE_ELEMENT) {
- /* do the check only on element start */
- match = xmlPatternMatch(patternc, xmlTextReaderCurrentNode(reader));
-
- if (match) {
- path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
- fprintf(out, "Node %s matches pattern %s\n", path, pattern);
- }
- }
- if (patstream != NULL) {
- int ret;
-
- if (type == XML_READER_TYPE_ELEMENT) {
- ret = xmlStreamPush(patstream,
- xmlTextReaderConstLocalName(reader),
- xmlTextReaderConstNamespaceUri(reader));
- if (ret < 0) {
- fprintf(out, "xmlStreamPush() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- } else if (ret != match) {
- if (path == NULL) {
- path = xmlGetNodePath(
- xmlTextReaderCurrentNode(reader));
- }
- fprintf(out,
- "xmlPatternMatch and xmlStreamPush disagree\n");
- fprintf(out,
- " pattern %s node %s\n",
- pattern, path);
- }
-
-
- }
- if ((type == XML_READER_TYPE_END_ELEMENT) ||
- ((type == XML_READER_TYPE_ELEMENT) && (empty))) {
- ret = xmlStreamPop(patstream);
- if (ret < 0) {
- fprintf(out, "xmlStreamPop() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- }
- }
- }
- if (path != NULL)
- xmlFree(path);
-}
-
-/**
- * patternTest:
- * @filename: the schemas file
- * @result: the file with expected result
- * @err: the file with error messages
- *
- * Parse a set of files with streaming, applying an RNG schemas
- *
- * Returns 0 in case of success, an error code otherwise
- */
-static int
-patternTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *err ATTRIBUTE_UNUSED,
- int options) {
- xmlPatternPtr patternc = NULL;
- xmlStreamCtxtPtr patstream = NULL;
- FILE *o, *f;
- char str[1024];
- char xml[500];
- char result[500];
- int len, i;
- int ret = 0, res;
- char *temp;
- xmlTextReaderPtr reader;
- xmlDocPtr doc;
-
- len = strlen(filename);
- len -= 4;
- memcpy(xml, filename, len);
- xml[len] = 0;
- snprintf(result, 499, "result/pattern/%s", baseFilename(xml));
- result[499] = 0;
- memcpy(xml + len, ".xml", 5);
-
- if (!checkTestFile(xml)) {
- fprintf(stderr, "Missing xml file %s\n", xml);
- return(-1);
- }
- if (!checkTestFile(result)) {
- fprintf(stderr, "Missing result file %s\n", result);
- return(-1);
- }
- f = fopen(filename, "rb");
- if (f == NULL) {
- fprintf(stderr, "Failed to open %s\n", filename);
- return(-1);
- }
- temp = resultFilename(filename, "", ".res");
- if (temp == NULL) {
- fprintf(stderr, "Out of memory\n");
- fatalError();
- }
- o = fopen(temp, "wb");
- if (o == NULL) {
- fprintf(stderr, "failed to open output file %s\n", temp);
- fclose(f);
- free(temp);
- return(-1);
- }
- while (1) {
- /*
- * read one line in string buffer.
- */
- if (fgets (&str[0], sizeof (str) - 1, f) == NULL)
- break;
-
- /*
- * remove the ending spaces
- */
- i = strlen(str);
- while ((i > 0) &&
- ((str[i - 1] == '\n') || (str[i - 1] == '\r') ||
- (str[i - 1] == ' ') || (str[i - 1] == '\t'))) {
- i--;
- str[i] = 0;
- }
- doc = xmlReadFile(xml, NULL, options);
- if (doc == NULL) {
- fprintf(stderr, "Failed to parse %s\n", xml);
- ret = 1;
- } else {
- xmlNodePtr root;
- const xmlChar *namespaces[22];
- int j;
- xmlNsPtr ns;
-
- root = xmlDocGetRootElement(doc);
- for (ns = root->nsDef, j = 0;ns != NULL && j < 20;ns=ns->next) {
- namespaces[j++] = ns->href;
- namespaces[j++] = ns->prefix;
- }
- namespaces[j++] = NULL;
- namespaces[j++] = NULL;
-
- patternc = xmlPatterncompile((const xmlChar *) str, doc->dict,
- 0, &namespaces[0]);
- if (patternc == NULL) {
- testErrorHandler(NULL,
- "Pattern %s failed to compile\n", str);
- xmlFreeDoc(doc);
- ret = 1;
- continue;
- }
- patstream = xmlPatternGetStreamCtxt(patternc);
- if (patstream != NULL) {
- ret = xmlStreamPush(patstream, NULL, NULL);
- if (ret < 0) {
- fprintf(stderr, "xmlStreamPush() failure\n");
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- }
- }
- nb_tests++;
-
- reader = xmlReaderWalker(doc);
- res = xmlTextReaderRead(reader);
- while (res == 1) {
- patternNode(o, reader, str, patternc, patstream);
- res = xmlTextReaderRead(reader);
- }
- if (res != 0) {
- fprintf(o, "%s : failed to parse\n", filename);
- }
- xmlFreeTextReader(reader);
- xmlFreeDoc(doc);
- xmlFreeStreamCtxt(patstream);
- patstream = NULL;
- xmlFreePattern(patternc);
-
- }
- }
-
- fclose(f);
- fclose(o);
-
- ret = compareFiles(temp, result);
- if (ret) {
- fprintf(stderr, "Result for %s failed\n", filename);
- ret = 1;
- }
- unlink(temp);
- free(temp);
- return(ret);
-}
-#endif /* READER */
-#endif /* PATTERN */
-#ifdef LIBXML_C14N_ENABLED
-/************************************************************************
- * *
- * Canonicalization tests *
- * *
- ************************************************************************/
-static xmlXPathObjectPtr
-load_xpath_expr (xmlDocPtr parent_doc, const char* filename) {
- xmlXPathObjectPtr xpath;
- xmlDocPtr doc;
- xmlChar *expr;
- xmlXPathContextPtr ctx;
- xmlNodePtr node;
- xmlNsPtr ns;
-
- /*
- * load XPath expr as a file
- */
- xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
- xmlSubstituteEntitiesDefault(1);
-
- doc = xmlReadFile(filename, NULL, XML_PARSE_DTDATTR | XML_PARSE_NOENT);
- if (doc == NULL) {
- fprintf(stderr, "Error: unable to parse file \"%s\"\n", filename);
- return(NULL);
- }
-
- /*
- * Check the document is of the right kind
- */
- if(xmlDocGetRootElement(doc) == NULL) {
- fprintf(stderr,"Error: empty document for file \"%s\"\n", filename);
- xmlFreeDoc(doc);
- return(NULL);
- }
-
- node = doc->children;
- while(node != NULL && !xmlStrEqual(node->name, (const xmlChar *)"XPath")) {
- node = node->next;
- }
-
- if(node == NULL) {
- fprintf(stderr,"Error: XPath element expected in the file \"%s\"\n", filename);
- xmlFreeDoc(doc);
- return(NULL);
- }
-
- expr = xmlNodeGetContent(node);
- if(expr == NULL) {
- fprintf(stderr,"Error: XPath content element is NULL \"%s\"\n", filename);
- xmlFreeDoc(doc);
- return(NULL);
- }
-
- ctx = xmlXPathNewContext(parent_doc);
- if(ctx == NULL) {
- fprintf(stderr,"Error: unable to create new context\n");
- xmlFree(expr);
- xmlFreeDoc(doc);
- return(NULL);
- }
-
- /*
- * Register namespaces
- */
- ns = node->nsDef;
- while(ns != NULL) {
- if(xmlXPathRegisterNs(ctx, ns->prefix, ns->href) != 0) {
- fprintf(stderr,"Error: unable to register NS with prefix=\"%s\" and href=\"%s\"\n", ns->prefix, ns->href);
- xmlFree(expr);
- xmlXPathFreeContext(ctx);
- xmlFreeDoc(doc);
- return(NULL);
- }
- ns = ns->next;
- }
-
- /*
- * Evaluate xpath
- */
- xpath = xmlXPathEvalExpression(expr, ctx);
- if(xpath == NULL) {
- fprintf(stderr,"Error: unable to evaluate xpath expression\n");
- xmlFree(expr);
- xmlXPathFreeContext(ctx);
- xmlFreeDoc(doc);
- return(NULL);
- }
-
- /* print_xpath_nodes(xpath->nodesetval); */
-
- xmlFree(expr);
- xmlXPathFreeContext(ctx);
- xmlFreeDoc(doc);
- return(xpath);
-}
-
-/*
- * Macro used to grow the current buffer.
- */
-#define xxx_growBufferReentrant() { \
- buffer_size *= 2; \
- buffer = (xmlChar **) \
- xmlRealloc(buffer, buffer_size * sizeof(xmlChar*)); \
- if (buffer == NULL) { \
- perror("realloc failed"); \
- return(NULL); \
- } \
-}
-
-static xmlChar **
-parse_list(xmlChar *str) {
- xmlChar **buffer;
- xmlChar **out = NULL;
- int buffer_size = 0;
- int len;
-
- if(str == NULL) {
- return(NULL);
- }
-
- len = xmlStrlen(str);
- if((str[0] == '\'') && (str[len - 1] == '\'')) {
- str[len - 1] = '\0';
- str++;
- len -= 2;
- }
- /*
- * allocate an translation buffer.
- */
- buffer_size = 1000;
- buffer = (xmlChar **) xmlMalloc(buffer_size * sizeof(xmlChar*));
- if (buffer == NULL) {
- perror("malloc failed");
- return(NULL);
- }
- out = buffer;
-
- while(*str != '\0') {
- if (out - buffer > buffer_size - 10) {
- int indx = out - buffer;
-
- xxx_growBufferReentrant();
- out = &buffer[indx];
- }
- (*out++) = str;
- while(*str != ',' && *str != '\0') ++str;
- if(*str == ',') *(str++) = '\0';
- }
- (*out) = NULL;
- return buffer;
-}
-
-static int
-c14nRunTest(const char* xml_filename, int with_comments, int exclusive,
- const char* xpath_filename, const char *ns_filename,
- const char* result_file) {
- xmlDocPtr doc;
- xmlXPathObjectPtr xpath = NULL;
- xmlChar *result = NULL;
- int ret;
- xmlChar **inclusive_namespaces = NULL;
- const char *nslist = NULL;
- int nssize;
-
-
- /*
- * build an XML tree from a the file; we need to add default
- * attributes and resolve all character and entities references
- */
- xmlLoadExtDtdDefaultValue = XML_DETECT_IDS | XML_COMPLETE_ATTRS;
- xmlSubstituteEntitiesDefault(1);
-
- doc = xmlReadFile(xml_filename, NULL, XML_PARSE_DTDATTR | XML_PARSE_NOENT);
- if (doc == NULL) {
- fprintf(stderr, "Error: unable to parse file \"%s\"\n", xml_filename);
- return(-1);
- }
-
- /*
- * Check the document is of the right kind
- */
- if(xmlDocGetRootElement(doc) == NULL) {
- fprintf(stderr,"Error: empty document for file \"%s\"\n", xml_filename);
- xmlFreeDoc(doc);
- return(-1);
- }
-
- /*
- * load xpath file if specified
- */
- if(xpath_filename) {
- xpath = load_xpath_expr(doc, xpath_filename);
- if(xpath == NULL) {
- fprintf(stderr,"Error: unable to evaluate xpath expression\n");
- xmlFreeDoc(doc);
- return(-1);
- }
- }
-
- if (ns_filename != NULL) {
- if (loadMem(ns_filename, &nslist, &nssize)) {
- fprintf(stderr,"Error: unable to evaluate xpath expression\n");
- if(xpath != NULL) xmlXPathFreeObject(xpath);
- xmlFreeDoc(doc);
- return(-1);
- }
- inclusive_namespaces = parse_list((xmlChar *) nslist);
- }
-
- /*
- * Canonical form
- */
- /* fprintf(stderr,"File \"%s\" loaded: start canonization\n", xml_filename); */
- ret = xmlC14NDocDumpMemory(doc,
- (xpath) ? xpath->nodesetval : NULL,
- exclusive, inclusive_namespaces,
- with_comments, &result);
- if (ret >= 0) {
- if(result != NULL) {
- if (compareFileMem(result_file, (const char *) result, ret)) {
- fprintf(stderr, "Result mismatch for %s\n", xml_filename);
- ret = -1;
- }
- }
- } else {
- fprintf(stderr,"Error: failed to canonicalize XML file \"%s\" (ret=%d)\n", xml_filename, ret);
- ret = -1;
- }
-
- /*
- * Cleanup
- */
- if (result != NULL) xmlFree(result);
- if(xpath != NULL) xmlXPathFreeObject(xpath);
- if (inclusive_namespaces != NULL) xmlFree(inclusive_namespaces);
- if (nslist != NULL) free((char *) nslist);
- xmlFreeDoc(doc);
-
- return(ret);
-}
-
-static int
-c14nCommonTest(const char *filename, int with_comments, int exclusive,
- const char *subdir) {
- char buf[500];
- char prefix[500];
- const char *base;
- int len;
- char *result = NULL;
- char *xpath = NULL;
- char *ns = NULL;
- int ret = 0;
-
- base = baseFilename(filename);
- len = strlen(base);
- len -= 4;
- memcpy(prefix, base, len);
- prefix[len] = 0;
-
- snprintf(buf, 499, "result/c14n/%s/%s", subdir,prefix);
- if (!checkTestFile(buf)) {
- fprintf(stderr, "Missing result file %s", buf);
- return(-1);
- }
- result = strdup(buf);
- snprintf(buf, 499, "test/c14n/%s/%s.xpath", subdir,prefix);
- if (checkTestFile(buf)) {
- xpath = strdup(buf);
- }
- snprintf(buf, 499, "test/c14n/%s/%s.ns", subdir,prefix);
- if (checkTestFile(buf)) {
- ns = strdup(buf);
- }
-
- nb_tests++;
- if (c14nRunTest(filename, with_comments, exclusive,
- xpath, ns, result) < 0)
- ret = 1;
-
- if (result != NULL) free(result);
- if (xpath != NULL) free(xpath);
- if (ns != NULL) free(ns);
- return(ret);
-}
-
-static int
-c14nWithCommentTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *err ATTRIBUTE_UNUSED,
- int options ATTRIBUTE_UNUSED) {
- return(c14nCommonTest(filename, 1, 0, "with-comments"));
-}
-static int
-c14nWithoutCommentTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *err ATTRIBUTE_UNUSED,
- int options ATTRIBUTE_UNUSED) {
- return(c14nCommonTest(filename, 0, 0, "without-comments"));
-}
-static int
-c14nExcWithoutCommentTest(const char *filename,
- const char *resul ATTRIBUTE_UNUSED,
- const char *err ATTRIBUTE_UNUSED,
- int options ATTRIBUTE_UNUSED) {
- return(c14nCommonTest(filename, 0, 1, "exc-without-comments"));
-}
-#endif
-#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined (LIBXML_SAX1_ENABLED)
-/************************************************************************
- * *
- * Catalog and threads test *
- * *
- ************************************************************************/
-
-/*
- * mostly a cut and paste from testThreads.c
- */
-#define MAX_ARGC 20
-
-static const char *catalog = "test/threads/complex.xml";
-static const char *testfiles[] = {
- "test/threads/abc.xml",
- "test/threads/acb.xml",
- "test/threads/bac.xml",
- "test/threads/bca.xml",
- "test/threads/cab.xml",
- "test/threads/cba.xml",
- "test/threads/invalid.xml",
-};
-
-static const char *Okay = "OK";
-static const char *Failed = "Failed";
-
-#ifndef xmlDoValidityCheckingDefaultValue
-#error xmlDoValidityCheckingDefaultValue is not a macro
-#endif
-#ifndef xmlGenericErrorContext
-#error xmlGenericErrorContext is not a macro
-#endif
-
-static void *
-thread_specific_data(void *private_data)
-{
- xmlDocPtr myDoc;
- const char *filename = (const char *) private_data;
- int okay = 1;
-
- if (!strcmp(filename, "test/threads/invalid.xml")) {
- xmlDoValidityCheckingDefaultValue = 0;
- xmlGenericErrorContext = stdout;
- } else {
- xmlDoValidityCheckingDefaultValue = 1;
- xmlGenericErrorContext = stderr;
- }
- myDoc = xmlParseFile(filename);
- if (myDoc) {
- xmlFreeDoc(myDoc);
- } else {
- printf("parse failed\n");
- okay = 0;
- }
- if (!strcmp(filename, "test/threads/invalid.xml")) {
- if (xmlDoValidityCheckingDefaultValue != 0) {
- printf("ValidityCheckingDefaultValue override failed\n");
- okay = 0;
- }
- if (xmlGenericErrorContext != stdout) {
- printf("xmlGenericErrorContext override failed\n");
- okay = 0;
- }
- } else {
- if (xmlDoValidityCheckingDefaultValue != 1) {
- printf("ValidityCheckingDefaultValue override failed\n");
- okay = 0;
- }
- if (xmlGenericErrorContext != stderr) {
- printf("xmlGenericErrorContext override failed\n");
- okay = 0;
- }
- }
- if (okay == 0)
- return ((void *) Failed);
- return ((void *) Okay);
-}
-
-#if defined(linux) || defined(solaris)
-
-#include
-
-static pthread_t tid[MAX_ARGC];
-
-static int
-testThread(void)
-{
- unsigned int i, repeat;
- unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
- void *results[MAX_ARGC];
- int ret;
- int res = 0;
-
- xmlInitParser();
-
- for (repeat = 0; repeat < 500; repeat++) {
- xmlLoadCatalog(catalog);
- nb_tests++;
-
- for (i = 0; i < num_threads; i++) {
- results[i] = NULL;
- tid[i] = (pthread_t) - 1;
- }
-
- for (i = 0; i < num_threads; i++) {
- ret = pthread_create(&tid[i], 0, thread_specific_data,
- (void *) testfiles[i]);
- if (ret != 0) {
- fprintf(stderr, "pthread_create failed\n");
- return (1);
- }
- }
- for (i = 0; i < num_threads; i++) {
- ret = pthread_join(tid[i], &results[i]);
- if (ret != 0) {
- fprintf(stderr, "pthread_join failed\n");
- return (1);
- }
- }
-
- xmlCatalogCleanup();
- for (i = 0; i < num_threads; i++)
- if (results[i] != (void *) Okay) {
- fprintf(stderr, "Thread %d handling %s failed\n",
- i, testfiles[i]);
- res = 1;
- }
- }
- return (res);
-}
-
-#elif defined WIN32
-#include
-#include
-
-#define TEST_REPEAT_COUNT 500
-
-static HANDLE tid[MAX_ARGC];
-
-static DWORD WINAPI
-win32_thread_specific_data(void *private_data)
-{
- return((DWORD) thread_specific_data(private_data));
-}
-
-static int
-testThread(void)
-{
- unsigned int i, repeat;
- unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
- DWORD results[MAX_ARGC];
- BOOL ret;
- int res = 0;
-
- xmlInitParser();
- for (repeat = 0; repeat < TEST_REPEAT_COUNT; repeat++) {
- xmlLoadCatalog(catalog);
- nb_tests++;
-
- for (i = 0; i < num_threads; i++) {
- results[i] = 0;
- tid[i] = (HANDLE) - 1;
- }
-
- for (i = 0; i < num_threads; i++) {
- DWORD useless;
-
- tid[i] = CreateThread(NULL, 0,
- win32_thread_specific_data,
- (void *) testfiles[i], 0,
- &useless);
- if (tid[i] == NULL) {
- fprintf(stderr, "CreateThread failed\n");
- return(1);
- }
- }
-
- if (WaitForMultipleObjects(num_threads, tid, TRUE, INFINITE) ==
- WAIT_FAILED) {
- fprintf(stderr, "WaitForMultipleObjects failed\n");
- return(1);
- }
-
- for (i = 0; i < num_threads; i++) {
- ret = GetExitCodeThread(tid[i], &results[i]);
- if (ret == 0) {
- fprintf(stderr, "GetExitCodeThread failed\n");
- return(1);
- }
- CloseHandle(tid[i]);
- }
-
- xmlCatalogCleanup();
- for (i = 0; i < num_threads; i++) {
- if (results[i] != (DWORD) Okay) {
- fprintf(stderr, "Thread %d handling %s failed\n",
- i, testfiles[i]);
- res = 1;
- }
- }
- }
-
- return (res);
-}
-
-#elif defined __BEOS__
-#include
-
-static thread_id tid[MAX_ARGC];
-
-static int
-testThread(void)
-{
- unsigned int i, repeat;
- unsigned int num_threads = sizeof(testfiles) / sizeof(testfiles[0]);
- void *results[MAX_ARGC];
- status_t ret;
- int res = 0;
-
- xmlInitParser();
- for (repeat = 0; repeat < 500; repeat++) {
- xmlLoadCatalog(catalog);
- for (i = 0; i < num_threads; i++) {
- results[i] = NULL;
- tid[i] = (thread_id) - 1;
- }
- for (i = 0; i < num_threads; i++) {
- tid[i] =
- spawn_thread(thread_specific_data, "xmlTestThread",
- B_NORMAL_PRIORITY, (void *) testfiles[i]);
- if (tid[i] < B_OK) {
- fprintf(stderr, "beos_thread_create failed\n");
- return (1);
- }
- printf("beos_thread_create %d -> %d\n", i, tid[i]);
- }
- for (i = 0; i < num_threads; i++) {
- ret = wait_for_thread(tid[i], &results[i]);
- printf("beos_thread_wait %d -> %d\n", i, ret);
- if (ret != B_OK) {
- fprintf(stderr, "beos_thread_wait failed\n");
- return (1);
- }
- }
-
- xmlCatalogCleanup();
- ret = B_OK;
- for (i = 0; i < num_threads; i++)
- if (results[i] != (void *) Okay) {
- printf("Thread %d handling %s failed\n", i, testfiles[i]);
- ret = B_ERROR;
- }
- }
- if (ret != B_OK)
- return(1);
- return (0);
-}
-#else
-static int
-testThread(void)
-{
- fprintf(stderr,
- "Specific platform thread support not detected\n");
- return (-1);
-}
-#endif
-static int
-threadsTest(const char *filename ATTRIBUTE_UNUSED,
- const char *resul ATTRIBUTE_UNUSED,
- const char *err ATTRIBUTE_UNUSED,
- int options ATTRIBUTE_UNUSED) {
- return(testThread());
-}
-#endif
-/************************************************************************
- * *
- * Tests Descriptions *
- * *
- ************************************************************************/
-
-static
-testDesc testDescriptions[] = {
- { "XML regression tests" ,
- oldParseTest, "./test/*", "result/", "", NULL,
- 0 },
- { "XML regression tests on memory" ,
- memParseTest, "./test/*", "result/", "", NULL,
- 0 },
- { "XML entity subst regression tests" ,
- noentParseTest, "./test/*", "result/noent/", "", NULL,
- XML_PARSE_NOENT },
- { "XML Namespaces regression tests",
- errParseTest, "./test/namespaces/*", "result/namespaces/", "", ".err",
- 0 },
- { "Error cases regression tests",
- errParseTest, "./test/errors/*.xml", "result/errors/", "", ".err",
- 0 },
-#ifdef LIBXML_READER_ENABLED
- { "Error cases stream regression tests",
- streamParseTest, "./test/errors/*.xml", "result/errors/", NULL, ".str",
- 0 },
- { "Reader regression tests",
- streamParseTest, "./test/*", "result/", ".rdr", NULL,
- 0 },
- { "Reader entities substitution regression tests",
- streamParseTest, "./test/*", "result/", ".rde", NULL,
- XML_PARSE_NOENT },
- { "Reader on memory regression tests",
- streamMemParseTest, "./test/*", "result/", ".rdr", NULL,
- 0 },
- { "Walker regression tests",
- walkerParseTest, "./test/*", "result/", ".rdr", NULL,
- 0 },
-#endif
-#ifdef LIBXML_SAX1_ENABLED
- { "SAX1 callbacks regression tests" ,
- saxParseTest, "./test/*", "result/", ".sax", NULL,
- XML_PARSE_SAX1 },
- { "SAX2 callbacks regression tests" ,
- saxParseTest, "./test/*", "result/", ".sax2", NULL,
- 0 },
-#endif
-#ifdef LIBXML_PUSH_ENABLED
- { "XML push regression tests" ,
- pushParseTest, "./test/*", "result/", "", NULL,
- 0 },
-#endif
-#ifdef LIBXML_HTML_ENABLED
- { "HTML regression tests" ,
- errParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
- XML_PARSE_HTML },
-#ifdef LIBXML_PUSH_ENABLED
- { "Push HTML regression tests" ,
- pushParseTest, "./test/HTML/*", "result/HTML/", "", ".err",
- XML_PARSE_HTML },
-#endif
-#ifdef LIBXML_SAX1_ENABLED
- { "HTML SAX regression tests" ,
- saxParseTest, "./test/HTML/*", "result/HTML/", ".sax", NULL,
- XML_PARSE_HTML },
-#endif
-#endif
-#ifdef LIBXML_VALID_ENABLED
- { "Valid documents regression tests" ,
- errParseTest, "./test/VCM/*", NULL, NULL, NULL,
- XML_PARSE_DTDVALID },
- { "Validity checking regression tests" ,
- errParseTest, "./test/VC/*", "result/VC/", NULL, "",
- XML_PARSE_DTDVALID },
- { "General documents valid regression tests" ,
- errParseTest, "./test/valid/*", "result/valid/", "", ".err",
- XML_PARSE_DTDVALID },
-#endif
-#ifdef LIBXML_XINCLUDE_ENABLED
- { "XInclude regression tests" ,
- errParseTest, "./test/XInclude/docs/*", "result/XInclude/", "", NULL,
- /* Ignore errors at this point ".err", */
- XML_PARSE_XINCLUDE },
- { "XInclude xmlReader regression tests",
- streamParseTest, "./test/XInclude/docs/*", "result/XInclude/", ".rdr",
- /* Ignore errors at this point ".err", */
- NULL, XML_PARSE_XINCLUDE },
- { "XInclude regression tests stripping include nodes" ,
- errParseTest, "./test/XInclude/docs/*", "result/XInclude/", "", NULL,
- /* Ignore errors at this point ".err", */
- XML_PARSE_XINCLUDE | XML_PARSE_NOXINCNODE },
- { "XInclude xmlReader regression tests stripping include nodes",
- streamParseTest, "./test/XInclude/docs/*", "result/XInclude/", ".rdr",
- /* Ignore errors at this point ".err", */
- NULL, XML_PARSE_XINCLUDE | XML_PARSE_NOXINCNODE },
-#endif
-#ifdef LIBXML_XPATH_ENABLED
-#ifdef LIBXML_DEBUG_ENABLED
- { "XPath expressions regression tests" ,
- xpathExprTest, "./test/XPath/expr/*", "result/XPath/expr/", "", NULL,
- 0 },
- { "XPath document queries regression tests" ,
- xpathDocTest, "./test/XPath/docs/*", NULL, NULL, NULL,
- 0 },
-#ifdef LIBXML_XPTR_ENABLED
- { "XPointer document queries regression tests" ,
- xptrDocTest, "./test/XPath/docs/*", NULL, NULL, NULL,
- 0 },
-#endif
- { "xml:id regression tests" ,
- xmlidDocTest, "./test/xmlid/*", "result/xmlid/", "", ".err",
- 0 },
-#endif
-#endif
- { "URI parsing tests" ,
- uriParseTest, "./test/URI/*.uri", "result/URI/", "", NULL,
- 0 },
- { "URI base composition tests" ,
- uriBaseTest, "./test/URI/*.data", "result/URI/", "", NULL,
- 0 },
- { "Path URI conversion tests" ,
- uriPathTest, NULL, NULL, NULL, NULL,
- 0 },
-#ifdef LIBXML_SCHEMAS_ENABLED
- { "Schemas regression tests" ,
- schemasTest, "./test/schemas/*_*.xsd", NULL, NULL, NULL,
- 0 },
- { "Relax-NG regression tests" ,
- rngTest, "./test/relaxng/*.rng", NULL, NULL, NULL,
- XML_PARSE_DTDATTR | XML_PARSE_NOENT },
-#ifdef LIBXML_READER_ENABLED
- { "Relax-NG streaming regression tests" ,
- rngStreamTest, "./test/relaxng/*.rng", NULL, NULL, NULL,
- XML_PARSE_DTDATTR | XML_PARSE_NOENT },
-#endif
-#endif
-#ifdef LIBXML_PATTERN_ENABLED
-#ifdef LIBXML_READER_ENABLED
- { "Pattern regression tests" ,
- patternTest, "./test/pattern/*.pat", "result/pattern/", NULL, NULL,
- 0 },
-#endif
-#endif
-#ifdef LIBXML_C14N_ENABLED
- { "C14N with comments regression tests" ,
- c14nWithCommentTest, "./test/c14n/with-comments/*.xml", NULL, NULL, NULL,
- 0 },
- { "C14N without comments regression tests" ,
- c14nWithoutCommentTest, "./test/c14n/without-comments/*.xml", NULL, NULL, NULL,
- 0 },
- { "C14N exclusive without comments regression tests" ,
- c14nExcWithoutCommentTest, "./test/c14n/exc-without-comments/*.xml", NULL, NULL, NULL,
- 0 },
-#endif
-#if defined(LIBXML_THREAD_ENABLED) && defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_SAX1_ENABLED)
- { "Catalog and Threads regression tests" ,
- threadsTest, NULL, NULL, NULL, NULL,
- 0 },
-#endif
- {NULL, NULL, NULL, NULL, NULL, NULL, 0}
-};
-
-/************************************************************************
- * *
- * The main code driving the tests *
- * *
- ************************************************************************/
-
-static int
-launchTests(testDescPtr tst) {
- int res = 0, err = 0;
- size_t i;
- char *result;
- char *error;
- int mem;
-
- if (tst == NULL) return(-1);
- if (tst->in != NULL) {
- glob_t globbuf;
-
- globbuf.gl_offs = 0;
- glob(tst->in, GLOB_DOOFFS, NULL, &globbuf);
- for (i = 0;i < globbuf.gl_pathc;i++) {
- if (!checkTestFile(globbuf.gl_pathv[i]))
- continue;
- if (tst->suffix != NULL) {
- result = resultFilename(globbuf.gl_pathv[i], tst->out,
- tst->suffix);
- if (result == NULL) {
- fprintf(stderr, "Out of memory !\n");
- fatalError();
- }
- } else {
- result = NULL;
- }
- if (tst->err != NULL) {
- error = resultFilename(globbuf.gl_pathv[i], tst->out,
- tst->err);
- if (error == NULL) {
- fprintf(stderr, "Out of memory !\n");
- fatalError();
- }
- } else {
- error = NULL;
- }
- if ((result) &&(!checkTestFile(result))) {
- fprintf(stderr, "Missing result file %s\n", result);
- } else if ((error) &&(!checkTestFile(error))) {
- fprintf(stderr, "Missing error file %s\n", error);
- } else {
- mem = xmlMemUsed();
- extraMemoryFromResolver = 0;
- testErrorsSize = 0;
- testErrors[0] = 0;
- res = tst->func(globbuf.gl_pathv[i], result, error,
- tst->options | XML_PARSE_COMPACT);
- xmlResetLastError();
- if (res != 0) {
- fprintf(stderr, "File %s generated an error\n",
- globbuf.gl_pathv[i]);
- nb_errors++;
- err++;
- }
- else if (xmlMemUsed() != mem) {
- if ((xmlMemUsed() != mem) &&
- (extraMemoryFromResolver == 0)) {
- fprintf(stderr, "File %s leaked %d bytes\n",
- globbuf.gl_pathv[i], xmlMemUsed() - mem);
- nb_leaks++;
- err++;
- }
- }
- testErrorsSize = 0;
- }
- if (result)
- free(result);
- if (error)
- free(error);
- }
- globfree(&globbuf);
- } else {
- testErrorsSize = 0;
- testErrors[0] = 0;
- extraMemoryFromResolver = 0;
- res = tst->func(NULL, NULL, NULL, tst->options);
- if (res != 0) {
- nb_errors++;
- err++;
- }
- }
- return(err);
-}
-
-static int verbose = 0;
-static int tests_quiet = 0;
-
-static int
-runtest(int i) {
- int ret = 0, res;
- int old_errors, old_tests, old_leaks;
-
- old_errors = nb_errors;
- old_tests = nb_tests;
- old_leaks = nb_leaks;
- if ((tests_quiet == 0) && (testDescriptions[i].desc != NULL))
- printf("## %s\n", testDescriptions[i].desc);
- res = launchTests(&testDescriptions[i]);
- if (res != 0)
- ret++;
- if (verbose) {
- if ((nb_errors == old_errors) && (nb_leaks == old_leaks))
- printf("Ran %d tests, no errors\n", nb_tests - old_tests);
- else
- printf("Ran %d tests, %d errors, %d leaks\n",
- nb_tests - old_tests,
- nb_errors - old_errors,
- nb_leaks - old_leaks);
- }
- return(ret);
-}
-
-int
-main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
- int i, a, ret = 0;
- int subset = 0;
-
- initializeLibxml2();
-
-
- for (a = 1; a < argc;a++) {
- if (!strcmp(argv[a], "-v"))
- verbose = 1;
- else if (!strcmp(argv[a], "-quiet"))
- tests_quiet = 1;
- else {
- for (i = 0; testDescriptions[i].func != NULL; i++) {
- if (strstr(testDescriptions[i].desc, argv[a])) {
- ret += runtest(i);
- subset++;
- }
- }
- }
- }
- if (subset == 0) {
- for (i = 0; testDescriptions[i].func != NULL; i++) {
- ret += runtest(i);
- }
- }
- if ((nb_errors == 0) && (nb_leaks == 0)) {
- ret = 0;
- printf("Total %d tests, no errors\n",
- nb_tests);
- } else {
- ret = 1;
- printf("Total %d tests, %d errors, %d leaks\n",
- nb_tests, nb_errors, nb_leaks);
- }
- xmlCleanupParser();
- xmlMemoryDump();
-
- return(ret);
-}
-
-#else /* ! LIBXML_OUTPUT_ENABLED */
-int
-main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
- fprintf(stderr, "runtest requires output to be enabled in libxml2\n");
- return(1);
-}
-#endif
diff --git a/Extras/LibXML/xmlcatalog.c b/Extras/LibXML/xmlcatalog.c
deleted file mode 100644
index 6f193b177..000000000
--- a/Extras/LibXML/xmlcatalog.c
+++ /dev/null
@@ -1,617 +0,0 @@
-/*
- * xmlcatalog.c : a small utility program to handle XML catalogs
- *
- * See Copyright for the status of this software.
- *
- * daniel@veillard.com
- */
-
-#include "libxml.h"
-
-#include
-#include
-#include
-
-#ifdef HAVE_STDLIB_H
-#include
-#endif
-
-#ifdef HAVE_LIBREADLINE
-#include
-#ifdef HAVE_LIBHISTORY
-#include
-#endif
-#endif
-
-#include
-#include
-#include
-#include
-#include
-
-#if defined(LIBXML_CATALOG_ENABLED) && defined(LIBXML_OUTPUT_ENABLED)
-static int shell = 0;
-static int sgml = 0;
-static int noout = 0;
-static int create = 0;
-static int add = 0;
-static int del = 0;
-static int convert = 0;
-static int no_super_update = 0;
-static int verbose = 0;
-static char *filename = NULL;
-
-
-#ifndef XML_SGML_DEFAULT_CATALOG
-#define XML_SGML_DEFAULT_CATALOG "/etc/sgml/catalog"
-#endif
-
-/************************************************************************
- * *
- * Shell Interface *
- * *
- ************************************************************************/
-/**
- * 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(const 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
-}
-
-static void usershell(void) {
- char *cmdline = NULL, *cur;
- int nbargs;
- char command[100];
- char arg[400];
- char *argv[20];
- int i, ret;
- xmlChar *ans;
-
- while (1) {
- cmdline = xmlShellReadline("> ");
- if (cmdline == NULL)
- return;
-
- /*
- * Parse the command itself
- */
- cur = cmdline;
- nbargs = 0;
- while ((*cur == ' ') || (*cur == '\t')) cur++;
- i = 0;
- while ((*cur != ' ') && (*cur != '\t') &&
- (*cur != '\n') && (*cur != '\r')) {
- if (*cur == 0)
- break;
- command[i++] = *cur++;
- }
- command[i] = 0;
- if (i == 0) {
- free(cmdline);
- continue;
- }
- nbargs++;
-
- /*
- * Parse the argument string
- */
- memset(arg, 0, sizeof(arg));
- while ((*cur == ' ') || (*cur == '\t')) cur++;
- i = 0;
- while ((*cur != '\n') && (*cur != '\r') && (*cur != 0)) {
- if (*cur == 0)
- break;
- arg[i++] = *cur++;
- }
- arg[i] = 0;
- if (i != 0)
- nbargs++;
-
- /*
- * Parse the arguments
- */
- i = 0;
- nbargs = 0;
- cur = arg;
- memset(argv, 0, sizeof(argv));
- while (*cur != 0) {
- while ((*cur == ' ') || (*cur == '\t')) cur++;
- if (*cur == '\'') {
- cur++;
- argv[i] = cur;
- while ((*cur != 0) && (*cur != '\'')) cur++;
- if (*cur == '\'') {
- *cur = 0;
- nbargs++;
- i++;
- cur++;
- }
- } else if (*cur == '"') {
- cur++;
- argv[i] = cur;
- while ((*cur != 0) && (*cur != '"')) cur++;
- if (*cur == '"') {
- *cur = 0;
- nbargs++;
- i++;
- cur++;
- }
- } else {
- argv[i] = cur;
- while ((*cur != 0) && (*cur != ' ') && (*cur != '\t'))
- cur++;
- *cur = 0;
- nbargs++;
- i++;
- cur++;
- }
- }
-
- /*
- * start interpreting the command
- */
- if (!strcmp(command, "exit"))
- break;
- if (!strcmp(command, "quit"))
- break;
- if (!strcmp(command, "bye"))
- break;
- if (!strcmp(command, "public")) {
- if (nbargs != 1) {
- printf("public requires 1 arguments\n");
- } else {
- ans = xmlCatalogResolvePublic((const xmlChar *) argv[0]);
- if (ans == NULL) {
- printf("No entry for PUBLIC %s\n", argv[0]);
- } else {
- printf("%s\n", (char *) ans);
- xmlFree(ans);
- }
- }
- } else if (!strcmp(command, "system")) {
- if (nbargs != 1) {
- printf("system requires 1 arguments\n");
- } else {
- ans = xmlCatalogResolveSystem((const xmlChar *) argv[0]);
- if (ans == NULL) {
- printf("No entry for SYSTEM %s\n", argv[0]);
- } else {
- printf("%s\n", (char *) ans);
- xmlFree(ans);
- }
- }
- } else if (!strcmp(command, "add")) {
- if (sgml) {
- if ((nbargs != 3) && (nbargs != 2)) {
- printf("add requires 2 or 3 arguments\n");
- } else {
- if (argv[2] == NULL)
- ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
- BAD_CAST argv[1]);
- else
- ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
- BAD_CAST argv[2]);
- if (ret != 0)
- printf("add command failed\n");
- }
- } else {
- if ((nbargs != 3) && (nbargs != 2)) {
- printf("add requires 2 or 3 arguments\n");
- } else {
- if (argv[2] == NULL)
- ret = xmlCatalogAdd(BAD_CAST argv[0], NULL,
- BAD_CAST argv[1]);
- else
- ret = xmlCatalogAdd(BAD_CAST argv[0], BAD_CAST argv[1],
- BAD_CAST argv[2]);
- if (ret != 0)
- printf("add command failed\n");
- }
- }
- } else if (!strcmp(command, "del")) {
- if (nbargs != 1) {
- printf("del requires 1\n");
- } else {
- ret = xmlCatalogRemove(BAD_CAST argv[0]);
- if (ret <= 0)
- printf("del command failed\n");
-
- }
- } else if (!strcmp(command, "resolve")) {
- if (nbargs != 2) {
- printf("resolve requires 2 arguments\n");
- } else {
- ans = xmlCatalogResolve(BAD_CAST argv[0],
- BAD_CAST argv[1]);
- if (ans == NULL) {
- printf("Resolver failed to find an answer\n");
- } else {
- printf("%s\n", (char *) ans);
- xmlFree(ans);
- }
- }
- } else if (!strcmp(command, "dump")) {
- if (nbargs != 0) {
- printf("dump has no arguments\n");
- } else {
- xmlCatalogDump(stdout);
- }
- } else if (!strcmp(command, "debug")) {
- if (nbargs != 0) {
- printf("debug has no arguments\n");
- } else {
- verbose++;
- xmlCatalogSetDebug(verbose);
- }
- } else if (!strcmp(command, "quiet")) {
- if (nbargs != 0) {
- printf("quiet has no arguments\n");
- } else {
- if (verbose > 0)
- verbose--;
- xmlCatalogSetDebug(verbose);
- }
- } else {
- if (strcmp(command, "help")) {
- printf("Unrecognized command %s\n", command);
- }
- printf("Commands available:\n");
- printf("\tpublic PublicID: make a PUBLIC identifier lookup\n");
- printf("\tsystem SystemID: make a SYSTEM identifier lookup\n");
- printf("\tresolve PublicID SystemID: do a full resolver lookup\n");
- printf("\tadd 'type' 'orig' 'replace' : add an entry\n");
- printf("\tdel 'values' : remove values\n");
- printf("\tdump: print the current catalog state\n");
- printf("\tdebug: increase the verbosity level\n");
- printf("\tquiet: decrease the verbosity level\n");
- printf("\texit: quit the shell\n");
- }
- free(cmdline); /* not xmlFree here ! */
- }
-}
-
-/************************************************************************
- * *
- * Main *
- * *
- ************************************************************************/
-static void usage(const char *name) {
- /* split into 2 printf's to avoid overly long string (gcc warning) */
- printf("\
-Usage : %s [options] catalogfile entities...\n\
-\tParse the catalog file and query it for the entities\n\
-\t--sgml : handle SGML Super catalogs for --add and --del\n\
-\t--shell : run a shell allowing interactive queries\n\
-\t--create : create a new catalog\n\
-\t--add 'type' 'orig' 'replace' : add an XML entry\n\
-\t--add 'entry' : add an SGML entry\n", name);
- printf("\
-\t--del 'values' : remove values\n\
-\t--noout: avoid dumping the result on stdout\n\
-\t used with --add or --del, it saves the catalog changes\n\
-\t and with --sgml it automatically updates the super catalog\n\
-\t--no-super-update: do not update the SGML super catalog\n\
-\t-v --verbose : provide debug informations\n");
-}
-int main(int argc, char **argv) {
- int i;
- int ret;
- int exit_value = 0;
-
-
- if (argc <= 1) {
- usage(argv[0]);
- return(1);
- }
-
- LIBXML_TEST_VERSION
- for (i = 1; i < argc ; i++) {
- if (!strcmp(argv[i], "-"))
- break;
-
- if (argv[i][0] != '-')
- break;
- if ((!strcmp(argv[i], "-verbose")) ||
- (!strcmp(argv[i], "-v")) ||
- (!strcmp(argv[i], "--verbose"))) {
- verbose++;
- xmlCatalogSetDebug(verbose);
- } else if ((!strcmp(argv[i], "-noout")) ||
- (!strcmp(argv[i], "--noout"))) {
- noout = 1;
- } else if ((!strcmp(argv[i], "-shell")) ||
- (!strcmp(argv[i], "--shell"))) {
- shell++;
- noout = 1;
- } else if ((!strcmp(argv[i], "-sgml")) ||
- (!strcmp(argv[i], "--sgml"))) {
- sgml++;
- } else if ((!strcmp(argv[i], "-create")) ||
- (!strcmp(argv[i], "--create"))) {
- create++;
- } else if ((!strcmp(argv[i], "-convert")) ||
- (!strcmp(argv[i], "--convert"))) {
- convert++;
- } else if ((!strcmp(argv[i], "-no-super-update")) ||
- (!strcmp(argv[i], "--no-super-update"))) {
- no_super_update++;
- } else if ((!strcmp(argv[i], "-add")) ||
- (!strcmp(argv[i], "--add"))) {
- if (sgml)
- i += 2;
- else
- i += 3;
- add++;
- } else if ((!strcmp(argv[i], "-del")) ||
- (!strcmp(argv[i], "--del"))) {
- i += 1;
- del++;
- } else {
- fprintf(stderr, "Unknown option %s\n", argv[i]);
- usage(argv[0]);
- return(1);
- }
- }
-
- for (i = 1; i < argc; i++) {
- if ((!strcmp(argv[i], "-add")) ||
- (!strcmp(argv[i], "--add"))) {
- if (sgml)
- i += 2;
- else
- i += 3;
- continue;
- } else if ((!strcmp(argv[i], "-del")) ||
- (!strcmp(argv[i], "--del"))) {
- i += 1;
-
- /* No catalog entry specified */
- if (i == argc || (sgml && i + 1 == argc)) {
- fprintf(stderr, "No catalog entry specified to remove from\n");
- usage (argv[0]);
- return(1);
- }
-
- continue;
- } else if (argv[i][0] == '-')
- continue;
- filename = argv[i];
- ret = xmlLoadCatalog(argv[i]);
- if ((ret < 0) && (create)) {
- xmlCatalogAdd(BAD_CAST "catalog", BAD_CAST argv[i], NULL);
- }
- break;
- }
-
- if (convert)
- ret = xmlCatalogConvert();
-
- if ((add) || (del)) {
- for (i = 1; i < argc ; i++) {
- if (!strcmp(argv[i], "-"))
- break;
-
- if (argv[i][0] != '-')
- continue;
- if (strcmp(argv[i], "-add") && strcmp(argv[i], "--add") &&
- strcmp(argv[i], "-del") && strcmp(argv[i], "--del"))
- continue;
-
- if (sgml) {
- /*
- * Maintenance of SGML catalogs.
- */
- xmlCatalogPtr catal = NULL;
- xmlCatalogPtr super = NULL;
-
- catal = xmlLoadSGMLSuperCatalog(argv[i + 1]);
-
- if ((!strcmp(argv[i], "-add")) ||
- (!strcmp(argv[i], "--add"))) {
- if (catal == NULL)
- catal = xmlNewCatalog(1);
- xmlACatalogAdd(catal, BAD_CAST "CATALOG",
- BAD_CAST argv[i + 2], NULL);
-
- if (!no_super_update) {
- super = xmlLoadSGMLSuperCatalog(XML_SGML_DEFAULT_CATALOG);
- if (super == NULL)
- super = xmlNewCatalog(1);
-
- xmlACatalogAdd(super, BAD_CAST "CATALOG",
- BAD_CAST argv[i + 1], NULL);
- }
- } else {
- if (catal != NULL)
- ret = xmlACatalogRemove(catal, BAD_CAST argv[i + 2]);
- else
- ret = -1;
- if (ret < 0) {
- fprintf(stderr, "Failed to remove entry from %s\n",
- argv[i + 1]);
- exit_value = 1;
- }
- if ((!no_super_update) && (noout) && (catal != NULL) &&
- (xmlCatalogIsEmpty(catal))) {
- super = xmlLoadSGMLSuperCatalog(
- XML_SGML_DEFAULT_CATALOG);
- if (super != NULL) {
- ret = xmlACatalogRemove(super,
- BAD_CAST argv[i + 1]);
- if (ret < 0) {
- fprintf(stderr,
- "Failed to remove entry from %s\n",
- XML_SGML_DEFAULT_CATALOG);
- exit_value = 1;
- }
- }
- }
- }
- if (noout) {
- FILE *out;
-
- if (xmlCatalogIsEmpty(catal)) {
- remove(argv[i + 1]);
- } else {
- out = fopen(argv[i + 1], "w");
- if (out == NULL) {
- fprintf(stderr, "could not open %s for saving\n",
- argv[i + 1]);
- exit_value = 2;
- noout = 0;
- } else {
- xmlACatalogDump(catal, out);
- fclose(out);
- }
- }
- if (!no_super_update && super != NULL) {
- if (xmlCatalogIsEmpty(super)) {
- remove(XML_SGML_DEFAULT_CATALOG);
- } else {
- out = fopen(XML_SGML_DEFAULT_CATALOG, "w");
- if (out == NULL) {
- fprintf(stderr,
- "could not open %s for saving\n",
- XML_SGML_DEFAULT_CATALOG);
- exit_value = 2;
- noout = 0;
- } else {
-
- xmlACatalogDump(super, out);
- fclose(out);
- }
- }
- }
- } else {
- xmlACatalogDump(catal, stdout);
- }
- i += 2;
- } else {
- if ((!strcmp(argv[i], "-add")) ||
- (!strcmp(argv[i], "--add"))) {
- if ((argv[i + 3] == NULL) || (argv[i + 3][0] == 0))
- ret = xmlCatalogAdd(BAD_CAST argv[i + 1], NULL,
- BAD_CAST argv[i + 2]);
- else
- ret = xmlCatalogAdd(BAD_CAST argv[i + 1],
- BAD_CAST argv[i + 2],
- BAD_CAST argv[i + 3]);
- if (ret != 0) {
- printf("add command failed\n");
- exit_value = 3;
- }
- i += 3;
- } else if ((!strcmp(argv[i], "-del")) ||
- (!strcmp(argv[i], "--del"))) {
- ret = xmlCatalogRemove(BAD_CAST argv[i + 1]);
- if (ret < 0) {
- fprintf(stderr, "Failed to remove entry %s\n",
- argv[i + 1]);
- exit_value = 1;
- }
- i += 1;
- }
- }
- }
-
- } else if (shell) {
- usershell();
- } else {
- for (i++; i < argc; i++) {
- xmlURIPtr uri;
- xmlChar *ans;
-
- uri = xmlParseURI(argv[i]);
- if (uri == NULL) {
- ans = xmlCatalogResolvePublic((const xmlChar *) argv[i]);
- if (ans == NULL) {
- printf("No entry for PUBLIC %s\n", argv[i]);
- exit_value = 4;
- } else {
- printf("%s\n", (char *) ans);
- xmlFree(ans);
- }
- } else {
- xmlFreeURI(uri);
- ans = xmlCatalogResolveSystem((const xmlChar *) argv[i]);
- if (ans == NULL) {
- printf("No entry for SYSTEM %s\n", argv[i]);
- ans = xmlCatalogResolveURI ((const xmlChar *) argv[i]);
- if (ans == NULL) {
- printf ("No entry for URI %s\n", argv[i]);
- exit_value = 4;
- } else {
- printf("%s\n", (char *) ans);
- xmlFree (ans);
- }
- } else {
- printf("%s\n", (char *) ans);
- xmlFree(ans);
- }
- }
- }
- }
- if ((!sgml) && ((add) || (del) || (create) || (convert))) {
- if (noout && filename && *filename) {
- FILE *out;
-
- out = fopen(filename, "w");
- if (out == NULL) {
- fprintf(stderr, "could not open %s for saving\n", filename);
- exit_value = 2;
- noout = 0;
- } else {
- xmlCatalogDump(out);
- }
- } else {
- xmlCatalogDump(stdout);
- }
- }
-
- /*
- * Cleanup and check for memory leaks
- */
- xmlCleanupParser();
- xmlMemoryDump();
- return(exit_value);
-}
-#else
-int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) {
- fprintf(stderr, "libxml was not compiled with catalog and output support\n");
- return(1);
-}
-#endif
diff --git a/Extras/LibXML/xmllint.c b/Extras/LibXML/xmllint.c
deleted file mode 100644
index 79025f130..000000000
--- a/Extras/LibXML/xmllint.c
+++ /dev/null
@@ -1,3490 +0,0 @@
-/*
- * xmllint.c : a small tester program for XML input.
- *
- * See Copyright for the status of this software.
- *
- * daniel@veillard.com
- */
-
-#include "libxml.h"
-
-#include
-#include
-#include
-
-#if defined (_WIN32) && !defined(__CYGWIN__)
-#if defined (_MSC_VER) || defined(__BORLANDC__)
-#include
-#pragma comment(lib, "ws2_32.lib")
-#define gettimeofday(p1,p2)
-#endif /* _MSC_VER */
-#endif /* _WIN32 */
-
-#ifdef HAVE_SYS_TIME_H
-#include
-#endif
-#ifdef HAVE_TIME_H
-#include
-#endif
-
-#ifdef __MINGW32__
-#define _WINSOCKAPI_
-#include
-#include
-#undef XML_SOCKLEN_T
-#define XML_SOCKLEN_T unsigned int
-#endif
-
-#ifdef HAVE_SYS_TIMEB_H
-#include
-#endif
-
-#ifdef HAVE_SYS_TYPES_H
-#include
-#endif
-#ifdef HAVE_SYS_STAT_H
-#include
-#endif
-#ifdef HAVE_FCNTL_H
-#include
-#endif
-#ifdef HAVE_UNISTD_H
-#include
-#endif
-#ifdef HAVE_SYS_MMAN_H
-#include
-/* seems needed for Solaris */
-#ifndef MAP_FAILED
-#define MAP_FAILED ((void *) -1)
-#endif
-#endif
-#ifdef HAVE_STDLIB_H
-#include
-#endif
-#ifdef HAVE_LIBREADLINE
-#include
-#ifdef HAVE_LIBHISTORY
-#include
-#endif
-#endif
-
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#include
-#ifdef LIBXML_XINCLUDE_ENABLED
-#include
-#endif
-#ifdef LIBXML_CATALOG_ENABLED
-#include
-#endif
-#include
-#include
-#ifdef LIBXML_SCHEMATRON_ENABLED
-#include
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
-#include
-#include
-#endif
-#ifdef LIBXML_PATTERN_ENABLED
-#include
-#endif
-#ifdef LIBXML_C14N_ENABLED
-#include
-#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, /* 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 */
-} 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;
-#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 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
-static int options = XML_PARSE_COMPACT;
-static int sax = 0;
-
-/************************************************************************
- * *
- * Entity loading control and customization. *
- * *
- ************************************************************************/
-#define MAX_PATHS 64
-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 == ':'))
- cur++;
- path = cur;
- while ((*cur != 0) && (*cur != ' ') && (*cur != ':'))
- 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) {
- 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, "");
-
- 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, "
\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, "
");
-}
-
-/**
- * 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, "error: ");
- va_start(args, msg);
- len = strlen(buffer);
- vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
- va_end(args);
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "
\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, "warning: ");
- va_start(args, msg);
- len = strlen(buffer);
- vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
- va_end(args);
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "\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, "validity error: ");
- len = strlen(buffer);
- va_start(args, msg);
- vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
- va_end(args);
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "\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, "validity warning: ");
- va_start(args, msg);
- len = strlen(buffer);
- vsnprintf(&buffer[len], sizeof(buffer) - len, msg, args);
- va_end(args);
- xmlHTMLEncodeSend();
- xmlGenericError(xmlGenericErrorContext, "\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 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) {
- path = xmlGetNodePath(xmlTextReaderCurrentNode(reader));
- printf("Node %s matches pattern %s\n", path, pattern);
- }
- }
- 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 (path == NULL) {
- path = xmlGetNodePath(
- xmlTextReaderCurrentNode(reader));
- }
- fprintf(stderr,
- "xmlPatternMatch and xmlStreamPush disagree\n");
- fprintf(stderr,
- " pattern %s node %s\n",
- pattern, path);
- }
-
-
- }
- 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 */
-
-/************************************************************************
- * *
- * Tree Test processing *
- * *
- ************************************************************************/
-static void parseAndPrintFile(char *filename, xmlParserCtxtPtr rectxt) {
- xmlDocPtr doc = NULL;
-#ifdef LIBXML_TREE_ENABLED
- xmlDocPtr tmp;
-#endif /* LIBXML_TREE_ENABLED */
-
- if ((timing) && (!repeat))
- startTimer();
-
-
-#ifdef LIBXML_TREE_ENABLED
- if (filename == NULL) {
- if (generate) {
- xmlNodePtr n;
-
- doc = xmlNewDoc(BAD_CAST "1.0");
- n = xmlNewDocNode(doc, NULL, BAD_CAST "info", NULL);
- xmlNodeSetContent(n, BAD_CAST "abc");
- xmlDocSetRootElement(doc, n);
- }
- }
-#endif /* LIBXML_TREE_ENABLED */
-#ifdef LIBXML_HTML_ENABLED
-#ifdef LIBXML_PUSH_ENABLED
- else if ((html) && (push)) {
- FILE *f;
-
-#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
- f = fopen(filename, "rb");
-#else
- f = fopen(filename, "r");
-#endif
- if (f != NULL) {
- int res, size = 3;
- char chars[4096];
- htmlParserCtxtPtr ctxt;
-
- /* if (repeat) */
- size = 4096;
- res = fread(chars, 1, 4, f);
- if (res > 0) {
- ctxt = htmlCreatePushParserCtxt(NULL, NULL,
- chars, res, filename, XML_CHAR_ENCODING_NONE);
- while ((res = fread(chars, 1, size, f)) > 0) {
- htmlParseChunk(ctxt, chars, res, 0);
- }
- htmlParseChunk(ctxt, chars, 0, 1);
- doc = ctxt->myDoc;
- htmlFreeParserCtxt(ctxt);
- }
- fclose(f);
- }
- }
-#endif /* LIBXML_PUSH_ENABLED */
- else if (html) {
- doc = htmlReadFile(filename, NULL, options);
- }
-#endif /* LIBXML_HTML_ENABLED */
- else {
-#ifdef LIBXML_PUSH_ENABLED
- /*
- * build an XML tree from a string;
- */
- if (push) {
- FILE *f;
-
- /* '-' Usually means stdin - */
- if ((filename[0] == '-') && (filename[1] == 0)) {
- f = stdin;
- } else {
-#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
- f = fopen(filename, "rb");
-#else
- f = fopen(filename, "r");
-#endif
- }
- if (f != NULL) {
- int ret;
- int res, size = 1024;
- char chars[1024];
- xmlParserCtxtPtr ctxt;
-
- /* if (repeat) size = 1024; */
- res = fread(chars, 1, 4, f);
- if (res > 0) {
- ctxt = xmlCreatePushParserCtxt(NULL, NULL,
- chars, res, filename);
- xmlCtxtUseOptions(ctxt, options);
- while ((res = fread(chars, 1, size, f)) > 0) {
- xmlParseChunk(ctxt, chars, res, 0);
- }
- xmlParseChunk(ctxt, chars, 0, 1);
- doc = ctxt->myDoc;
- ret = ctxt->wellFormed;
- xmlFreeParserCtxt(ctxt);
- if (!ret) {
- xmlFreeDoc(doc);
- doc = NULL;
- }
- }
- }
- } else
-#endif /* LIBXML_PUSH_ENABLED */
- if (testIO) {
- if ((filename[0] == '-') && (filename[1] == 0)) {
- doc = xmlReadFd(0, NULL, NULL, options);
- } else {
- FILE *f;
-
-#if defined(_WIN32) || defined (__DJGPP__) && !defined (__CYGWIN__)
- f = fopen(filename, "rb");
-#else
- f = fopen(filename, "r");
-#endif
- if (f != NULL) {
- if (rectxt == NULL)
- doc = xmlReadIO((xmlInputReadCallback) myRead,
- (xmlInputCloseCallback) myClose, f,
- filename, NULL, options);
- else
- doc = xmlCtxtReadIO(rectxt,
- (xmlInputReadCallback) myRead,
- (xmlInputCloseCallback) myClose, f,
- filename, NULL, options);
- } else
- doc = NULL;
- }
- } else if (htmlout) {
- xmlParserCtxtPtr ctxt;
-
- if (rectxt == NULL)
- ctxt = xmlNewParserCtxt();
- else
- ctxt = rectxt;
- if (ctxt == NULL) {
- doc = NULL;
- } else {
- ctxt->sax->error = xmlHTMLError;
- ctxt->sax->warning = xmlHTMLWarning;
- ctxt->vctxt.error = xmlHTMLValidityError;
- ctxt->vctxt.warning = xmlHTMLValidityWarning;
-
- doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
-
- if (rectxt == NULL)
- xmlFreeParserCtxt(ctxt);
- }
-#ifdef HAVE_SYS_MMAN_H
- } else if (memory) {
- int fd;
- struct stat info;
- const char *base;
- 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;
-
- if (rectxt == NULL)
- doc = xmlReadMemory((char *) base, info.st_size,
- filename, NULL, options);
- else
- doc = xmlCtxtReadMemory(rectxt, (char *) base, info.st_size,
- filename, NULL, options);
-
- munmap((char *) base, info.st_size);
-#endif
-#ifdef LIBXML_VALID_ENABLED
- } else if (valid) {
- xmlParserCtxtPtr ctxt = NULL;
-
- if (rectxt == NULL)
- ctxt = xmlNewParserCtxt();
- else
- ctxt = rectxt;
- if (ctxt == NULL) {
- doc = NULL;
- } else {
- doc = xmlCtxtReadFile(ctxt, filename, NULL, options);
-
- if (ctxt->valid == 0)
- progresult = XMLLINT_ERR_RDFILE;
- if (rectxt == NULL)
- xmlFreeParserCtxt(ctxt);
- }
-#endif /* LIBXML_VALID_ENABLED */
- } else {
- if (rectxt != NULL)
- doc = xmlCtxtReadFile(rectxt, filename, NULL, options);
- else {
-#ifdef LIBXML_SAX1_ENABLED
- if (sax1)
- doc = xmlParseFile(filename);
- else
-#endif /* LIBXML_SAX1_ENABLED */
- doc = xmlReadFile(filename, NULL, options);
- }
- }
- }
-
- /*
- * If we don't have a document we might as well give up. Do we
- * want an error message here? */
- if (doc == NULL) {
- progresult = XMLLINT_ERR_UNCLASS;
- return;
- }
-
- if ((timing) && (!repeat)) {
- endTimer("Parsing");
- }
-
- /*
- * Remove DOCTYPE nodes
- */
- if (dropdtd) {
- xmlDtdPtr dtd;
-
- dtd = xmlGetIntSubset(doc);
- if (dtd != NULL) {
- xmlUnlinkNode((xmlNodePtr)dtd);
- xmlFreeDtd(dtd);
- }
- }
-
-#ifdef LIBXML_XINCLUDE_ENABLED
- if (xinclude) {
- if ((timing) && (!repeat)) {
- startTimer();
- }
- if (xmlXIncludeProcessFlags(doc, options) < 0)
- progresult = XMLLINT_ERR_UNCLASS;
- if ((timing) && (!repeat)) {
- endTimer("Xinclude processing");
- }
- }
-#endif
-
-#ifdef LIBXML_DEBUG_ENABLED
-#ifdef LIBXML_XPATH_ENABLED
- /*
- * shell interaction
- */
- if (shell)
- xmlShell(doc, filename, xmlShellReadline, stdout);
-#endif
-#endif
-
-#ifdef LIBXML_TREE_ENABLED
- /*
- * test intermediate copy if needed.
- */
- if (copy) {
- tmp = doc;
- if (timing) {
- startTimer();
- }
- doc = xmlCopyDoc(doc, 1);
- if (timing) {
- endTimer("Copying");
- }
- if (timing) {
- startTimer();
- }
- xmlFreeDoc(tmp);
- if (timing) {
- endTimer("Freeing original");
- }
- }
-#endif /* LIBXML_TREE_ENABLED */
-
-#ifdef LIBXML_VALID_ENABLED
- if ((insert) && (!html)) {
- const xmlChar* list[256];
- int nb, i;
- xmlNodePtr node;
-
- if (doc->children != NULL) {
- node = doc->children;
- while ((node != NULL) && (node->last == NULL)) node = node->next;
- if (node != NULL) {
- nb = xmlValidGetValidElements(node->last, NULL, list, 256);
- if (nb < 0) {
- fprintf(stderr, "could not get valid list of elements\n");
- } else if (nb == 0) {
- fprintf(stderr, "No element can be inserted under root\n");
- } else {
- fprintf(stderr, "%d element types can be inserted under root:\n",
- nb);
- for (i = 0;i < nb;i++) {
- fprintf(stderr, "%s\n", (char *) list[i]);
- }
- }
- }
- }
- }else
-#endif /* LIBXML_VALID_ENABLED */
-#ifdef LIBXML_READER_ENABLED
- if (walker) {
- walkDoc(doc);
- }
-#endif /* LIBXML_READER_ENABLED */
-#ifdef LIBXML_OUTPUT_ENABLED
- if (noout == 0) {
- int ret;
-
- /*
- * print it.
- */
-#ifdef LIBXML_DEBUG_ENABLED
- if (!debug) {
-#endif
- if ((timing) && (!repeat)) {
- startTimer();
- }
-#ifdef LIBXML_HTML_ENABLED
- if ((html) && (!xmlout)) {
- if (compress) {
- htmlSaveFile(output ? output : "-", doc);
- }
- else if (encoding != NULL) {
- if ( format ) {
- htmlSaveFileFormat(output ? output : "-", doc, encoding, 1);
- }
- else {
- htmlSaveFileFormat(output ? output : "-", doc, encoding, 0);
- }
- }
- else if (format) {
- htmlSaveFileFormat(output ? output : "-", doc, NULL, 1);
- }
- else {
- FILE *out;
- if (output == NULL)
- out = stdout;
- else {
- out = fopen(output,"wb");
- }
- if (out != NULL) {
- if (htmlDocDump(out, doc) < 0)
- progresult = XMLLINT_ERR_OUT;
-
- if (output != NULL)
- fclose(out);
- } else {
- fprintf(stderr, "failed to open %s\n", output);
- progresult = XMLLINT_ERR_OUT;
- }
- }
- if ((timing) && (!repeat)) {
- endTimer("Saving");
- }
- } else
-#endif
-#ifdef LIBXML_C14N_ENABLED
- if (canonical) {
- xmlChar *result = NULL;
- int size;
-
- size = xmlC14NDocDumpMemory(doc, NULL, 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 (exc_canonical) {
- xmlChar *result = NULL;
- int size;
-
- size = xmlC14NDocDumpMemory(doc, NULL, 1, NULL, 1, &result);
- if (size >= 0) {
- write(1, result, size);
- xmlFree(result);
- } else {
- fprintf(stderr, "Failed to canonicalize\n");
- progresult = XMLLINT_ERR_OUT;
- }
- } else
-#endif
-#ifdef HAVE_SYS_MMAN_H
- if (memory) {
- xmlChar *result;
- int len;
-
- if (encoding != NULL) {
- if ( format ) {
- xmlDocDumpFormatMemoryEnc(doc, &result, &len, encoding, 1);
- } else {
- xmlDocDumpMemoryEnc(doc, &result, &len, encoding);
- }
- } else {
- if (format)
- xmlDocDumpFormatMemory(doc, &result, &len, 1);
- else
- xmlDocDumpMemory(doc, &result, &len);
- }
- if (result == NULL) {
- fprintf(stderr, "Failed to save\n");
- progresult = XMLLINT_ERR_OUT;
- } else {
- write(1, result, len);
- xmlFree(result);
- }
- } else
-#endif /* HAVE_SYS_MMAN_H */
- if (compress) {
- xmlSaveFile(output ? output : "-", doc);
- }
- else if (encoding != NULL) {
- if ( format ) {
- ret = xmlSaveFormatFileEnc(output ? output : "-", doc,
- encoding, 1);
- }
- else {
- ret = xmlSaveFileEnc(output ? output : "-", doc, encoding);
- }
- if (ret < 0) {
- fprintf(stderr, "failed save to %s\n",
- output ? output : "-");
- progresult = XMLLINT_ERR_OUT;
- }
- }
- else if (format) {
- ret = xmlSaveFormatFile(output ? output : "-", doc, 1);
- if (ret < 0) {
- fprintf(stderr, "failed save to %s\n",
- output ? output : "-");
- progresult = XMLLINT_ERR_OUT;
- }
- }
- else {
- FILE *out;
- if (output == NULL)
- out = stdout;
- else {
- out = fopen(output,"wb");
- }
- if (out != NULL) {
- if (xmlDocDump(out, doc) < 0)
- progresult = XMLLINT_ERR_OUT;
-
- if (output != NULL)
- fclose(out);
- } else {
- fprintf(stderr, "failed to open %s\n", output);
- progresult = XMLLINT_ERR_OUT;
- }
- }
- if ((timing) && (!repeat)) {
- endTimer("Saving");
- }
-#ifdef LIBXML_DEBUG_ENABLED
- } else {
- FILE *out;
- if (output == NULL)
- out = stdout;
- else {
- out = fopen(output,"wb");
- }
- if (out != NULL) {
- xmlDebugDumpDocument(out, doc);
-
- if (output != NULL)
- fclose(out);
- } else {
- fprintf(stderr, "failed to open %s\n", output);
- progresult = XMLLINT_ERR_OUT;
- }
- }
-#endif
- }
-#endif /* LIBXML_OUTPUT_ENABLED */
-
-#ifdef LIBXML_VALID_ENABLED
- /*
- * A posteriori validation test
- */
- if ((dtdvalid != NULL) || (dtdvalidfpi != NULL)) {
- xmlDtdPtr dtd;
-
- if ((timing) && (!repeat)) {
- startTimer();
- }
- if (dtdvalid != NULL)
- dtd = xmlParseDTD(NULL, (const xmlChar *)dtdvalid);
- else
- dtd = xmlParseDTD((const xmlChar *)dtdvalidfpi, NULL);
- if ((timing) && (!repeat)) {
- endTimer("Parsing DTD");
- }
- if (dtd == NULL) {
- if (dtdvalid != NULL)
- xmlGenericError(xmlGenericErrorContext,
- "Could not parse DTD %s\n", dtdvalid);
- else
- xmlGenericError(xmlGenericErrorContext,
- "Could not parse DTD %s\n", dtdvalidfpi);
- progresult = XMLLINT_ERR_DTD;
- } else {
- xmlValidCtxtPtr cvp;
-
- if ((cvp = xmlNewValidCtxt()) == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Couldn't allocate validation context\n");
- exit(-1);
- }
- cvp->userData = (void *) stderr;
- cvp->error = (xmlValidityErrorFunc) fprintf;
- cvp->warning = (xmlValidityWarningFunc) fprintf;
-
- if ((timing) && (!repeat)) {
- startTimer();
- }
- if (!xmlValidateDtd(cvp, doc, dtd)) {
- if (dtdvalid != NULL)
- xmlGenericError(xmlGenericErrorContext,
- "Document %s does not validate against %s\n",
- filename, dtdvalid);
- else
- xmlGenericError(xmlGenericErrorContext,
- "Document %s does not validate against %s\n",
- filename, dtdvalidfpi);
- progresult = XMLLINT_ERR_VALID;
- }
- if ((timing) && (!repeat)) {
- endTimer("Validating against DTD");
- }
- xmlFreeValidCtxt(cvp);
- xmlFreeDtd(dtd);
- }
- } else if (postvalid) {
- xmlValidCtxtPtr cvp;
-
- if ((cvp = xmlNewValidCtxt()) == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Couldn't allocate validation context\n");
- exit(-1);
- }
-
- if ((timing) && (!repeat)) {
- startTimer();
- }
- cvp->userData = (void *) stderr;
- cvp->error = (xmlValidityErrorFunc) fprintf;
- cvp->warning = (xmlValidityWarningFunc) fprintf;
- if (!xmlValidateDocument(cvp, doc)) {
- xmlGenericError(xmlGenericErrorContext,
- "Document %s does not validate\n", filename);
- progresult = XMLLINT_ERR_VALID;
- }
- if ((timing) && (!repeat)) {
- endTimer("Validating");
- }
- xmlFreeValidCtxt(cvp);
- }
-#endif /* LIBXML_VALID_ENABLED */
-#ifdef LIBXML_SCHEMATRON_ENABLED
- if (wxschematron != NULL) {
- xmlSchematronValidCtxtPtr ctxt;
- int ret;
- int flag;
-
- if ((timing) && (!repeat)) {
- startTimer();
- }
-
- if (debug)
- flag = XML_SCHEMATRON_OUT_XML;
- else
- flag = XML_SCHEMATRON_OUT_TEXT;
- if (noout)
- flag |= XML_SCHEMATRON_OUT_QUIET;
- ctxt = xmlSchematronNewValidCtxt(wxschematron, flag);
-#if 0
- xmlSchematronSetValidErrors(ctxt,
- (xmlSchematronValidityErrorFunc) fprintf,
- (xmlSchematronValidityWarningFunc) fprintf,
- stderr);
-#endif
- ret = xmlSchematronValidateDoc(ctxt, doc);
- 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;
- }
- xmlSchematronFreeValidCtxt(ctxt);
- if ((timing) && (!repeat)) {
- endTimer("Validating");
- }
- }
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
- if (relaxngschemas != NULL) {
- xmlRelaxNGValidCtxtPtr ctxt;
- int ret;
-
- if ((timing) && (!repeat)) {
- startTimer();
- }
-
- ctxt = xmlRelaxNGNewValidCtxt(relaxngschemas);
- xmlRelaxNGSetValidErrors(ctxt,
- (xmlRelaxNGValidityErrorFunc) fprintf,
- (xmlRelaxNGValidityWarningFunc) fprintf,
- stderr);
- ret = xmlRelaxNGValidateDoc(ctxt, doc);
- 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;
- }
- xmlRelaxNGFreeValidCtxt(ctxt);
- if ((timing) && (!repeat)) {
- endTimer("Validating");
- }
- } else if (wxschemas != NULL) {
- xmlSchemaValidCtxtPtr ctxt;
- int ret;
-
- if ((timing) && (!repeat)) {
- startTimer();
- }
-
- ctxt = xmlSchemaNewValidCtxt(wxschemas);
- xmlSchemaSetValidErrors(ctxt,
- (xmlSchemaValidityErrorFunc) fprintf,
- (xmlSchemaValidityWarningFunc) fprintf,
- stderr);
- ret = xmlSchemaValidateDoc(ctxt, doc);
- 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(ctxt);
- if ((timing) && (!repeat)) {
- endTimer("Validating");
- }
- }
-#endif
-
-#ifdef LIBXML_DEBUG_ENABLED
- if ((debugent) && (!html))
- xmlDebugDumpEntities(stderr, doc);
-#endif
-
- /*
- * free it.
- */
- if ((timing) && (!repeat)) {
- startTimer();
- }
- xmlFreeDoc(doc);
- if ((timing) && (!repeat)) {
- endTimer("Freeing");
- }
-}
-
-/************************************************************************
- * *
- * Usage and Main *
- * *
- ************************************************************************/
-
-static void showVersion(const char *name) {
- fprintf(stderr, "%s: using libxml version %s\n", name, xmlParserVersion);
- fprintf(stderr, " compiled with: ");
- if (xmlHasFeature(XML_WITH_THREAD)) fprintf(stderr, "Threads ");
- if (xmlHasFeature(XML_WITH_TREE)) fprintf(stderr, "Tree ");
- if (xmlHasFeature(XML_WITH_OUTPUT)) fprintf(stderr, "Output ");
- if (xmlHasFeature(XML_WITH_PUSH)) fprintf(stderr, "Push ");
- if (xmlHasFeature(XML_WITH_READER)) fprintf(stderr, "Reader ");
- 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_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 ");
- fprintf(stderr, "\n");
-}
-
-static void usage(const char *name) {
- printf("Usage : %s [options] XMLfiles ...\n", name);
-#ifdef LIBXML_OUTPUT_ENABLED
- printf("\tParse the XML files and output the result of the parsing\n");
-#else
- printf("\tParse the XML files\n");
-#endif /* LIBXML_OUTPUT_ENABLED */
- printf("\t--version : display the version of the XML library used\n");
-#ifdef LIBXML_DEBUG_ENABLED
- printf("\t--debug : dump a debug tree of the in-memory document\n");
- printf("\t--shell : run a navigating shell\n");
- printf("\t--debugent : debug the entities defined in the document\n");
-#else
-#ifdef LIBXML_READER_ENABLED
- printf("\t--debug : dump the nodes content when using --stream\n");
-#endif /* LIBXML_READER_ENABLED */
-#endif
-#ifdef LIBXML_TREE_ENABLED
- 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--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");
- printf("\t--load-trace : print trace of all external entites loaded\n");
- printf("\t--nonet : refuse to fetch DTDs or entities over network\n");
- printf("\t--nocompact : do not generate compact text nodes\n");
- printf("\t--htmlout : output results as HTML\n");
- printf("\t--nowrap : do not put HTML doc wrapper\n");
-#ifdef LIBXML_VALID_ENABLED
- printf("\t--valid : validate the document in addition to std well-formed check\n");
- printf("\t--postvalid : do a posteriori validation, i.e after parsing\n");
- printf("\t--dtdvalid URL : do a posteriori validation against a given DTD\n");
- printf("\t--dtdvalidfpi FPI : same but name the DTD with a Public Identifier\n");
-#endif /* LIBXML_VALID_ENABLED */
- printf("\t--timing : print some timings\n");
- printf("\t--output file or -o file: save to a given file\n");
- printf("\t--repeat : repeat 100 times, for timing or profiling\n");
- printf("\t--insert : ad-hoc test for valid insertions\n");
-#ifdef LIBXML_OUTPUT_ENABLED
-#ifdef HAVE_ZLIB_H
- printf("\t--compress : turn on gzip compression of output\n");
-#endif
-#endif /* LIBXML_OUTPUT_ENABLED */
-#ifdef LIBXML_HTML_ENABLED
- printf("\t--html : use the HTML parser\n");
- printf("\t--xmlout : force to use the XML serializer when using --html\n");
-#endif
-#ifdef LIBXML_PUSH_ENABLED
- printf("\t--push : use the push mode of the parser\n");
-#endif /* LIBXML_PUSH_ENABLED */
-#ifdef HAVE_SYS_MMAN_H
- printf("\t--memory : parse from memory\n");
-#endif
- printf("\t--maxmem nbbytes : limits memory allocation to nbbytes bytes\n");
- printf("\t--nowarning : do not emit warnings from parser/validator\n");
- printf("\t--noblanks : drop (ignorable?) blanks spaces\n");
- printf("\t--nocdata : replace cdata section with text nodes\n");
-#ifdef LIBXML_OUTPUT_ENABLED
- printf("\t--format : reformat/reindent the input\n");
- 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--exc-c14n : save in W3C exclusive canonical format (with comments)\n");
-#ifdef LIBXML_C14N_ENABLED
-#endif /* LIBXML_C14N_ENABLED */
- printf("\t--nsclean : remove redundant namespace declarations\n");
- printf("\t--testIO : test user I/O support\n");
-#ifdef LIBXML_CATALOG_ENABLED
- printf("\t--catalogs : use SGML catalogs from $SGML_CATALOG_FILES\n");
- printf("\t otherwise XML Catalogs starting from \n");
- printf("\t %s are activated by default\n", XML_XML_DEFAULT_CATALOG);
- printf("\t--nocatalogs: deactivate all catalogs\n");
-#endif
- printf("\t--auto : generate a small doc on the fly\n");
-#ifdef LIBXML_XINCLUDE_ENABLED
- printf("\t--xinclude : do XInclude processing\n");
- printf("\t--noxincludenode : same but do not generate XInclude nodes\n");
-#endif
- printf("\t--loaddtd : fetch external DTD\n");
- printf("\t--dtdattr : loaddtd + populate the tree with inherited attributes \n");
-#ifdef LIBXML_READER_ENABLED
- printf("\t--stream : use the streaming interface to process very large files\n");
- printf("\t--walker : create a reader and walk though the resulting doc\n");
-#endif /* LIBXML_READER_ENABLED */
-#ifdef LIBXML_PATTERN_ENABLED
- printf("\t--pattern pattern_value : test the pattern support\n");
-#endif
- printf("\t--chkregister : verify the node registration code\n");
-#ifdef LIBXML_SCHEMAS_ENABLED
- printf("\t--relaxng schema : do RelaxNG validation against the schema\n");
- printf("\t--schema schema : do validation against the WXS schema\n");
-#endif
-#ifdef LIBXML_SCHEMATRON_ENABLED
- printf("\t--schematron schema : do validation against a schematron\n");
-#endif
-#ifdef LIBXML_SAX1_ENABLED
- 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("\nLibxml project home page: http://xmlsoft.org/\n");
- printf("To report bugs or get some help check: http://xmlsoft.org/bugs.html\n");
-}
-
-static void registerNode(xmlNodePtr node)
-{
- node->_private = malloc(sizeof(long));
- *(long*)node->_private = (long) 0x81726354;
- nbregister++;
-}
-
-static void deregisterNode(xmlNodePtr node)
-{
- assert(node->_private != NULL);
- assert(*(long*)node->_private == (long) 0x81726354);
- free(node->_private);
- nbregister--;
-}
-
-int
-main(int argc, char **argv) {
- int i, acount;
- int files = 0;
- int version = 0;
- const char* indent;
-
- if (argc <= 1) {
- usage(argv[0]);
- return(1);
- }
- LIBXML_TEST_VERSION
- for (i = 1; i < argc ; i++) {
- if (!strcmp(argv[i], "-"))
- break;
-
- if (argv[i][0] != '-')
- continue;
- if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug")))
- debug++;
- else
-#ifdef LIBXML_DEBUG_ENABLED
- if ((!strcmp(argv[i], "-shell")) ||
- (!strcmp(argv[i], "--shell"))) {
- shell++;
- noout = 1;
- } else
-#endif
-#ifdef LIBXML_TREE_ENABLED
- if ((!strcmp(argv[i], "-copy")) || (!strcmp(argv[i], "--copy")))
- copy++;
- else
-#endif /* LIBXML_TREE_ENABLED */
- if ((!strcmp(argv[i], "-recover")) ||
- (!strcmp(argv[i], "--recover"))) {
- recovery++;
- options |= XML_PARSE_RECOVER;
- } else if ((!strcmp(argv[i], "-noent")) ||
- (!strcmp(argv[i], "--noent"))) {
- noent++;
- options |= XML_PARSE_NOENT;
- } 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++;
-#ifdef LIBXML_OUTPUT_ENABLED
- else if ((!strcmp(argv[i], "-o")) ||
- (!strcmp(argv[i], "-output")) ||
- (!strcmp(argv[i], "--output"))) {
- i++;
- output = argv[i];
- }
-#endif /* LIBXML_OUTPUT_ENABLED */
- 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++;
- }
-#endif /* LIBXML_HTML_ENABLED */
- else if ((!strcmp(argv[i], "-loaddtd")) ||
- (!strcmp(argv[i], "--loaddtd"))) {
- loaddtd++;
- options |= XML_PARSE_DTDLOAD;
- } else if ((!strcmp(argv[i], "-dtdattr")) ||
- (!strcmp(argv[i], "--dtdattr"))) {
- loaddtd++;
- dtdattrs++;
- options |= XML_PARSE_DTDATTR;
- }
-#ifdef LIBXML_VALID_ENABLED
- else if ((!strcmp(argv[i], "-valid")) ||
- (!strcmp(argv[i], "--valid"))) {
- valid++;
- options |= XML_PARSE_DTDVALID;
- } else if ((!strcmp(argv[i], "-postvalid")) ||
- (!strcmp(argv[i], "--postvalid"))) {
- postvalid++;
- loaddtd++;
- options |= XML_PARSE_DTDLOAD;
- } else if ((!strcmp(argv[i], "-dtdvalid")) ||
- (!strcmp(argv[i], "--dtdvalid"))) {
- i++;
- dtdvalid = argv[i];
- loaddtd++;
- options |= XML_PARSE_DTDLOAD;
- } else if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
- (!strcmp(argv[i], "--dtdvalidfpi"))) {
- i++;
- dtdvalidfpi = argv[i];
- loaddtd++;
- options |= XML_PARSE_DTDLOAD;
- }
-#endif /* LIBXML_VALID_ENABLED */
- else if ((!strcmp(argv[i], "-dropdtd")) ||
- (!strcmp(argv[i], "--dropdtd")))
- dropdtd++;
- else if ((!strcmp(argv[i], "-insert")) ||
- (!strcmp(argv[i], "--insert")))
- insert++;
- 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)
- repeat *= 10;
- else
- repeat = 100;
- }
-#ifdef LIBXML_PUSH_ENABLED
- else if ((!strcmp(argv[i], "-push")) ||
- (!strcmp(argv[i], "--push")))
- push++;
-#endif /* LIBXML_PUSH_ENABLED */
-#ifdef HAVE_SYS_MMAN_H
- 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;
- }
-#endif
-#ifdef LIBXML_OUTPUT_ENABLED
-#ifdef HAVE_ZLIB_H
- else if ((!strcmp(argv[i], "-compress")) ||
- (!strcmp(argv[i], "--compress"))) {
- compress++;
- xmlSetCompressMode(9);
- }
-#endif
-#endif /* LIBXML_OUTPUT_ENABLED */
- else if ((!strcmp(argv[i], "-nowarning")) ||
- (!strcmp(argv[i], "--nowarning"))) {
- xmlGetWarningsDefaultValue = 0;
- xmlPedanticParserDefault(0);
- options |= XML_PARSE_NOWARNING;
- }
- else if ((!strcmp(argv[i], "-pedantic")) ||
- (!strcmp(argv[i], "--pedantic"))) {
- xmlGetWarningsDefaultValue = 1;
- xmlPedanticParserDefault(1);
- options |= XML_PARSE_PEDANTIC;
- }
-#ifdef LIBXML_DEBUG_ENABLED
- else if ((!strcmp(argv[i], "-debugent")) ||
- (!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], "-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], "-encode")) ||
- (!strcmp(argv[i], "--encode"))) {
- i++;
- encoding = argv[i];
- /*
- * OK it's for testing purposes
- */
- xmlAddEncodingAlias("UTF-8", "DVEnc");
- }
- else if ((!strcmp(argv[i], "-noblanks")) ||
- (!strcmp(argv[i], "--noblanks"))) {
- noblanks++;
- xmlKeepBlanksDefault(0);
- }
- else if ((!strcmp(argv[i], "-maxmem")) ||
- (!strcmp(argv[i], "--maxmem"))) {
- i++;
- if (sscanf(argv[i], "%d", &maxmem) == 1) {
- xmlMemSetup(myFreeFunc, myMallocFunc, myReallocFunc,
- myStrdupFunc);
- } else {
- maxmem = 0;
- }
- }
- else if ((!strcmp(argv[i], "-format")) ||
- (!strcmp(argv[i], "--format"))) {
- noblanks++;
-#ifdef LIBXML_OUTPUT_ENABLED
- format++;
-#endif /* LIBXML_OUTPUT_ENABLED */
- xmlKeepBlanksDefault(0);
- }
-#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++;
- }
-#endif /* LIBXML_READER_ENABLED */
-#ifdef LIBXML_SAX1_ENABLED
- else if ((!strcmp(argv[i], "-sax1")) ||
- (!strcmp(argv[i], "--sax1"))) {
- sax1++;
- }
-#endif /* LIBXML_SAX1_ENABLED */
- else if ((!strcmp(argv[i], "-sax")) ||
- (!strcmp(argv[i], "--sax"))) {
- sax++;
- }
- else if ((!strcmp(argv[i], "-chkregister")) ||
- (!strcmp(argv[i], "--chkregister"))) {
- chkregister++;
-#ifdef LIBXML_SCHEMAS_ENABLED
- } else if ((!strcmp(argv[i], "-relaxng")) ||
- (!strcmp(argv[i], "--relaxng"))) {
- i++;
- relaxng = argv[i];
- noent++;
- options |= XML_PARSE_NOENT;
- } else if ((!strcmp(argv[i], "-schema")) ||
- (!strcmp(argv[i], "--schema"))) {
- i++;
- schema = argv[i];
- noent++;
-#endif
-#ifdef LIBXML_SCHEMATRON_ENABLED
- } else if ((!strcmp(argv[i], "-schematron")) ||
- (!strcmp(argv[i], "--schematron"))) {
- i++;
- schematron = argv[i];
- noent++;
-#endif
- } else if ((!strcmp(argv[i], "-nonet")) ||
- (!strcmp(argv[i], "--nonet"))) {
- options |= XML_PARSE_NONET;
- xmlSetExternalEntityLoader(xmlNoNetExternalEntityLoader);
- } 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_PATTERN_ENABLED
- } else if ((!strcmp(argv[i], "-pattern")) ||
- (!strcmp(argv[i], "--pattern"))) {
- i++;
- pattern = argv[i];
-#endif
- } else {
- fprintf(stderr, "Unknown option %s\n", argv[i]);
- usage(argv[0]);
- return(1);
- }
- }
-
-#ifdef LIBXML_CATALOG_ENABLED
- if (nocatalogs == 0) {
- if (catalogs) {
- const char *catal;
-
- catal = getenv("SGML_CATALOG_FILES");
- if (catal != NULL) {
- xmlLoadCatalogs(catal);
- } else {
- fprintf(stderr, "Variable $SGML_CATALOG_FILES not set\n");
- }
- }
- }
-#endif
-
-#ifdef LIBXML_SAX1_ENABLED
- if (sax1)
- xmlSAXDefaultVersion(1);
- else
- xmlSAXDefaultVersion(2);
-#endif /* LIBXML_SAX1_ENABLED */
-
- if (chkregister) {
- xmlRegisterNodeDefault(registerNode);
- xmlDeregisterNodeDefault(deregisterNode);
- }
-
- indent = getenv("XMLLINT_INDENT");
- if(indent != NULL) {
- xmlTreeIndentString = indent;
- }
-
-
- defaultEntityLoader = xmlGetExternalEntityLoader();
- xmlSetExternalEntityLoader(xmllintExternalEntityLoader);
-
- xmlLineNumbersDefault(1);
- if (loaddtd != 0)
- xmlLoadExtDtdDefaultValue |= XML_DETECT_IDS;
- if (dtdattrs)
- xmlLoadExtDtdDefaultValue |= XML_COMPLETE_ATTRS;
- if (noent != 0) xmlSubstituteEntitiesDefault(1);
-#ifdef LIBXML_VALID_ENABLED
- if (valid != 0) xmlDoValidityCheckingDefaultValue = 1;
-#endif /* LIBXML_VALID_ENABLED */
- if ((htmlout) && (!nowrap)) {
- xmlGenericError(xmlGenericErrorContext,
- "\n");
- xmlGenericError(xmlGenericErrorContext,
- "%s output\n",
- argv[0]);
- xmlGenericError(xmlGenericErrorContext,
- "%s output
\n",
- argv[0]);
- }
-
-#ifdef LIBXML_SCHEMATRON_ENABLED
- if ((schematron != NULL) && (sax == 0)
-#ifdef LIBXML_READER_ENABLED
- && (stream == 0)
-#endif /* LIBXML_READER_ENABLED */
- ) {
- xmlSchematronParserCtxtPtr ctxt;
-
- /* forces loading the DTDs */
- xmlLoadExtDtdDefaultValue |= 1;
- options |= XML_PARSE_DTDLOAD;
- if (timing) {
- startTimer();
- }
- ctxt = xmlSchematronNewParserCtxt(schematron);
-#if 0
- xmlSchematronSetParserErrors(ctxt,
- (xmlSchematronValidityErrorFunc) fprintf,
- (xmlSchematronValidityWarningFunc) fprintf,
- stderr);
-#endif
- wxschematron = xmlSchematronParse(ctxt);
- if (wxschematron == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Schematron schema %s failed to compile\n", schematron);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- schematron = NULL;
- }
- xmlSchematronFreeParserCtxt(ctxt);
- if (timing) {
- endTimer("Compiling the schemas");
- }
- }
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
- if ((relaxng != NULL) && (sax == 0)
-#ifdef LIBXML_READER_ENABLED
- && (stream == 0)
-#endif /* LIBXML_READER_ENABLED */
- ) {
- xmlRelaxNGParserCtxtPtr ctxt;
-
- /* forces loading the DTDs */
- xmlLoadExtDtdDefaultValue |= 1;
- options |= XML_PARSE_DTDLOAD;
- if (timing) {
- startTimer();
- }
- ctxt = xmlRelaxNGNewParserCtxt(relaxng);
- xmlRelaxNGSetParserErrors(ctxt,
- (xmlRelaxNGValidityErrorFunc) fprintf,
- (xmlRelaxNGValidityWarningFunc) fprintf,
- stderr);
- relaxngschemas = xmlRelaxNGParse(ctxt);
- if (relaxngschemas == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "Relax-NG schema %s failed to compile\n", relaxng);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- relaxng = NULL;
- }
- xmlRelaxNGFreeParserCtxt(ctxt);
- if (timing) {
- endTimer("Compiling the schemas");
- }
- } else if ((schema != NULL)
-#ifdef LIBXML_READER_ENABLED
- && (stream == 0)
-#endif
- ) {
- xmlSchemaParserCtxtPtr ctxt;
-
- if (timing) {
- startTimer();
- }
- ctxt = xmlSchemaNewParserCtxt(schema);
- xmlSchemaSetParserErrors(ctxt,
- (xmlSchemaValidityErrorFunc) fprintf,
- (xmlSchemaValidityWarningFunc) fprintf,
- stderr);
- wxschemas = xmlSchemaParse(ctxt);
- if (wxschemas == NULL) {
- xmlGenericError(xmlGenericErrorContext,
- "WXS schema %s failed to compile\n", schema);
- progresult = XMLLINT_ERR_SCHEMACOMP;
- schema = NULL;
- }
- xmlSchemaFreeParserCtxt(ctxt);
- if (timing) {
- endTimer("Compiling the schemas");
- }
- }
-#endif /* LIBXML_SCHEMAS_ENABLED */
-#ifdef LIBXML_PATTERN_ENABLED
- if ((pattern != NULL)
-#ifdef LIBXML_READER_ENABLED
- && (walker == 0)
-#endif
- ) {
- 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;
- }
- }
-#endif /* LIBXML_PATTERN_ENABLED */
- for (i = 1; i < argc ; i++) {
- if ((!strcmp(argv[i], "-encode")) ||
- (!strcmp(argv[i], "--encode"))) {
- i++;
- continue;
- } else if ((!strcmp(argv[i], "-o")) ||
- (!strcmp(argv[i], "-output")) ||
- (!strcmp(argv[i], "--output"))) {
- i++;
- continue;
- }
-#ifdef LIBXML_VALID_ENABLED
- if ((!strcmp(argv[i], "-dtdvalid")) ||
- (!strcmp(argv[i], "--dtdvalid"))) {
- i++;
- continue;
- }
- if ((!strcmp(argv[i], "-path")) ||
- (!strcmp(argv[i], "--path"))) {
- i++;
- continue;
- }
- if ((!strcmp(argv[i], "-dtdvalidfpi")) ||
- (!strcmp(argv[i], "--dtdvalidfpi"))) {
- i++;
- continue;
- }
-#endif /* LIBXML_VALID_ENABLED */
- if ((!strcmp(argv[i], "-relaxng")) ||
- (!strcmp(argv[i], "--relaxng"))) {
- i++;
- continue;
- }
- if ((!strcmp(argv[i], "-maxmem")) ||
- (!strcmp(argv[i], "--maxmem"))) {
- i++;
- continue;
- }
- if ((!strcmp(argv[i], "-schema")) ||
- (!strcmp(argv[i], "--schema"))) {
- i++;
- continue;
- }
- if ((!strcmp(argv[i], "-schematron")) ||
- (!strcmp(argv[i], "--schematron"))) {
- i++;
- continue;
- }
-#ifdef LIBXML_PATTERN_ENABLED
- if ((!strcmp(argv[i], "-pattern")) ||
- (!strcmp(argv[i], "--pattern"))) {
- i++;
- continue;
- }
-#endif
- if ((timing) && (repeat))
- startTimer();
- /* Remember file names. "-" means stdin. */
- if ((argv[i][0] != '-') || (strcmp(argv[i], "-") == 0)) {
- if (repeat) {
- xmlParserCtxtPtr ctxt = NULL;
-
- for (acount = 0;acount < repeat;acount++) {
-#ifdef LIBXML_READER_ENABLED
- if (stream != 0) {
- streamFile(argv[i]);
- } else {
-#endif /* LIBXML_READER_ENABLED */
- if (sax) {
- testSAX(argv[i]);
- } else {
- if (ctxt == NULL)
- ctxt = xmlNewParserCtxt();
- parseAndPrintFile(argv[i], ctxt);
- }
-#ifdef LIBXML_READER_ENABLED
- }
-#endif /* LIBXML_READER_ENABLED */
- }
- if (ctxt != NULL)
- xmlFreeParserCtxt(ctxt);
- } else {
- nbregister = 0;
-
-#ifdef LIBXML_READER_ENABLED
- if (stream != 0)
- streamFile(argv[i]);
- else
-#endif /* LIBXML_READER_ENABLED */
- if (sax) {
- testSAX(argv[i]);
- } else {
- parseAndPrintFile(argv[i], NULL);
- }
-
- if ((chkregister) && (nbregister != 0)) {
- fprintf(stderr, "Registration count off: %d\n", nbregister);
- progresult = XMLLINT_ERR_RDREGIS;
- }
- }
- files ++;
- if ((timing) && (repeat)) {
- endTimer("%d iterations", repeat);
- }
- }
- }
- if (generate)
- parseAndPrintFile(NULL, NULL);
- if ((htmlout) && (!nowrap)) {
- xmlGenericError(xmlGenericErrorContext, "\n");
- }
- if ((files == 0) && (!generate) && (version == 0)) {
- usage(argv[0]);
- }
-#ifdef LIBXML_SCHEMATRON_ENABLED
- if (wxschematron != NULL)
- xmlSchematronFree(wxschematron);
-#endif
-#ifdef LIBXML_SCHEMAS_ENABLED
- if (relaxngschemas != NULL)
- xmlRelaxNGFree(relaxngschemas);
- if (wxschemas != NULL)
- xmlSchemaFree(wxschemas);
- xmlRelaxNGCleanupTypes();
-#endif
-#ifdef LIBXML_PATTERN_ENABLED
- if (patternc != NULL)
- xmlFreePattern(patternc);
-#endif
- xmlCleanupParser();
- xmlMemoryDump();
-
- return(progresult);
-}
-