| /* |
| * testRelax.c : a small tester program for RelaxNG validation |
| * |
| * See Copyright for the status of this software. |
| * |
| * Daniel.Veillard@w3.org |
| */ |
| |
| #include "libxml.h" |
| #ifdef LIBXML_SCHEMAS_ENABLED |
| |
| #include <libxml/xmlversion.h> |
| #include <libxml/parser.h> |
| |
| #include <stdio.h> |
| #include <string.h> |
| #include <stdarg.h> |
| |
| |
| #ifdef HAVE_SYS_TYPES_H |
| #include <sys/types.h> |
| #endif |
| #ifdef HAVE_SYS_STAT_H |
| #include <sys/stat.h> |
| #endif |
| #ifdef HAVE_FCNTL_H |
| #include <fcntl.h> |
| #endif |
| #ifdef HAVE_UNISTD_H |
| #include <unistd.h> |
| #endif |
| #ifdef HAVE_STDLIB_H |
| #include <stdlib.h> |
| #endif |
| #ifdef HAVE_SYS_MMAN_H |
| #include <sys/mman.h> |
| /* seems needed for Solaris */ |
| #ifndef MAP_FAILED |
| #define MAP_FAILED ((void *) -1) |
| #endif |
| #endif |
| |
| #include <libxml/xmlmemory.h> |
| #include <libxml/debugXML.h> |
| #include <libxml/relaxng.h> |
| |
| #ifdef LIBXML_DEBUG_ENABLED |
| static int debug = 0; |
| #endif |
| static int noout = 0; |
| static int tree = 0; |
| #ifdef HAVE_SYS_MMAN_H |
| static int memory = 0; |
| #endif |
| |
| |
| int main(int argc, char **argv) { |
| int i; |
| int files = 0; |
| xmlRelaxNGPtr schema = NULL; |
| |
| for (i = 1; i < argc ; i++) { |
| #ifdef LIBXML_DEBUG_ENABLED |
| if ((!strcmp(argv[i], "-debug")) || (!strcmp(argv[i], "--debug"))) |
| debug++; |
| else |
| #endif |
| #ifdef HAVE_SYS_MMAN_H |
| if ((!strcmp(argv[i], "-memory")) || (!strcmp(argv[i], "--memory"))) { |
| memory++; |
| } else |
| #endif |
| if ((!strcmp(argv[i], "-noout")) || (!strcmp(argv[i], "--noout"))) { |
| noout++; |
| } else |
| if ((!strcmp(argv[i], "-tree")) || (!strcmp(argv[i], "--tree"))) { |
| tree++; |
| } |
| } |
| xmlLineNumbersDefault(1); |
| xmlSubstituteEntitiesDefault(1); |
| for (i = 1; i < argc ; i++) { |
| if (argv[i][0] != '-') { |
| if (schema == NULL) { |
| xmlRelaxNGParserCtxtPtr ctxt; |
| |
| #ifdef HAVE_SYS_MMAN_H |
| if (memory) { |
| int fd; |
| struct stat info; |
| const char *base; |
| if (stat(argv[i], &info) < 0) |
| break; |
| if ((fd = open(argv[i], O_RDONLY)) < 0) |
| break; |
| base = mmap(NULL, info.st_size, PROT_READ, |
| MAP_SHARED, fd, 0) ; |
| if (base == (void *) MAP_FAILED) |
| break; |
| |
| ctxt = xmlRelaxNGNewMemParserCtxt((char *)base,info.st_size); |
| |
| xmlRelaxNGSetParserErrors(ctxt, |
| (xmlRelaxNGValidityErrorFunc) fprintf, |
| (xmlRelaxNGValidityWarningFunc) fprintf, |
| stderr); |
| schema = xmlRelaxNGParse(ctxt); |
| xmlRelaxNGFreeParserCtxt(ctxt); |
| munmap((char *) base, info.st_size); |
| } else |
| #endif |
| { |
| ctxt = xmlRelaxNGNewParserCtxt(argv[i]); |
| xmlRelaxNGSetParserErrors(ctxt, |
| (xmlRelaxNGValidityErrorFunc) fprintf, |
| (xmlRelaxNGValidityWarningFunc) fprintf, |
| stderr); |
| schema = xmlRelaxNGParse(ctxt); |
| xmlRelaxNGFreeParserCtxt(ctxt); |
| } |
| if (schema == NULL) { |
| printf("Relax-NG schema %s failed to compile\n", argv[i]); |
| files = -1; |
| break; |
| } |
| #ifdef LIBXML_OUTPUT_ENABLED |
| #ifdef LIBXML_DEBUG_ENABLED |
| if (debug) |
| xmlRelaxNGDump(stdout, schema); |
| #endif |
| if (tree) |
| xmlRelaxNGDumpTree(stdout, schema); |
| #endif /* LIBXML_OUTPUT_ENABLED */ |
| } else { |
| xmlDocPtr doc; |
| |
| doc = xmlReadFile(argv[i],NULL,0); |
| |
| if (doc == NULL) { |
| fprintf(stderr, "Could not parse %s\n", argv[i]); |
| } else { |
| xmlRelaxNGValidCtxtPtr ctxt; |
| int ret; |
| |
| ctxt = xmlRelaxNGNewValidCtxt(schema); |
| xmlRelaxNGSetValidErrors(ctxt, |
| (xmlRelaxNGValidityErrorFunc) fprintf, |
| (xmlRelaxNGValidityWarningFunc) fprintf, |
| stderr); |
| ret = xmlRelaxNGValidateDoc(ctxt, doc); |
| if (ret == 0) { |
| printf("%s validates\n", argv[i]); |
| } else if (ret > 0) { |
| printf("%s fails to validate\n", argv[i]); |
| } else { |
| printf("%s validation generated an internal error\n", |
| argv[i]); |
| } |
| xmlRelaxNGFreeValidCtxt(ctxt); |
| xmlFreeDoc(doc); |
| } |
| } |
| files ++; |
| } |
| } |
| if (schema != NULL) |
| xmlRelaxNGFree(schema); |
| if (files == 0) { |
| printf("Usage : %s [--debug] [--noout] schemas XMLfiles ...\n", |
| argv[0]); |
| printf("\tParse the HTML files and output the result of the parsing\n"); |
| #ifdef LIBXML_DEBUG_ENABLED |
| printf("\t--debug : dump a debug tree of the in-memory document\n"); |
| #endif |
| printf("\t--noout : do not print the result\n"); |
| printf("\t--tree : print the intermediate Relax-NG document tree\n"); |
| #ifdef HAVE_SYS_MMAN_H |
| printf("\t--memory : test the schemas in memory parsing\n"); |
| #endif |
| } |
| xmlRelaxNGCleanupTypes(); |
| xmlCleanupParser(); |
| xmlMemoryDump(); |
| |
| return(0); |
| } |
| |
| #else |
| #include <stdio.h> |
| int main(int argc ATTRIBUTE_UNUSED, char **argv ATTRIBUTE_UNUSED) { |
| printf("%s : RelaxNG support not compiled in\n", argv[0]); |
| return(0); |
| } |
| #endif /* LIBXML_SCHEMAS_ENABLED */ |