2003-01-24 01:00:09 +03:00
/*
* 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 ;
2003-02-16 18:44:18 +03:00
static int tree = 0 ;
2003-01-24 01:00:09 +03:00
# 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 + + ;
2003-02-16 18:44:18 +03:00
} else
if ( ( ! strcmp ( argv [ i ] , " -tree " ) ) | | ( ! strcmp ( argv [ i ] , " --tree " ) ) ) {
tree + + ;
2003-01-24 01:00:09 +03:00
}
}
xmlLineNumbersDefault ( 1 ) ;
2003-02-03 13:57:45 +03:00
xmlSubstituteEntitiesDefault ( 1 ) ;
2003-01-24 01:00:09 +03:00
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_DEBUG_ENABLED
if ( debug )
xmlRelaxNGDump ( stdout , schema ) ;
# endif
2003-02-16 18:44:18 +03:00
if ( tree )
xmlRelaxNGDumpTree ( stdout , schema ) ;
2003-01-24 01:00:09 +03:00
} else {
xmlDocPtr doc ;
doc = xmlParseFile ( argv [ i ] ) ;
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 ( " \t Parse 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 " ) ;
2003-02-16 18:44:18 +03:00
printf ( " \t --tree : print the intermediate Relax-NG document tree \n " ) ;
2003-01-24 01:00:09 +03:00
# 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 , char * * argv ) {
printf ( " %s : RelaxNG support not compiled in \n " , argv [ 0 ] ) ;
return ( 0 ) ;
}
# endif /* LIBXML_SCHEMAS_ENABLED */