1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * schematron.c : implementation of the Schematron schema validity checking 3ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 4ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * See Copyright for the status of this software. 5ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 6ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Daniel Veillard <daniel@veillard.com> 7ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 8ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 9ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/* 10ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 11ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + double check the semantic, especially 12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - multiple rules applying in a single pattern/node 13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - the semantic of libxml2 patterns vs. XSLT production referenced 14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * by the spec. 15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + export of results in SVRL 16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + full parsing and coverage of the spec, conformance of the input to the 17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * spec 18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + divergences between the draft and the ISO proposed standard :-( 19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + hook and test include 20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * + try and compare with the XSLT version 21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML 24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h" 25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_SCHEMATRON_ENABLED 27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h> 29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h> 30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/tree.h> 31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h> 32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpath.h> 33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xpathInternals.h> 34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/pattern.h> 35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/schematron.h> 36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SCHEMATRON_PARSE_OPTIONS XML_PARSE_NOENT 38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define SCT_OLD_NS BAD_CAST "http://www.ascc.net/xml/schematron" 40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_SCHEMATRON_NS BAD_CAST "http://purl.oclc.org/dsdl/schematron" 42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *xmlSchematronNs = XML_SCHEMATRON_NS; 45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *xmlOldSchematronNs = SCT_OLD_NS; 46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_SCHEMATRON(node, elem) \ 48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((node != NULL) && (node->type == XML_ELEMENT_NODE ) && \ 49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (node->ns != NULL) && \ 50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(node->name, (const xmlChar *) elem)) && \ 51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrEqual(node->ns->href, xmlSchematronNs)) || \ 52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(node->ns->href, xmlOldSchematronNs)))) 53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define NEXT_SCHEMATRON(node) \ 55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (node != NULL) { \ 5694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((node->type == XML_ELEMENT_NODE ) && (node->ns != NULL) && \ 57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((xmlStrEqual(node->ns->href, xmlSchematronNs)) || \ 58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlStrEqual(node->ns->href, xmlOldSchematronNs)))) \ 59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; \ 60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = node->next; \ 61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO: 65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * macro to flag unimplemented blocks 67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 6894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define TODO \ 69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericError(xmlGenericErrorContext, \ 70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Unimplemented block at %s:%d\n", \ 71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __FILE__, __LINE__); 72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum { 74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMATRON_ASSERT=1, 75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMATRON_REPORT=2 76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlSchematronTestType; 77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchematronTest: 80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A Schematrons test, either an assert or a report 82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchematronTest xmlSchematronTest; 84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchematronTest *xmlSchematronTestPtr; 85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchematronTest { 86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestPtr next; /* the next test in the list */ 87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestType type; /* the test type */ 88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* the node in the tree */ 89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *test; /* the expression to test */ 90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; /* the compiled expression */ 91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *report; /* the message to report */ 92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchematronRule: 96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A Schematrons rule 98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchematronRule xmlSchematronRule; 100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchematronRule *xmlSchematronRulePtr; 101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchematronRule { 102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr next; /* the next rule in the list */ 103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr patnext;/* the next rule in the pattern list */ 104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node; /* the node in the tree */ 105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *context; /* the context evaluation rule */ 106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestPtr tests; /* the list of tests */ 107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr pattern; /* the compiled pattern associated */ 108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *report; /* the message to report */ 109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchematronPattern: 113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A Schematrons pattern 115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlSchematronPattern xmlSchematronPattern; 117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlSchematronPattern *xmlSchematronPatternPtr; 118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchematronPattern { 119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr next;/* the next pattern in the list */ 120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr rules; /* the list of rules */ 121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *name; /* the name of the pattern */ 122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlSchematron: 126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A Schematrons definition 128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchematron { 130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *name; /* schema name */ 131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int preserve; /* was the document passed by the user */ 132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; /* pointer to the parsed document */ 133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* specific to this schematron */ 134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *_private; /* unused by the library */ 136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; /* the dictionnary used internally */ 137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *title; /* the title if any */ 139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbNs; /* the number of namespaces */ 141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbPattern; /* the number of patterns */ 143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr patterns;/* the patterns found */ 144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr rules; /* the rules gathered */ 145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbNamespaces; /* number of namespaces in the array */ 146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxNamespaces; /* size of the array */ 147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **namespaces; /* the array of namespaces */ 148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronValidCtxt: 152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A Schematrons validation context 154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchematronValidCtxt { 156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int type; 157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int flags; /* an or of xmlSchematronValidOptions */ 158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; 160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nberrors; 161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int err; 162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPtr schema; 164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr xctxt; 165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project FILE *outputFile; /* if using XML_SCHEMATRON_OUT_FILE */ 167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlBufferPtr outputBuffer; /* if using XML_SCHEMATRON_OUT_BUFFER */ 168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputWriteCallback iowrite; /* if using XML_SCHEMATRON_OUT_IO */ 169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlOutputCloseCallback ioclose; 170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *ioctx; 17160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 17260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* error reporting data */ 17360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott void *userData; /* user specific data block */ 17460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlSchematronValidityErrorFunc error;/* the callback in case of errors */ 17560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlSchematronValidityWarningFunc warning;/* callback in case of warning */ 17660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlStructuredErrorFunc serror; /* the structured function */ 177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlSchematronParserCtxt { 180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int type; 181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *URL; 182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int preserve; /* Whether the doc should be freed */ 184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *buffer; 185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int size; 186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictPtr dict; /* dictionnary for interned string names */ 188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nberrors; 190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int err; 191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathContextPtr xctxt; /* the XPath context used for compilation */ 192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPtr schema; 193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbNamespaces; /* number of namespaces in the array */ 195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxNamespaces; /* size of the array */ 196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **namespaces; /* the array of namespaces */ 197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbIncludes; /* number of includes in the array */ 199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int maxIncludes; /* size of the array */ 200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *includes; /* the array of includes */ 201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 20260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott /* error reporting data */ 203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *userData; /* user specific data block */ 204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronValidityErrorFunc error;/* the callback in case of errors */ 205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronValidityWarningFunc warning;/* callback in case of warning */ 206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc serror; /* the structured function */ 207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}; 208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STRON_CTXT_PARSER 1 210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_STRON_CTXT_VALIDATOR 2 211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Error reporting * 215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronPErrMemory: 220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a context node 221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronPErrMemory(xmlSchematronParserCtxtPtr ctxt, 227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *extra, xmlNodePtr node) 228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) 230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nberrors++; 231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlSimpleError(XML_FROM_SCHEMASP, XML_ERR_NO_MEMORY, node, NULL, 232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extra); 233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronPErr: 237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parsing context 238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the context node 239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error: the error code 240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the error message 241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1: extra data 242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2: extra data 24394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * 244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a parser error 245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronPErr(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr node, int error, 248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg, const xmlChar * str1, const xmlChar * str2) 249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlGenericErrorFunc channel = NULL; 251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlStructuredErrorFunc schannel = NULL; 252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project void *data = NULL; 253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nberrors++; 256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project channel = ctxt->error; 257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project data = ctxt->userData; 258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schannel = ctxt->serror; 259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlRaiseError(schannel, channel, data, ctxt, node, XML_FROM_SCHEMASP, 261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project error, XML_ERR_ERROR, NULL, 0, 262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (const char *) str1, (const char *) str2, NULL, 0, 0, 263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project msg, str1, str2); 264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronVTypeErrMemory: 268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: a context node 269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra: extra informations 270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle an out of memory condition 272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronVErrMemory(xmlSchematronValidCtxtPtr ctxt, 275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *extra, xmlNodePtr node) 276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt != NULL) { 278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nberrors++; 279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->err = XML_SCHEMAV_INTERNAL; 280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project __xmlSimpleError(XML_FROM_SCHEMASV, XML_ERR_NO_MEMORY, node, NULL, 282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project extra); 283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Parsing and compilation of the Schematrontrons * 288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronAddTest: 293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parsing context 294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type: the type of test 295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @rule: the parent rule 296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node hosting the test 297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @test: the associated test 298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @report: the associated report string 299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a test to a schematron 301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new pointer or NULL in case of error 303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchematronTestPtr 305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronAddTest(xmlSchematronParserCtxtPtr ctxt, 306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestType type, 307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr rule, 308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node, xmlChar *test, xmlChar *report) 309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestPtr ret; 311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathCompExprPtr comp; 312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (rule == NULL) || (node == NULL) || 314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (test == NULL)) 315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * try first to compile the test expression 319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project comp = xmlXPathCtxtCompile(ctxt->xctxt, test); 321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (comp == NULL) { 322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, node, 323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to compile test expression %s", 325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test, NULL); 326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlSchematronTestPtr) xmlMalloc(sizeof(xmlSchematronTest)); 330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(ctxt, "allocating schema test", node); 332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlSchematronTest)); 335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = type; 336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = node; 337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->test = test; 338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->comp = comp; 339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->report = report; 340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = NULL; 341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (rule->tests == NULL) { 342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule->tests = ret; 343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestPtr prev = rule->tests; 345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (prev->next != NULL) 347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = prev->next; 348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->next = ret; 349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronFreeTests: 355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @tests: a list of tests 356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a list of tests. 358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronFreeTests(xmlSchematronTestPtr tests) { 361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestPtr next; 362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (tests != NULL) { 364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = tests->next; 365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tests->test != NULL) 366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(tests->test); 367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tests->comp != NULL) 368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeCompExpr(tests->comp); 369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tests->report != NULL) 370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(tests->report); 371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(tests); 372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tests = next; 373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronAddRule: 378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parsing context 379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node hosting the rule 381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @context: the associated context string 382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @report: the associated report string 383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a rule to a schematron 385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new pointer or NULL in case of error 387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchematronRulePtr 389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronAddRule(xmlSchematronParserCtxtPtr ctxt, xmlSchematronPtr schema, 390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr pat, xmlNodePtr node, 391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *context, xmlChar *report) 392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr ret; 394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlPatternPtr pattern; 395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || 397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (context == NULL)) 398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try first to compile the pattern 402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pattern = xmlPatterncompile(context, ctxt->dict, XML_PATTERN_XPATH, 404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->namespaces); 405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pattern == NULL) { 406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, node, 407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Failed to compile context expression %s", 409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context, NULL); 410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlSchematronRulePtr) xmlMalloc(sizeof(xmlSchematronRule)); 413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(ctxt, "allocating schema rule", node); 415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlSchematronRule)); 418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->node = node; 419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->context = context; 420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->pattern = pattern; 421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->report = report; 422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = NULL; 423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->rules == NULL) { 424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->rules = ret; 425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr prev = schema->rules; 427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (prev->next != NULL) 429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = prev->next; 430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->next = ret; 431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->patnext = NULL; 433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pat->rules == NULL) { 434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pat->rules = ret; 435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr prev = pat->rules; 437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (prev->patnext != NULL) 439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = prev->patnext; 440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->patnext = ret; 441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronFreeRules: 447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @rules: a list of rules 448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a list of rules. 450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronFreeRules(xmlSchematronRulePtr rules) { 453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr next; 454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (rules != NULL) { 456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = rules->next; 457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (rules->tests) 458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreeTests(rules->tests); 459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (rules->context != NULL) 460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(rules->context); 461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (rules->pattern) 462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreePattern(rules->pattern); 463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (rules->report != NULL) 464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(rules->report); 465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(rules); 466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rules = next; 467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronAddPattern: 472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parsing context 473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the node hosting the pattern 475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @id: the id or name of the pattern 476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a pattern to a schematron 478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new pointer or NULL in case of error 480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchematronPatternPtr 482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronAddPattern(xmlSchematronParserCtxtPtr ctxt, 483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPtr schema, xmlNodePtr node, xmlChar *name) 484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr ret; 486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (schema == NULL) || (node == NULL) || (name == NULL)) 488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlSchematronPatternPtr) xmlMalloc(sizeof(xmlSchematronPattern)); 491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(ctxt, "allocating schema pattern", node); 493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlSchematronPattern)); 496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->name = name; 497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->next = NULL; 498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->patterns == NULL) { 499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->patterns = ret; 500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr prev = schema->patterns; 502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (prev->next != NULL) 504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev = prev->next; 505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project prev->next = ret; 506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronFreePatterns: 512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @patterns: a list of patterns 513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a list of patterns. 515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronFreePatterns(xmlSchematronPatternPtr patterns) { 518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr next; 519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (patterns != NULL) { 521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project next = patterns->next; 522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (patterns->name != NULL) 523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(patterns->name); 524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(patterns); 525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project patterns = next; 526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronNewSchematron: 531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new Schematron structure. 534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error 536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlSchematronPtr 538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronNewSchematron(xmlSchematronParserCtxtPtr ctxt) 539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPtr ret; 541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlSchematronPtr) xmlMalloc(sizeof(xmlSchematron)); 543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(ctxt, "allocating schema", NULL); 545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlSchematron)); 548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->dict = ctxt->dict; 549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictReference(ret->dict); 550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronFree: 556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a schema structure 557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a Schematron structure. 559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronFree(xmlSchematronPtr schema) 562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) 564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((schema->doc != NULL) && (!(schema->preserve))) 567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(schema->doc); 568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema->namespaces != NULL) 570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char **) schema->namespaces); 57194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreeRules(schema->rules); 573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreePatterns(schema->patterns); 574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(schema->dict); 575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(schema); 576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronNewParserCtxt: 580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL: the location of the schema 581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schematrons parse context for that file/resource expected 583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML Schematrons file. 584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronParserCtxtPtr 588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronNewParserCtxt(const char *URL) 589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronParserCtxtPtr ret; 591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URL == NULL) 593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlSchematronParserCtxtPtr) 597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlSchematronParserCtxt)); 598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating schema parser context", 600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlSchematronParserCtxt)); 604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_STRON_CTXT_PARSER; 605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->dict = xmlDictCreate(); 606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->URL = xmlDictLookup(ret->dict, (const xmlChar *) URL, -1); 607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->includes = NULL; 608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->xctxt = xmlXPathNewContext(NULL); 609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->xctxt == NULL) { 610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", 611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreeParserCtxt(ret); 613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->xctxt->flags = XML_XPATH_CHECKNS; 616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronNewMemParserCtxt: 621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer: a pointer to a char array containing the schemas 622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size: the size of the array 623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schematrons parse context for that memory buffer expected 625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML Schematrons file. 626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronParserCtxtPtr 630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronNewMemParserCtxt(const char *buffer, int size) 631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronParserCtxtPtr ret; 633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((buffer == NULL) || (size <= 0)) 635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlSchematronParserCtxtPtr) 639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlSchematronParserCtxt)); 640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating schema parser context", 642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlSchematronParserCtxt)); 646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->buffer = buffer; 647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->size = size; 648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->dict = xmlDictCreate(); 649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->xctxt = xmlXPathNewContext(NULL); 650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->xctxt == NULL) { 651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", 652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreeParserCtxt(ret); 654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronNewDocParserCtxt: 661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: a preparsed document tree 662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schematrons parse context for that document. 664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NB. The document may be modified during the parsing process. 665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error 667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronParserCtxtPtr 669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronNewDocParserCtxt(xmlDocPtr doc) 670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronParserCtxtPtr ret; 672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) 674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = 677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (xmlSchematronParserCtxtPtr) 678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(sizeof(xmlSchematronParserCtxt)); 679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating schema parser context", 681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlSchematronParserCtxt)); 685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->dict = xmlDictCreate(); 687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* The application has responsibility for the document */ 688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->preserve = 1; 689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->xctxt = xmlXPathNewContext(doc); 690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->xctxt == NULL) { 691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", 692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreeParserCtxt(ret); 694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronFreeParserCtxt: 702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context 703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema parser context 705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronFreeParserCtxt(xmlSchematronParserCtxtPtr ctxt) 708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->doc != NULL && !ctxt->preserve) 712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(ctxt->doc); 713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->xctxt != NULL) { 714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeContext(ctxt->xctxt); 715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->namespaces != NULL) 717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree((char **) ctxt->namespaces); 718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(ctxt->dict); 719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronPushInclude: 725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context 726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc: the included document 727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current include node 728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add an included document 730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronPushInclude(xmlSchematronParserCtxtPtr ctxt, 733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc, xmlNodePtr cur) 734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->includes == NULL) { 736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxIncludes = 10; 737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->includes = (xmlNodePtr *) 738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(ctxt->maxIncludes * 2 * sizeof(xmlNodePtr)); 739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->includes == NULL) { 740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating parser includes", 741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbIncludes = 0; 745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->nbIncludes + 2 >= ctxt->maxIncludes) { 746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr *tmp; 747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (xmlNodePtr *) 749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRealloc(ctxt->includes, ctxt->maxIncludes * 4 * 750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(xmlNodePtr)); 751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating parser includes", 753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->includes = tmp; 757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxIncludes *= 2; 758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->includes[2 * ctxt->nbIncludes] = cur; 760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->includes[2 * ctxt->nbIncludes + 1] = (xmlNodePtr) doc; 761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbIncludes++; 762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronPopInclude: 766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context 767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop an include level. The included document is being freed 769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the node immediately following the include or NULL if the 771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * include list was empty. 772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronPopInclude(xmlSchematronParserCtxtPtr ctxt) 775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ret; 778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nbIncludes <= 0) 780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbIncludes--; 782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = (xmlDocPtr) ctxt->includes[2 * ctxt->nbIncludes + 1]; 783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ctxt->includes[2 * ctxt->nbIncludes]; 784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) 786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = ret->next; 787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(xmlSchematronPopInclude(ctxt)); 789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronAddNamespace: 795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema parser context 796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prefix: the namespace prefix 797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns: the namespace name 798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a namespace definition in the context 800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronAddNamespace(xmlSchematronParserCtxtPtr ctxt, 803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *prefix, const xmlChar *ns) 804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->namespaces == NULL) { 806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxNamespaces = 10; 807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->namespaces = (const xmlChar **) 808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMalloc(ctxt->maxNamespaces * 2 * sizeof(const xmlChar *)); 809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->namespaces == NULL) { 810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating parser namespaces", 811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbNamespaces = 0; 815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->nbNamespaces + 2 >= ctxt->maxNamespaces) { 816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar **tmp; 817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project tmp = (const xmlChar **) 819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlRealloc((xmlChar **) ctxt->namespaces, ctxt->maxNamespaces * 4 * 820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project sizeof(const xmlChar *)); 821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (tmp == NULL) { 822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating parser namespaces", 823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->namespaces = tmp; 827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->maxNamespaces *= 2; 828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 82994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->namespaces[2 * ctxt->nbNamespaces] = 830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictLookup(ctxt->dict, ns, -1); 83194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun ctxt->namespaces[2 * ctxt->nbNamespaces + 1] = 832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictLookup(ctxt->dict, prefix, -1); 833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nbNamespaces++; 834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->namespaces[2 * ctxt->nbNamespaces] = NULL; 835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->namespaces[2 * ctxt->nbNamespaces + 1] = NULL; 836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronParseRule: 841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @rule: the rule node 843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a rule element 845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronParseRule(xmlSchematronParserCtxtPtr ctxt, 848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr pattern, 849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr rule) 850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbChecks = 0; 853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *test; 854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *context; 855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *report; 856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr ruleptr; 857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestPtr testptr; 858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (rule == NULL)) return; 860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project context = xmlGetNoNsProp(rule, BAD_CAST "context"); 862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (context == NULL) { 863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, rule, 864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "rule has no context attribute", 866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (context[0] == 0) { 869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, rule, 870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "rule has an empty context attribute", 872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(context); 874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ruleptr = xmlSchematronAddRule(ctxt, ctxt->schema, pattern, 877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule, context, NULL); 878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ruleptr == NULL) { 879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(context); 880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = rule->children; 885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT_SCHEMATRON(cur); 886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_SCHEMATRON(cur, "assert")) { 888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbChecks++; 889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test = xmlGetNoNsProp(cur, BAD_CAST "test"); 890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (test == NULL) { 891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "assert has no test attribute", 894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (test[0] == 0) { 896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "assert has an empty test attribute", 899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(test); 901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO will need dynamic processing instead */ 903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project report = xmlNodeGetContent(cur); 904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project testptr = xmlSchematronAddTest(ctxt, XML_SCHEMATRON_ASSERT, 906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ruleptr, cur, test, report); 907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (testptr == NULL) 908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(test); 909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (IS_SCHEMATRON(cur, "report")) { 911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbChecks++; 912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test = xmlGetNoNsProp(cur, BAD_CAST "test"); 913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (test == NULL) { 914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "assert has no test attribute", 917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (test[0] == 0) { 919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "assert has an empty test attribute", 922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(test); 924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO will need dynamic processing instead */ 926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project report = xmlNodeGetContent(cur); 927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project testptr = xmlSchematronAddTest(ctxt, XML_SCHEMATRON_REPORT, 929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ruleptr, cur, test, report); 930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (testptr == NULL) 931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(test); 932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expecting an assert or a report element instead of %s", 937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur->name, NULL); 938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT_SCHEMATRON(cur); 941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbChecks == 0) { 943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, rule, 944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "rule has no assert nor report element", NULL, NULL); 946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronParsePattern: 951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pat: the pattern node 953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a pattern element 955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronParsePattern(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr pat) 958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur; 960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr pattern; 961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int nbRules = 0; 962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *id; 963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (pat == NULL)) return; 965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project id = xmlGetNoNsProp(pat, BAD_CAST "id"); 967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id == NULL) { 968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project id = xmlGetNoNsProp(pat, BAD_CAST "name"); 969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pattern = xmlSchematronAddPattern(ctxt, ctxt->schema, pat, id); 971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pattern == NULL) { 972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (id != NULL) 973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(id); 974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = pat->children; 977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT_SCHEMATRON(cur); 978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_SCHEMATRON(cur, "rule")) { 980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronParseRule(ctxt, pattern, cur); 981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project nbRules++; 982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expecting a rule element instead of %s", cur->name, NULL); 986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT_SCHEMATRON(cur); 989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (nbRules == 0) { 991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, pat, 992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Pattern has no rule element", NULL, NULL); 994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronLoadInclude: 1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the include element 1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Load the include document, Push the current pointer 1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the updated node pointer 1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronLoadInclude(xmlSchematronParserCtxtPtr ctxt, xmlNodePtr cur) 1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr ret = NULL; 1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc = NULL; 1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *href = NULL; 1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *base = NULL; 1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *URI = NULL; 1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (cur == NULL)) 1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project href = xmlGetNoNsProp(cur, BAD_CAST "href"); 1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (href == NULL) { 1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Include has no href attribute", NULL, NULL); 1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur->next); 1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* do the URI base composition, load and find the root */ 1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project base = xmlNodeGetBase(cur->doc, cur); 1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI = xmlBuildURI(href, base); 1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadFile((const char *) URI, NULL, SCHEMATRON_PARSE_OPTIONS); 1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_FAILED_LOAD, 1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "could not load include '%s'.\n", 1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI, NULL); 1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlDocGetRootElement(doc); 1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_FAILED_LOAD, 1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "could not find root from include '%s'.\n", 1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project URI, NULL); 1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto done; 1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* Success, push the include for rollback on exit */ 1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPushInclude(ctxt, doc, cur); 1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectdone: 1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc != NULL) 1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(href); 1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (base != NULL) 1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(base); 1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (URI != NULL) 1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(URI); 1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronParse: 1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a schema validation context 1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a schema definition resource and build an internal 1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML Shema struture which can be used to validate instances. 1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML Schematron structure built from the resource or 1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * NULL in case of error 1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronPtr 1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronParse(xmlSchematronParserCtxtPtr ctxt) 1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPtr ret = NULL; 1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr doc; 1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr root, cur; 1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int preserve = 0; 1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nberrors = 0; 1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First step is to parse the input document into an DOM/Infoset 1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->URL != NULL) { 1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadFile((const char *) ctxt->URL, NULL, 1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SCHEMATRON_PARSE_OPTIONS); 1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, NULL, 1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_FAILED_LOAD, 1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlSchematronParse: could not load '%s'.\n", 1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->URL, NULL); 1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->preserve = 0; 1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->buffer != NULL) { 1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = xmlReadMemory(ctxt->buffer, ctxt->size, NULL, NULL, 1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project SCHEMATRON_PARSE_OPTIONS); 1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (doc == NULL) { 1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, NULL, 1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_FAILED_PARSE, 1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlSchematronParse: could not parse.\n", 1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer"); 1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->URL = xmlDictLookup(ctxt->dict, BAD_CAST "in_memory_buffer", -1); 1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->preserve = 0; 1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else if (ctxt->doc != NULL) { 1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project doc = ctxt->doc; 1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project preserve = 1; 1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->preserve = 1; 1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, NULL, 1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOTHING_TO_PARSE, 1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "xmlSchematronParse: could not parse.\n", 1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL, NULL); 1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Then extract the root and Schematron parse it 1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(doc); 1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, (xmlNodePtr) doc, 1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "The schema has no document element.\n", NULL, NULL); 1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!preserve) { 1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!IS_SCHEMATRON(root, "schema")) { 1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, root, 1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "The XML document '%s' is not a XML schematron document", 1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->URL, NULL); 1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto exit; 1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchematronNewSchematron(ctxt); 1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto exit; 1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->schema = ret; 1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * scan the schema elements 1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = root->children; 1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT_SCHEMATRON(cur); 1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_SCHEMATRON(cur, "title")) { 1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *title = xmlNodeGetContent(cur); 1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (title != NULL) { 1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->title = xmlDictLookup(ret->dict, title, -1); 1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(title); 1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT_SCHEMATRON(cur); 1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (IS_SCHEMATRON(cur, "ns")) { 1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *prefix = xmlGetNoNsProp(cur, BAD_CAST "prefix"); 1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *uri = xmlGetNoNsProp(cur, BAD_CAST "uri"); 1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((uri == NULL) || (uri[0] == 0)) { 1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ns element has no uri", NULL, NULL); 1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix == NULL) || (prefix[0] == 0)) { 1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "ns element has no prefix", NULL, NULL); 1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((prefix) && (uri)) { 1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterNs(ctxt->xctxt, prefix, uri); 1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronAddNamespace(ctxt, prefix, uri); 1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbNs++; 1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (uri) 1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(uri); 1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (prefix) 1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(prefix); 1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT_SCHEMATRON(cur); 1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (IS_SCHEMATRON(cur, "pattern")) { 1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronParsePattern(ctxt, cur); 1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbPattern++; 1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, cur, 1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "Expecting a pattern element instead of %s", cur->name, NULL); 1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NEXT_SCHEMATRON(cur); 1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->nbPattern == 0) { 1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErr(ctxt, root, 1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_SCHEMAP_NOROOT, 1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project "The schematron document '%s' has no pattern", 1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->URL, NULL); 1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project goto exit; 1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* the original document must be kept for reporting */ 1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->doc = doc; 1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (preserve) { 1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->preserve = 1; 1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project preserve = 1; 1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectexit: 1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (!preserve) { 1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(doc); 1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) { 1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->nberrors != 0) { 1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFree(ret); 1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = NULL; 1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->namespaces = ctxt->namespaces; 1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->nbNamespaces = ctxt->nbNamespaces; 1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->namespaces = NULL; 1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Schematrontron Reports handler * 1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronGetNode(xmlSchematronValidCtxtPtr ctxt, 1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, const xmlChar *xpath) { 1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr node = NULL; 1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (cur == NULL) || (xpath == NULL)) 1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->xctxt->doc = cur->doc; 1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->xctxt->node = cur; 1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathEval(xpath, ctxt->xctxt); 1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) 1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(NULL); 1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->type == XPATH_NODESET) && 1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->nodesetval != NULL) && (ret->nodesetval->nodeNr > 0)) 1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = ret->nodesetval->nodeTab[0]; 1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(ret); 1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(node); 1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronReportOutput: 1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node tested 1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg: the message output 1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Output part of the report to whatever channel the user selected 1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronReportOutput(xmlSchematronValidCtxtPtr ctxt ATTRIBUTE_UNUSED, 1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur ATTRIBUTE_UNUSED, 1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const char *msg) { 1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* TODO */ 1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "%s", msg); 1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronFormatReport: 1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @test: the test node 1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node tested 1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Build the string being reported to the user. 1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a report string or NULL in case of error. The string needs 1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to be deallocated by teh caller 1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar * 129194442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlSchematronFormatReport(xmlSchematronValidCtxtPtr ctxt, 1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr test, xmlNodePtr cur) { 1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *ret = NULL; 1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr child, node; 1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((test == NULL) || (cur == NULL)) 1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = test->children; 1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (child != NULL) { 1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((child->type == XML_TEXT_NODE) || 1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (child->type == XML_CDATA_SECTION_NODE)) 1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrcat(ret, child->content); 1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if (IS_SCHEMATRON(child, "name")) { 1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *path; 1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project path = xmlGetNoNsProp(child, BAD_CAST "path"); 1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = cur; 1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (path != NULL) { 1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = xmlSchematronGetNode(ctxt, cur, path); 1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (node == NULL) 1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project node = cur; 1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(path); 1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 131794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun if ((node->ns == NULL) || (node->ns->prefix == NULL)) 1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrcat(ret, node->name); 1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else { 1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrcat(ret, node->ns->prefix); 1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrcat(ret, BAD_CAST ":"); 1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlStrcat(ret, node->name); 1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project continue; 1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * remove superfluous \n 1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret != NULL) { 1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int len = xmlStrlen(ret); 1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar c; 1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len > 0) { 1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = ret[len - 1]; 1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((c == ' ') || (c == '\n') || (c == '\r') || (c == '\t')) { 1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while ((c == ' ') || (c == '\n') || 1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (c == '\r') || (c == '\t')) { 1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project len--; 1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (len == 0) 1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project c = ret[len - 1]; 1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret[len] = ' '; 1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret[len + 1] = 0; 1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project child = child->next; 1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ret); 1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronReportSuccess: 1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @test: the compiled test 1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node tested 1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @success: boolean value for the result 1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * called from the validation engine when an assert or report test have 1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * been done. 1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 136894442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlSchematronReportSuccess(xmlSchematronValidCtxtPtr ctxt, 136960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlSchematronTestPtr test, xmlNodePtr cur, xmlSchematronPatternPtr pattern, int success) { 1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (cur == NULL) || (test == NULL)) 1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* if quiet and not SVRL report only failures */ 1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) && 1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((ctxt->flags & XML_SCHEMATRON_OUT_XML) == 0) && 1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (test->type == XML_SCHEMATRON_REPORT)) 1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & XML_SCHEMATRON_OUT_XML) { 1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlChar *path; 1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char msg[1000]; 1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project long line; 1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project const xmlChar *report = NULL; 1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (((test->type == XML_SCHEMATRON_REPORT) & (!success)) || 1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ((test->type == XML_SCHEMATRON_ASSERT) & (success))) 1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project line = xmlGetLineNo(cur); 1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project path = xmlGetNodePath(cur); 1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (path == NULL) 1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project path = (xmlChar *) cur->name; 1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0 1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((test->report != NULL) && (test->report[0] != 0)) 1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project report = test->report; 1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (test->node != NULL) 1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project report = xmlSchematronFormatReport(ctxt, test->node, cur); 1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (report == NULL) { 1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (test->type == XML_SCHEMATRON_ASSERT) { 140060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott report = xmlStrdup((const xmlChar *) "node failed assert"); 1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 140260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott report = xmlStrdup((const xmlChar *) "node failed report"); 140360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 999, "%s line %ld: %s\n", (const char *) path, 1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project line, (const char *) report); 140760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 140860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt->flags & XML_SCHEMATRON_OUT_ERROR) { 140960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlStructuredErrorFunc schannel = NULL; 141060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlGenericErrorFunc channel = NULL; 141160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott void *data = NULL; 141260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 141360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt != NULL) { 141460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt->serror != NULL) 141560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott schannel = ctxt->serror; 141660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott else 141760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott channel = ctxt->error; 141860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott data = ctxt->userData; 1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 142060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 142160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott __xmlRaiseError(schannel, channel, data, 142260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott NULL, cur, XML_FROM_SCHEMATRONV, 142360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (test->type == XML_SCHEMATRON_ASSERT)?XML_SCHEMATRONV_ASSERT:XML_SCHEMATRONV_REPORT, 142460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott XML_ERR_ERROR, NULL, line, 142560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (pattern == NULL)?NULL:((const char *) pattern->name), 142660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (const char *) path, 142760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott (const char *) report, 0, 0, 142843ff9b493a5b9d65ae1661455a22fb2f62a3b352Nick Kralevich "%s", msg); 142960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } else { 1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronReportOutput(ctxt, cur, &msg[0]); 143160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott } 143260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 143360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlFree((char *) report); 143460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((path != NULL) && (path != (xmlChar *) cur->name)) 1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(path); 1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronReportPattern: 1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context 1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @pattern: the current pattern 1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * called from the validation engine when starting to check a pattern 1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void 144894442ad4107000e6d49f9b85a46a591495a57632Selim GurunxmlSchematronReportPattern(xmlSchematronValidCtxtPtr ctxt, 1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr pattern) { 1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (pattern == NULL)) 1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 145260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) || (ctxt->flags & XML_SCHEMATRON_OUT_ERROR)) /* Error gives pattern name as part of error */ 1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->flags & XML_SCHEMATRON_OUT_XML) { 1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project char msg[1000]; 1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pattern->name == NULL) 1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project snprintf(msg, 999, "Pattern: %s\n", (const char *) pattern->name); 1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronReportOutput(ctxt, NULL, &msg[0]); 1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************ 1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validation against a Schematrontron * 1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * * 1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/ 1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 147460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * xmlSchematronSetValidStructuredErrors: 147560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctxt: a Schematron validation context 147660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @serror: the structured error function 147760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * @ctx: the functions context 147860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * 147960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott * Set the structured error callback 148060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott */ 148160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scottvoid 148260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick ScottxmlSchematronSetValidStructuredErrors(xmlSchematronValidCtxtPtr ctxt, 148360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlStructuredErrorFunc serror, void *ctx) 148460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott{ 148560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott if (ctxt == NULL) 148660a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott return; 148760a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->serror = serror; 148860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->error = NULL; 148960a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->warning = NULL; 149060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott ctxt->userData = ctx; 149160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott} 149260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott 149360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott/** 1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronNewValidCtxt: 1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema: a precompiled XML Schematrons 1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @options: a set of xmlSchematronValidOptions 1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML Schematrons validation context based on the given schema. 1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the validation context or NULL in case of error 1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronValidCtxtPtr 1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronNewValidCtxt(xmlSchematronPtr schema, int options) 1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int i; 1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronValidCtxtPtr ret; 1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = (xmlSchematronValidCtxtPtr) xmlMalloc(sizeof(xmlSchematronValidCtxt)); 1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronVErrMemory(NULL, "allocating validation context", 1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project memset(ret, 0, sizeof(xmlSchematronValidCtxt)); 1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->type = XML_STRON_CTXT_VALIDATOR; 1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->schema = schema; 1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->xctxt = xmlXPathNewContext(NULL); 1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret->flags = options; 1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret->xctxt == NULL) { 1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPErrMemory(NULL, "allocating schema parser XPath context", 1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project NULL); 1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreeValidCtxt(ret); 1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (NULL); 1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project for (i = 0;i < schema->nbNamespaces;i++) { 1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((schema->namespaces[2 * i] == NULL) || 1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (schema->namespaces[2 * i + 1] == NULL)) 1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathRegisterNs(ret->xctxt, schema->namespaces[2 * i + 1], 1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema->namespaces[2 * i]); 1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (ret); 1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronFreeValidCtxt: 1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context 1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context 1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid 1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronFreeValidCtxt(xmlSchematronValidCtxtPtr ctxt) 1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt == NULL) 1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return; 1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->xctxt != NULL) 1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeContext(ctxt->xctxt); 1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ctxt->dict != NULL) 1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDictFree(ctxt->dict); 1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFree(ctxt); 1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr 1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronNextNode(xmlNodePtr cur) { 1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children != NULL) { 1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Do not descend on entities declarations 1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->children->type != XML_ENTITY_DECL) { 1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->children; 1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip DTDs 1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type != XML_DTD_NODE) 1565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur->next != NULL) { 1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((cur->type != XML_ENTITY_DECL) && 1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (cur->type != XML_DTD_NODE)) 1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 157594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project do { 1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->parent; 1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur == NULL) break; 1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->type == XML_DOCUMENT_NODE) return(NULL); 1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (cur->next != NULL) { 1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = cur->next; 1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } while (cur != NULL); 1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(cur); 1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronRunTest: 1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context 1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @test: the current test 159294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @instance: the document instace tree 1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur: the current node in the instance 1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a rule against a tree instance at a given position 1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 in case of success, 0 if error and -1 in case of internal error 1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int 1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronRunTest(xmlSchematronValidCtxtPtr ctxt, 160160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlSchematronTestPtr test, xmlDocPtr instance, xmlNodePtr cur, xmlSchematronPatternPtr pattern) 1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathObjectPtr ret; 1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int failed; 1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = 0; 1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->xctxt->doc = instance; 1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->xctxt->node = cur; 1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlXPathCompiledEval(test->comp, ctxt->xctxt); 1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (ret == NULL) { 1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = 1; 1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project switch (ret->type) { 1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_XSLT_TREE: 1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NODESET: 1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->nodesetval == NULL) || 1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->nodesetval->nodeNr == 0)) 1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = 1; 1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_BOOLEAN: 1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = !ret->boolval; 1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_NUMBER: 1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((xmlXPathIsNaN(ret->floatval)) || 1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->floatval == 0.0)) 1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = 1; 1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_STRING: 1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ret->stringval == NULL) || 1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ret->stringval[0] == 0)) 1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = 1; 1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_UNDEFINED: 1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_POINT: 1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_RANGE: 1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_LOCATIONSET: 1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project case XPATH_USERS: 1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project failed = 1; 1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project break; 1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlXPathFreeObject(ret); 1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((failed) && (test->type == XML_SCHEMATRON_ASSERT)) 1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nberrors++; 1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project else if ((!failed) && (test->type == XML_SCHEMATRON_REPORT)) 1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nberrors++; 1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 164860a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlSchematronReportSuccess(ctxt, test, cur, pattern, !failed); 1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(!failed); 1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/** 1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlSchematronValidateDoc: 1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the schema validation context 165694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @instance: the document instace tree 1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a tree instance against the schematron 1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of internal error 1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * and an error count otherwise. 1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlSchematronValidateDoc(xmlSchematronValidCtxtPtr ctxt, xmlDocPtr instance) 1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlNodePtr cur, root; 1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPatternPtr pattern; 1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronRulePtr rule; 1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronTestPtr test; 1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt == NULL) || (ctxt->schema == NULL) || 1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->schema->rules == NULL) || (instance == NULL)) 1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(-1); 1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nberrors = 0; 1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project root = xmlDocGetRootElement(instance); 1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (root == NULL) { 1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project TODO 1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ctxt->nberrors++; 1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(1); 1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((ctxt->flags & XML_SCHEMATRON_OUT_QUIET) || 1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project (ctxt->flags == 0)) { 1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * we are just trying to assert the validity of the document, 1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * speed primes over the output, run in a single pass 1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = root; 1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule = ctxt->schema->rules; 1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (rule != NULL) { 1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlPatternMatch(rule->pattern, cur) == 1) { 1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test = rule->tests; 1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (test != NULL) { 169460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlSchematronRunTest(ctxt, test, instance, cur, (xmlSchematronPatternPtr)rule->pattern); 1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test = test->next; 1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule = rule->next; 1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 170094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlSchematronNextNode(cur); 1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process all contexts one at a time 1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pattern = ctxt->schema->patterns; 170894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (pattern != NULL) { 1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronReportPattern(ctxt, pattern); 1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project /* 1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * TODO convert the pattern rule to a direct XPath and 1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * compute directly instead of using the pattern matching 171594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * over the full document... 1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check the exact semantic 1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */ 1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = root; 1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (cur != NULL) { 1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule = pattern->rules; 1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (rule != NULL) { 1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (xmlPatternMatch(rule->pattern, cur) == 1) { 1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test = rule->tests; 1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project while (test != NULL) { 172560a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott xmlSchematronRunTest(ctxt, test, instance, cur, pattern); 1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project test = test->next; 1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project rule = rule->patnext; 1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 173194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun 1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project cur = xmlSchematronNextNode(cur); 1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pattern = pattern->next; 1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return(ctxt->nberrors); 1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef STANDALONE 1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint 1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectmain(void) 1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{ 1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project int ret; 1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlDocPtr instance; 1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronParserCtxtPtr pctxt; 1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronValidCtxtPtr vctxt; 1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronPtr schema = NULL; 1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project pctxt = xmlSchematronNewParserCtxt("tst.sct"); 1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (pctxt == NULL) { 1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "failed to build schematron parser\n"); 1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project schema = xmlSchematronParse(pctxt); 1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (schema == NULL) { 1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "failed to compile schematron\n"); 1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreeParserCtxt(pctxt); 1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project instance = xmlReadFile("tst.sct", NULL, 1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project XML_PARSE_NOENT | XML_PARSE_NOCDATA); 1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (instance == NULL) { 1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "failed to parse instance\n"); 1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if ((schema != NULL) && (instance != NULL)) { 1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project vctxt = xmlSchematronNewValidCtxt(schema); 1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project if (vctxt == NULL) { 1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project fprintf(stderr, "failed to build schematron validator\n"); 1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } else { 1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ret = xmlSchematronValidateDoc(vctxt, instance); 1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFreeValidCtxt(vctxt); 1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project } 1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlSchematronFree(schema); 1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlFreeDoc(instance); 1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlCleanupParser(); 1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project xmlMemoryDump(); 1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project 1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project return (0); 1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} 1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif 1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_schematron 1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h" 1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SCHEMATRON_ENABLED */ 1786