#include #include #include #include #include #include #include static void err_func(FILE *d, const char *msg, ...) { va_list ap; va_start(ap, msg); fprintf(d, "START OUTPUT FROM err_func\n"); vfprintf(d, msg, ap); fprintf(d, "END OUTPUT FROM error_func\n"); va_end(ap); } static void test(const char *xml, const char *rng_schema, void *error_func) { xmlDoc *doc; xmlRelaxNGPtr schema; xmlRelaxNGValidCtxtPtr validctxt; xmlRelaxNGParserCtxtPtr rngparser; doc = xmlParseFile(xml); rngparser = xmlRelaxNGNewParserCtxt(rng_schema); schema = xmlRelaxNGParse(rngparser); validctxt = xmlRelaxNGNewValidCtxt(schema); xmlRelaxNGSetValidErrors(validctxt, (xmlRelaxNGValidityErrorFunc) error_func, (xmlRelaxNGValidityWarningFunc) error_func, stderr); /* Setting this doesn't appear to do anything.*/ xmlRelaxNGSetParserErrors(rngparser, (xmlRelaxNGValidityErrorFunc) error_func, (xmlRelaxNGValidityWarningFunc) error_func, stderr); xmlRelaxNGSetParserStructuredErrors(rngparser, (xmlStructuredErrorFunc) error_func, stderr); /* Setting this gives no error output. The error functions are still called but there is no error * message passed to them. */ /*xmlRelaxNGSetValidStructuredErrors(validctxt, (xmlStructuredErrorFunc) error_func, stderr);*/ /* Strange things happen when these are set multiple times */ /*xmlSetGenericErrorFunc(stderr, (xmlGenericErrorFunc) error_func);*/ /*xmlSetStructuredErrorFunc(stderr, (xmlStructuredErrorFunc) error_func);*/ xmlRelaxNGValidateDoc(validctxt, doc); xmlRelaxNGFree(schema); xmlRelaxNGFreeValidCtxt(validctxt); xmlRelaxNGFreeParserCtxt(rngparser); xmlFreeDoc(doc); } int main(int argc, char *argv[]) { if (argc < 5) { fputs("./a.out #1-5 xml1.xml xml2.xml schema.rng\n", stderr); return 1; } if (*argv[1] == '1' || *argv[1] == '5') { puts("Test 1 - fprintf error handler"); test(argv[2], argv[4], fprintf); puts("END Test 1\n"); } if (*argv[1] == '2' || *argv[1] == '5') { puts("Test 2 - custom error handler"); test(argv[2], argv[4], err_func); puts("END Test 2\n"); } if (*argv[1] == '3' || *argv[1] == '5') { puts("Test 3 - fprintf structural error"); test(argv[3], argv[4], fprintf); puts("END Test 3\n"); } if (*argv[1] == '4' || *argv[1] == '5') { puts("Test 4 - custom error handler structural error"); test(argv[3], argv[4], err_func); puts("END Test 4\n"); } return 0; }