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