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= 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); -} -