1ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
2ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * relaxng.c : implementation of the Relax-NG handling and 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 <veillard@redhat.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 * - add support for DTD compatibility spec
12ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   http://www.oasis-open.org/committees/relax-ng/compatibility-20011203.html
13ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * - report better mem allocations pbms at runtime and abort immediately.
14ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
15ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
16ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IN_LIBXML
17ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "libxml.h"
18ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
19ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_SCHEMAS_ENABLED
20ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
21ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <string.h>
22ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <stdio.h>
23ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlmemory.h>
24ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parser.h>
25ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/parserInternals.h>
26ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/hash.h>
27ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/uri.h>
28ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
29ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/relaxng.h>
30ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
31ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlschemastypes.h>
32ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlautomata.h>
33ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlregexp.h>
34ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include <libxml/xmlschemastypes.h>
35ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
36ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/*
37ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The Relax-NG namespace
38ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
39ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *xmlRelaxNGNs = (const xmlChar *)
40ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    "http://relaxng.org/ns/structure/1.0";
41ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
42ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_RELAXNG(node, type)						\
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   ((node != NULL) && (node->ns != NULL) &&				\
44ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (xmlStrEqual(node->name, (const xmlChar *) type)) &&		\
45ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (xmlStrEqual(node->ns->href, xmlRelaxNGNs)))
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG 1
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_GRAMMAR 1
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_CONTENT 1
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_TYPE 1
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID 1
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_INTERLEAVE 1
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_LIST 1
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_INCLUDE 1
64ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_ERROR 1
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_COMPILE 1
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_PROGRESSIVE 1
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_ERROR 5
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define TODO 								\
75ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Unimplemented block at %s:%d\n",				\
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGSchema xmlRelaxNGSchema;
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr;
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGDefine xmlRelaxNGDefine;
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr;
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGDocument xmlRelaxNGDocument;
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGDocument *xmlRelaxNGDocumentPtr;
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGInclude xmlRelaxNGInclude;
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGInclude *xmlRelaxNGIncludePtr;
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_COMBINE_UNDEFINED = 0,  /* undefined */
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_COMBINE_CHOICE, /* choice */
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_COMBINE_INTERLEAVE      /* interleave */
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGCombine;
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CONTENT_ERROR = -1,
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CONTENT_EMPTY = 0,
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CONTENT_SIMPLE,
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CONTENT_COMPLEX
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGContentType;
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGGrammar xmlRelaxNGGrammar;
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGGrammar *xmlRelaxNGGrammarPtr;
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGGrammar {
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr parent;        /* the parent grammar if any */
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr children;      /* the children grammar if any */
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr next;  /* the next grammar if any */
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr start;  /* <start> content */
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGCombine combine;  /* the default combine value */
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr startList;      /* list of <start> definitions */
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr defs;       /* define* */
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr refs;       /* references */
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_NOOP = -1,      /* a no operation from simplification  */
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_EMPTY = 0,      /* an empty pattern */
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_NOT_ALLOWED,    /* not allowed top */
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_EXCEPT,         /* except present in nameclass defs */
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_TEXT,           /* textual content */
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_ELEMENT,        /* an element */
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_DATATYPE,       /* extenal data type definition */
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_PARAM,          /* extenal data type parameter */
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_VALUE,          /* value from an extenal data type definition */
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_LIST,           /* a list of patterns */
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_ATTRIBUTE,      /* an attrbute following a pattern */
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_DEF,            /* a definition */
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_REF,            /* reference to a definition */
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_EXTERNALREF,    /* reference to an external def */
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_PARENTREF,      /* reference to a def in the parent grammar */
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_OPTIONAL,       /* optional patterns */
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_ZEROORMORE,     /* zero or more non empty patterns */
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_ONEORMORE,      /* one or more non empty patterns */
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CHOICE,         /* a choice between non empty patterns */
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_GROUP,          /* a pair/group of non empty patterns */
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_INTERLEAVE,     /* interleaving choice of non-empty patterns */
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_START           /* Used to keep track of starts on grammars */
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGType;
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NULLABLE		(1 << 0)
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NOT_NULLABLE		(1 << 1)
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_INDETERMINIST	(1 << 2)
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_MIXED		(1 << 3)
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_TRIABLE		(1 << 4)
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_PROCESSED		(1 << 5)
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_COMPILABLE		(1 << 6)
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NOT_COMPILABLE	(1 << 7)
152df143a5041f03a22808b59c76698770b74692815Selim Gurun#define IS_EXTERNAL_REF	        (1 << 8)
153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGDefine {
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGType type;        /* the type of definition */
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;            /* the node in the source */
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;              /* the element local name if present */
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ns;                /* the namespace local name if present */
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value;             /* value when available */
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data;                 /* data lib or specific pointer */
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr content;        /* the expected content */
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr parent; /* the parent definition, if any */
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr next;   /* list within grouping sequences */
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr attrs;  /* list of attributes for elements */
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr nameClass;      /* the nameClass definition if any */
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr nextHash;       /* next define in defs/refs hash tables */
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    short depth;                /* used for the cycle detection */
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    short dflags;               /* define related flags */
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegexpPtr contModel;     /* a compiled content model if available */
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlRelaxNG:
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs definition
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNG {
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *_private;             /* unused by the library for users or bindings */
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr topgrammar;
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int idref;                  /* requires idref checking */
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr defs;       /* define */
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr refs;       /* references */
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr documents;    /* all the documents loaded */
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr includes;      /* all the includes loaded */
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int defNr;                  /* number of defines used */
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *defTab;        /* pointer to the allocated definitions */
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ATTRIBUTE	(1 << 0)
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ONEORMORE	(1 << 1)
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_LIST		(1 << 2)
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_DATAEXCEPT	(1 << 3)
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_START		(1 << 4)
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_OOMGROUP		(1 << 5)
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_OOMINTERLEAVE	(1 << 6)
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_EXTERNALREF	(1 << 7)
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ANYEXCEPT	(1 << 8)
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_NSEXCEPT		(1 << 9)
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGParserCtxt {
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *userData;             /* user specific data block */
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidityErrorFunc error;  /* the callback in case of errors */
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidityWarningFunc warning;      /* the callback in case of warning */
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc serror;
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErr err;
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;       /* The schema in use */
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr grammar;       /* the current grammar */
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr parentgrammar; /* the parent grammar */
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;                  /* parser flags */
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbErrors;               /* number of errors at parse time */
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbWarnings;             /* number of warnings at parse time */
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *define;      /* the current define scope */
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def;    /* the current define */
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbInterleaves;
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr interleaves;        /* keep track of all the interleaves */
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr documents;    /* all the documents loaded */
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr includes;      /* all the includes loaded */
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *URL;
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr document;
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int defNr;                  /* number of defines used */
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int defMax;                 /* number of defines aloocated */
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *defTab;        /* pointer to the allocated definitions */
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *buffer;
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the document stack */
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr doc;  /* Current parsed external ref */
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int docNr;                  /* Depth of the parsing stack */
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int docMax;                 /* Max depth of the parsing stack */
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr *docTab;      /* array of docs */
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the include stack */
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr inc;   /* Current parsed include */
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int incNr;                  /* Depth of the include parsing stack */
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int incMax;                 /* Max depth of the parsing stack */
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr *incTab;       /* array of incs */
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int idref;                  /* requires idref checking */
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* used to compile content models */
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataPtr am;          /* the automata */
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataStatePtr state;  /* used to build the automata */
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int crng;			/* compact syntax and other flags */
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int freedoc;		/* need to free the document */
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_IGNORABLE		1
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_NEGATIVE		2
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_MIXED_CONTENT	4
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_NOERROR		8
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInterleaveGroup:
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs partition set associated to lists of definitions
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGInterleaveGroup xmlRelaxNGInterleaveGroup;
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGInterleaveGroup *xmlRelaxNGInterleaveGroupPtr;
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGInterleaveGroup {
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr rule;   /* the rule to satisfy */
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *defs;  /* the array of element definitions */
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *attrs; /* the array of attributes definitions */
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_DETERMINIST		1
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NEEDCHECK		2
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGPartitions:
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs partition associated to an interleave group
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGPartition xmlRelaxNGPartition;
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGPartition *xmlRelaxNGPartitionPtr;
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGPartition {
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbgroups;               /* number of groups in the partitions */
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr triage;     /* hash table used to direct nodes to the
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 * right group when possible */
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;                  /* determinist ? */
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr *groups;
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidState:
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation state
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_ATTR 20
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGValidState xmlRelaxNGValidState;
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr;
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidState {
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;            /* the current node */
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr seq;             /* the sequence of children left to validate */
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAttrs;                /* the number of attributes */
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxAttrs;               /* the size of attrs */
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAttrLeft;             /* the number of attributes left to validate */
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value;             /* the value when operating on string */
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *endvalue;          /* the end value when operating on string */
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr *attrs;          /* the array of attributes */
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGStates:
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs container for validation state
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGStates xmlRelaxNGStates;
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGStates *xmlRelaxNGStatesPtr;
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGStates {
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbState;                /* the number of states */
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxState;               /* the size of the array */
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr *tabState;
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR_IS_DUP	1
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidError:
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation error
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGValidError xmlRelaxNGValidError;
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr;
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidError {
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErr err;     /* the error number */
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;                  /* flags */
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;            /* the current node */
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr seq;             /* the current child */
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *arg1;        /* first arg */
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *arg2;        /* second arg */
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidCtxt:
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation context
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidCtxt {
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *userData;             /* user specific data block */
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidityErrorFunc error;  /* the callback in case of errors */
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidityWarningFunc warning;      /* the callback in case of warning */
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc serror;
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbErrors;               /* number of errors in validation */
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;       /* The schema in use */
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;              /* the document being validated */
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;                  /* validation flags */
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth;                  /* validation depth */
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int idref;                  /* requires idref checking */
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errNo;                  /* the first error found */
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Errors accumulated in branches may have to be stacked to be
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * provided back when it's sure they affect validation.
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr err;        /* Last error */
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errNr;                  /* Depth of the error stack */
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errMax;                 /* Max depth of the error stack */
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr errTab;     /* stack of errors */
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;      /* the current validation state */
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr states; /* the accumulated state list */
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr freeState;      /* the pool of free valid states */
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int freeStatesNr;
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int freeStatesMax;
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr *freeStates;    /* the pool of free state groups */
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * This is used for "progressive" validation
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr elem;     /* the current element regexp */
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int elemNr;                 /* the number of element validated */
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int elemMax;                /* the max depth of elements */
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr *elemTab; /* the stack of regexp runtime */
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pstate;                 /* progressive state */
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr pnode;           /* the current node */
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr pdef;   /* the non-streamable definition */
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int perr;                   /* signal error in content model
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 * outside the regexp */
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInclude:
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to a RelaxNGs document element
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGInclude {
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr next;  /* keep a chain of includes */
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *href;              /* the normalized href value */
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;              /* the associated XML document */
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr content;        /* the definitions */
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;       /* the schema */
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocument:
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to a RelaxNGs document element
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGDocument {
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr next; /* keep a chain of documents */
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *href;              /* the normalized href value */
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;              /* the associated XML document */
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr content;        /* the definitions */
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;       /* the schema */
418df143a5041f03a22808b59c76698770b74692815Selim Gurun    int externalRef;            /* 1 if an external ref */
419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Some factorized error routines				*
425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngPErrMemory:
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an Relax-NG parser context
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt, const char *extra)
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->serror != NULL)
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->serror;
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->error;
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->userData;
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nbErrors++;
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (extra)
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlRaiseError(schannel, channel, data,
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, XML_FROM_RELAXNGP,
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra,
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, 0, 0,
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Memory allocation failed : %s\n", extra);
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlRaiseError(schannel, channel, data,
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, XML_FROM_RELAXNGP,
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL,
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, 0, 0, "Memory allocation failed\n");
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngVErrMemory:
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt, const char *extra)
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->serror != NULL)
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->serror;
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->error;
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->userData;
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nbErrors++;
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (extra)
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlRaiseError(schannel, channel, data,
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, XML_FROM_RELAXNGV,
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra,
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, 0, 0,
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Memory allocation failed : %s\n", extra);
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlRaiseError(schannel, channel, data,
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, XML_FROM_RELAXNGV,
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL,
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, 0, 0, "Memory allocation failed\n");
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngPErr:
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node raising the error
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error:  the error code
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg:  message
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  extra info
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  extra info
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a Relax NG Parsing error
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, int error,
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           const char *msg, const xmlChar * str1, const xmlChar * str2)
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->serror != NULL)
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->serror;
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->error;
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->userData;
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nbErrors++;
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data,
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    NULL, node, XML_FROM_RELAXNGP,
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    error, XML_ERR_ERROR, NULL, 0,
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (const char *) str1, (const char *) str2, NULL, 0, 0,
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    msg, str1, str2);
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngVErr:
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node raising the error
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error:  the error code
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg:  message
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  extra info
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  extra info
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a Relax NG Validation error
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error,
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           const char *msg, const xmlChar * str1, const xmlChar * str2)
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->serror != NULL)
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->serror;
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->error;
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->userData;
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nbErrors++;
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data,
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    NULL, node, XML_FROM_RELAXNGV,
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    error, XML_ERR_ERROR, NULL, 0,
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (const char *) str1, (const char *) str2, NULL, 0, 0,
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    msg, str1, str2);
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Preliminary type checking interfaces			*
569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeHave:
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check if a type is exported
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeHave) (void *data, const xmlChar * type);
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeCheck:
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @result:  place to store the result if needed
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check if a value match a type
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeCheck) (void *data, const xmlChar * type,
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    const xmlChar * value, void **result,
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlNodePtr node);
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFacetCheck:
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet name
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the facet value
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strval:  the string value
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check a value facet
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGFacetCheck) (void *data, const xmlChar * type,
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     const xmlChar * facet,
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     const xmlChar * val,
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     const xmlChar * strval, void *value);
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeFree:
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @result:  the value to free
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to free a returned result
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef void (*xmlRelaxNGTypeFree) (void *data, void *result);
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeCompare:
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1:  the first value
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2:  the second value
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to compare two values accordingly
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to a type.
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar * type,
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      const xmlChar * value1,
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      xmlNodePtr ctxt1,
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      void *comp1,
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      const xmlChar * value2,
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      xmlNodePtr ctxt2);
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary;
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr;
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGTypeLibrary {
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *namespace;   /* the datatypeLibrary value */
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data;                 /* data needed for the library */
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeHave have;    /* the export function */
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeCheck check;  /* the checking function */
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeCompare comp; /* the compare function */
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGFacetCheck facet; /* the facet check function */
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeFree freef;   /* the freeing function */
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Allocation functions				*
659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar);
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define);
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGNormExtSpace(xmlChar * value);
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema);
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     ATTRIBUTE_UNUSED,
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     xmlRelaxNGValidStatePtr state1,
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     xmlRelaxNGValidStatePtr state2);
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     xmlRelaxNGValidStatePtr state);
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDocument:
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @docu:  a document structure
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG document structure.
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDocument(xmlRelaxNGDocumentPtr docu)
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu == NULL)
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu->href != NULL)
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(docu->href);
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu->doc != NULL)
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(docu->doc);
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu->schema != NULL)
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeInnerSchema(docu->schema);
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(docu);
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDocumentList:
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @docu:  a list of  document structure
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG document structures.
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDocumentList(xmlRelaxNGDocumentPtr docu)
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr next;
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (docu != NULL) {
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        next = docu->next;
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeDocument(docu);
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        docu = next;
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeInclude:
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @incl:  a include structure
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG include structure.
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeInclude(xmlRelaxNGIncludePtr incl)
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl == NULL)
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl->href != NULL)
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(incl->href);
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl->doc != NULL)
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(incl->doc);
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl->schema != NULL)
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFree(incl->schema);
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(incl);
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeIncludeList:
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @incl:  a include structure list
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG include structure.
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeIncludeList(xmlRelaxNGIncludePtr incl)
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr next;
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (incl != NULL) {
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        next = incl->next;
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeInclude(incl);
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        incl = next;
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewRelaxNG:
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context (optional)
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG structure.
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewRelaxNG(xmlRelaxNGParserCtxtPtr ctxt)
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr ret;
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGPtr) xmlMalloc(sizeof(xmlRelaxNG));
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, NULL);
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNG));
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeInnerSchema:
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG schema structure.
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema)
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->doc != NULL)
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(schema->doc);
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->defTab != NULL) {
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < schema->defNr; i++)
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeDefine(schema->defTab[i]);
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(schema->defTab);
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(schema);
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFree:
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG structure.
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFree(xmlRelaxNGPtr schema)
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->topgrammar != NULL)
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeGrammar(schema->topgrammar);
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->doc != NULL)
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(schema->doc);
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->documents != NULL)
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeDocumentList(schema->documents);
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->includes != NULL)
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeIncludeList(schema->includes);
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->defTab != NULL) {
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < schema->defNr; i++)
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeDefine(schema->defTab[i]);
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(schema->defTab);
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(schema);
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewGrammar:
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context (optional)
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG grammar.
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewGrammar(xmlRelaxNGParserCtxtPtr ctxt)
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr ret;
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGGrammarPtr) xmlMalloc(sizeof(xmlRelaxNGGrammar));
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, NULL);
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGGrammar));
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeGrammar:
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar:  a grammar structure
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG grammar structure.
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar)
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar == NULL)
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->children != NULL) {
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeGrammar(grammar->children);
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->next != NULL) {
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeGrammar(grammar->next);
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->refs != NULL) {
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(grammar->refs, NULL);
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->defs != NULL) {
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(grammar->defs, NULL);
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(grammar);
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewDefine:
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node in the input document.
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG define.
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret;
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->defMax == 0) {
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defMax = 16;
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defNr = 0;
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defTab = (xmlRelaxNGDefinePtr *)
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(ctxt->defMax * sizeof(xmlRelaxNGDefinePtr));
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->defTab == NULL) {
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "allocating define\n");
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->defMax <= ctxt->defNr) {
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr *tmp;
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defMax *= 2;
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlRelaxNGDefinePtr *) xmlRealloc(ctxt->defTab,
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->defMax *
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 sizeof
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 (xmlRelaxNGDefinePtr));
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "allocating define\n");
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defTab = tmp;
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGDefinePtr) xmlMalloc(sizeof(xmlRelaxNGDefine));
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "allocating define\n");
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGDefine));
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->defTab[ctxt->defNr++] = ret;
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->depth = -1;
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreePartition:
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @partitions:  a partition set structure
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate RelaxNG partition set structures.
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreePartition(xmlRelaxNGPartitionPtr partitions)
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr group;
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int j;
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (partitions != NULL) {
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (partitions->groups != NULL) {
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (j = 0; j < partitions->nbgroups; j++) {
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                group = partitions->groups[j];
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (group != NULL) {
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (group->defs != NULL)
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(group->defs);
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (group->attrs != NULL)
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(group->attrs);
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(group);
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(partitions->groups);
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (partitions->triage != NULL) {
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlHashFree(partitions->triage, NULL);
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(partitions);
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDefine:
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  a define structure
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG define structure.
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define)
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL)
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define->type == XML_RELAXNG_VALUE) && (define->attrs != NULL)) {
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGTypeLibraryPtr lib;
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        lib = (xmlRelaxNGTypeLibraryPtr) define->data;
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((lib != NULL) && (lib->freef != NULL))
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lib->freef(lib->data, (void *) define->attrs);
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define->data != NULL) && (define->type == XML_RELAXNG_INTERLEAVE))
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data);
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define->data != NULL) && (define->type == XML_RELAXNG_CHOICE))
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree((xmlHashTablePtr) define->data, NULL);
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL)
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(define->name);
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->ns != NULL)
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(define->ns);
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->value != NULL)
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(define->value);
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->contModel != NULL)
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeRegexp(define->contModel);
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(define);
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewStates:
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the default size for the container
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG validation state container
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGStatesPtr
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size)
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr ret;
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) &&
1011df143a5041f03a22808b59c76698770b74692815Selim Gurun        (ctxt->freeStates != NULL) && (ctxt->freeStatesNr > 0)) {
1012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStatesNr--;
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ctxt->freeStates[ctxt->freeStatesNr];
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->nbState = 0;
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (size < 16)
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        size = 16;
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGStatesPtr) xmlMalloc(sizeof(xmlRelaxNGStates) +
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                          (size -
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           1) *
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                          sizeof(xmlRelaxNGValidStatePtr));
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "allocating states\n");
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbState = 0;
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxState = size;
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->tabState = (xmlRelaxNGValidStatePtr *) xmlMalloc((size) *
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                          sizeof
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                          (xmlRelaxNGValidStatePtr));
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->tabState == NULL) {
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "allocating states\n");
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ret);
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddStateUniq:
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states:  the states container
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  the validation state
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a RelaxNG validation state to the container without checking
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for unicity.
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return 1 in case of success and 0 if this is a duplicate and -1 on error
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddStatesUniq(xmlRelaxNGValidCtxtPtr ctxt,
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGStatesPtr states,
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGValidStatePtr state)
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (states->nbState >= states->maxState) {
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGValidStatePtr *tmp;
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int size;
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        size = states->maxState * 2;
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState,
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     (size) *
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     sizeof
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     (xmlRelaxNGValidStatePtr));
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "adding states\n");
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->tabState = tmp;
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->maxState = size;
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    states->tabState[states->nbState++] = state;
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddState:
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states:  the states container
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  the validation state
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a RelaxNG validation state to the container
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return 1 in case of success and 0 if this is a duplicate and -1 on error
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt,
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGStatesPtr states,
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGValidStatePtr state)
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (states->nbState >= states->maxState) {
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGValidStatePtr *tmp;
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int size;
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        size = states->maxState * 2;
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState,
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     (size) *
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     sizeof
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     (xmlRelaxNGValidStatePtr));
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "adding states\n");
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->tabState = tmp;
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->maxState = size;
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < states->nbState; i++) {
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlRelaxNGEqualValidState(ctxt, state, states->tabState[i])) {
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(ctxt, state);
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    states->tabState[states->nbState++] = state;
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeStates:
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states:  teh container
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a RelaxNG validation state container
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt,
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlRelaxNGStatesPtr states)
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (states == NULL)
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->freeStates == NULL)) {
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStatesMax = 40;
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStatesNr = 0;
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStates = (xmlRelaxNGStatesPtr *)
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(ctxt->freeStatesMax * sizeof(xmlRelaxNGStatesPtr));
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->freeStates == NULL) {
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "storing states\n");
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((ctxt != NULL)
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               && (ctxt->freeStatesNr >= ctxt->freeStatesMax)) {
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGStatesPtr *tmp;
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlRelaxNGStatesPtr *) xmlRealloc(ctxt->freeStates,
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 2 * ctxt->freeStatesMax *
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 sizeof
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 (xmlRelaxNGStatesPtr));
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "storing states\n");
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(states->tabState);
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(states);
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return;
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStates = tmp;
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStatesMax *= 2;
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->freeStates == NULL)) {
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(states->tabState);
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(states);
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStates[ctxt->freeStatesNr++] = states;
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewValidState:
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the current node or NULL for the document
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG validation state
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGValidStatePtr
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewValidState(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node)
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr ret;
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attrs[MAX_ATTR];
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAttrs = 0;
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root = NULL;
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL) {
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        root = xmlDocGetRootElement(ctxt->doc);
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (root == NULL)
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        attr = node->properties;
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (attr != NULL) {
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nbAttrs < MAX_ATTR)
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                attrs[nbAttrs++] = attr;
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nbAttrs++;
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            attr = attr->next;
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) {
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeState->nbState--;
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ctxt->freeState->tabState[ctxt->freeState->nbState];
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret =
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGValidStatePtr)
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(sizeof(xmlRelaxNGValidState));
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret == NULL) {
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "allocating states\n");
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memset(ret, 0, sizeof(xmlRelaxNGValidState));
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->value = NULL;
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->endvalue = NULL;
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL) {
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->node = (xmlNodePtr) ctxt->doc;
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->seq = root;
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->node = node;
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->seq = node->children;
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbAttrs = 0;
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nbAttrs > 0) {
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret->attrs == NULL) {
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nbAttrs < 4)
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->maxAttrs = 4;
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->maxAttrs = nbAttrs;
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs *
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  sizeof(xmlAttrPtr));
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret->attrs == NULL) {
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngVErrMemory(ctxt, "allocating states\n");
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ret->maxAttrs < nbAttrs) {
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlAttrPtr *tmp;
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, nbAttrs *
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            sizeof(xmlAttrPtr));
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == NULL) {
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngVErrMemory(ctxt, "allocating states\n");
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->attrs = tmp;
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->maxAttrs = nbAttrs;
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->nbAttrs = nbAttrs;
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nbAttrs < MAX_ATTR) {
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            memcpy(ret->attrs, attrs, sizeof(xmlAttrPtr) * nbAttrs);
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            attr = node->properties;
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nbAttrs = 0;
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (attr != NULL) {
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->attrs[nbAttrs++] = attr;
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                attr = attr->next;
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbAttrLeft = ret->nbAttrs;
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCopyValidState:
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  a validation state
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copy the validation state
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGValidStatePtr
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCopyValidState(xmlRelaxNGValidCtxtPtr ctxt,
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidStatePtr state)
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr ret;
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int maxAttrs;
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr *attrs;
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL)
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) {
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeState->nbState--;
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ctxt->freeState->tabState[ctxt->freeState->nbState];
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret =
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGValidStatePtr)
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(sizeof(xmlRelaxNGValidState));
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret == NULL) {
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "allocating states\n");
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memset(ret, 0, sizeof(xmlRelaxNGValidState));
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attrs = ret->attrs;
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    maxAttrs = ret->maxAttrs;
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(ret, state, sizeof(xmlRelaxNGValidState));
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->attrs = attrs;
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxAttrs = maxAttrs;
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->nbAttrs > 0) {
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret->attrs == NULL) {
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->maxAttrs = state->maxAttrs;
1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs *
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  sizeof(xmlAttrPtr));
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret->attrs == NULL) {
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngVErrMemory(ctxt, "allocating states\n");
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->nbAttrs = 0;
1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ret->maxAttrs < state->nbAttrs) {
1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlAttrPtr *tmp;
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, state->maxAttrs *
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            sizeof(xmlAttrPtr));
1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == NULL) {
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngVErrMemory(ctxt, "allocating states\n");
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->nbAttrs = 0;
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->maxAttrs = state->maxAttrs;
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->attrs = tmp;
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memcpy(ret->attrs, state->attrs,
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               state->nbAttrs * sizeof(xmlAttrPtr));
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGEqualValidState:
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state1:  a validation state
1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state2:  a validation state
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the validation states for equality
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equald, 0 otherwise
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED,
1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidStatePtr state1,
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidStatePtr state2)
1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((state1 == NULL) || (state2 == NULL))
1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1 == state2)
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->node != state2->node)
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->seq != state2->seq)
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->nbAttrLeft != state2->nbAttrLeft)
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->nbAttrs != state2->nbAttrs)
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->endvalue != state2->endvalue)
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((state1->value != state2->value) &&
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (!xmlStrEqual(state1->value, state2->value)))
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < state1->nbAttrs; i++) {
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state1->attrs[i] != state2->attrs[i])
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeValidState:
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  a validation state structure
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG validation state structure.
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidStatePtr state)
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL)
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->freeState == NULL)) {
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeState = xmlRelaxNGNewStates(ctxt, 40);
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->freeState == NULL)) {
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state->attrs != NULL)
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(state->attrs);
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(state);
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state);
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
1401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Semi internal functions				*
1402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
1403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxParserSetFlag:
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a RelaxNG parser context
1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: a set of flags values
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Semi private function used to pass informations to a parser context
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which are a combination of xmlRelaxNGParserFlag .
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags)
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return(-1);
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flags & XML_RELAXNGP_FREE_DOC) {
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->crng |= XML_RELAXNGP_FREE_DOC;
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	flags -= XML_RELAXNGP_FREE_DOC;
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flags & XML_RELAXNGP_CRNG) {
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->crng |= XML_RELAXNGP_CRNG;
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	flags -= XML_RELAXNGP_CRNG;
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flags != 0) return(-1);
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
1433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Document functions				*
1434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
1435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt,
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      xmlDocPtr doc);
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIncludePush:
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the element doc
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new include on top of the include stack
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIncludePush(xmlRelaxNGParserCtxtPtr ctxt,
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlRelaxNGIncludePtr value)
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incTab == NULL) {
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incMax = 4;
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incNr = 0;
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incTab =
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGIncludePtr *) xmlMalloc(ctxt->incMax *
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               sizeof(ctxt->incTab[0]));
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->incTab == NULL) {
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "allocating include\n");
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incNr >= ctxt->incMax) {
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incMax *= 2;
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incTab =
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGIncludePtr *) xmlRealloc(ctxt->incTab,
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                ctxt->incMax *
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                sizeof(ctxt->incTab[0]));
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->incTab == NULL) {
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "allocating include\n");
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->incTab[ctxt->incNr] = value;
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->inc = value;
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt->incNr++);
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIncludePop:
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top include from the include stack
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the include just removed
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGIncludePtr
1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIncludePop(xmlRelaxNGParserCtxtPtr ctxt)
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr ret;
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incNr <= 0)
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->incNr--;
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incNr > 0)
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->inc = ctxt->incTab[ctxt->incNr - 1];
1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->inc = NULL;
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ctxt->incTab[ctxt->incNr];
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->incTab[ctxt->incNr] = NULL;
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGRemoveRedefine:
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the normalized URL
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @target:  the included target
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the define name to eliminate
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the elimination algorithm of 4.7
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, 1 in case of success.
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt,
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * URL ATTRIBUTE_UNUSED,
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlNodePtr target, const xmlChar * name)
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int found = 0;
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp, tmp2;
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name2;
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Elimination of <include> start from %s\n", URL);
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Elimination of <include> define %s from %s\n",
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        name, URL);
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = target;
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (tmp != NULL) {
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp2 = tmp->next;
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((name == NULL) && (IS_RELAXNG(tmp, "start"))) {
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            found = 1;
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlUnlinkNode(tmp);
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFreeNode(tmp);
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((name != NULL) && (IS_RELAXNG(tmp, "define"))) {
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            name2 = xmlGetProp(tmp, BAD_CAST "name");
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGNormExtSpace(name2);
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (name2 != NULL) {
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual(name, name2)) {
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    found = 1;
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlUnlinkNode(tmp);
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFreeNode(tmp);
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(name2);
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_RELAXNG(tmp, "include")) {
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlChar *href = NULL;
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDocumentPtr inc = tmp->psvi;
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((inc != NULL) && (inc->doc != NULL) &&
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (inc->doc->children != NULL)) {
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (inc->doc->children->name, BAD_CAST "grammar")) {
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    href = xmlGetProp(tmp, BAD_CAST "href");
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (xmlRelaxNGRemoveRedefine(ctxt, href,
1564df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 xmlDocGetRootElement(inc->doc)->children,
1565df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 name) == 1) {
1566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        found = 1;
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href != NULL)
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(href);
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = tmp2;
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (found);
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLoadInclude:
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the normalized URL
1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the include node.
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the namespace passed from the context.
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First lookup if the document is already loaded into the parser context,
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion. If not found the resource is loaded and
1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content is preprocessed before being returned back to the caller.
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGIncludePtr or NULL in case of error
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGIncludePtr
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * URL,
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlNodePtr node, const xmlChar * ns)
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr ret = NULL;
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root, cur;
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlRelaxNGLoadInclude(%s)\n", URL);
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * check against recursion in the stack
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->incNr; i++) {
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlStrEqual(ctxt->incTab[i]->href, URL)) {
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, NULL, XML_RNGP_INCLUDE_RECURSE,
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Detected an Include recursion for %s\n", URL,
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * load the document
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlReadFile((const char *) URL,NULL,0);
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_PARSE_ERROR,
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: could not load %s\n", URL, NULL);
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Parsed %s Okay\n", URL);
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Allocate the document structures and register it first.
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGIncludePtr) xmlMalloc(sizeof(xmlRelaxNGInclude));
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "allocating include\n");
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(doc);
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGInclude));
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->href = xmlStrdup(URL);
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = ctxt->includes;
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->includes = ret;
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * transmit the ns if needed
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        root = xmlDocGetRootElement(doc);
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (root != NULL) {
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlHasProp(root, BAD_CAST "ns") == NULL) {
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlSetProp(root, BAD_CAST "ns", ns);
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * push it on the stack
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePush(ctxt, ret);
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Some preprocessing of the document content, this include recursing
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * in the include stack.
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "cleanup of %s\n", URL);
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlRelaxNGCleanupDoc(ctxt, doc);
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->inc = NULL;
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Pop up the include from the stack
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePop(ctxt);
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Checking of %s\n", URL);
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check that the top element is a grammar
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = xmlDocGetRootElement(doc);
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root == NULL) {
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EMPTY,
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: included document is empty %s\n", URL,
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!IS_RELAXNG(root, "grammar")) {
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING,
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: included document %s root is not a grammar\n",
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   URL, NULL);
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Elimination of redefined rules in the include.
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = node->children;
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_RELAXNG(cur, "start")) {
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int found = 0;
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            found =
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGRemoveRedefine(ctxt, URL, root->children, NULL);
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (!found) {
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_START_MISSING,
1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "xmlRelaxNG: include %s has a start but not the included grammar\n",
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           URL, NULL);
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_RELAXNG(cur, "define")) {
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlChar *name;
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            name = xmlGetProp(cur, BAD_CAST "name");
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (name == NULL) {
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_NAME_MISSING,
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "xmlRelaxNG: include %s has define without name\n",
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           URL, NULL);
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int found;
1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGNormExtSpace(name);
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                found = xmlRelaxNGRemoveRedefine(ctxt, URL,
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 root->children, name);
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (!found) {
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_MISSING,
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "xmlRelaxNG: include %s has a define %s but not the included grammar\n",
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               URL, name);
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(name);
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidErrorPush:
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error code
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first string argument
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second string argument
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dup:  arg need to be duplicated
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new error on top of the error stack
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt,
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidErr err, const xmlChar * arg1,
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * arg2, int dup)
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr cur;
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Pushing error %d at %d on stack\n", err, ctxt->errNr);
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errTab == NULL) {
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errMax = 8;
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errNr = 0;
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errTab =
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGValidErrorPtr) xmlMalloc(ctxt->errMax *
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                sizeof
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                (xmlRelaxNGValidError));
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errTab == NULL) {
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "pushing error\n");
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = NULL;
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNr >= ctxt->errMax) {
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errMax *= 2;
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errTab =
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGValidErrorPtr) xmlRealloc(ctxt->errTab,
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->errMax *
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 sizeof
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 (xmlRelaxNGValidError));
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errTab == NULL) {
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "pushing error\n");
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = &ctxt->errTab[ctxt->errNr - 1];
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->err != NULL) && (ctxt->state != NULL) &&
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->err->node == ctxt->state->node) && (ctxt->err->err == err))
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ctxt->errNr);
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = &ctxt->errTab[ctxt->errNr];
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->err = err;
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dup) {
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg1 = xmlStrdup(arg1);
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg2 = xmlStrdup(arg2);
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->flags = ERROR_IS_DUP;
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg1 = arg1;
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg2 = arg2;
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->flags = 0;
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL) {
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->node = ctxt->state->node;
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->seq = ctxt->state->seq;
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->node = NULL;
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->seq = NULL;
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->err = cur;
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt->errNr++);
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidErrorPop:
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top error from the error stack
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt)
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr cur;
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNr <= 0) {
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = NULL;
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNr--;
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNr > 0)
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = &ctxt->errTab[ctxt->errNr - 1];
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = NULL;
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = &ctxt->errTab[ctxt->errNr];
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->flags & ERROR_IS_DUP) {
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->arg1 != NULL)
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree((xmlChar *) cur->arg1);
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg1 = NULL;
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->arg2 != NULL)
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree((xmlChar *) cur->arg2);
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg2 = NULL;
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->flags = 0;
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocumentPush:
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the element doc
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new doc on top of the doc stack
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDocumentPush(xmlRelaxNGParserCtxtPtr ctxt,
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlRelaxNGDocumentPtr value)
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docTab == NULL) {
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docMax = 4;
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docNr = 0;
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docTab =
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGDocumentPtr *) xmlMalloc(ctxt->docMax *
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                sizeof(ctxt->docTab[0]));
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->docTab == NULL) {
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "adding document\n");
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docNr >= ctxt->docMax) {
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docMax *= 2;
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docTab =
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGDocumentPtr *) xmlRealloc(ctxt->docTab,
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->docMax *
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 sizeof(ctxt->docTab[0]));
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->docTab == NULL) {
1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "adding document\n");
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->docTab[ctxt->docNr] = value;
1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->doc = value;
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt->docNr++);
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocumentPop:
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top doc from the doc stack
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the doc just removed
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDocumentPtr
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDocumentPop(xmlRelaxNGParserCtxtPtr ctxt)
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr ret;
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docNr <= 0)
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->docNr--;
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docNr > 0)
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->doc = ctxt->docTab[ctxt->docNr - 1];
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->doc = NULL;
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ctxt->docTab[ctxt->docNr];
1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->docTab[ctxt->docNr] = NULL;
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLoadExternalRef:
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the normalized URL
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the inherited ns if any
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First lookup if the document is already loaded into the parser context,
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion. If not found the resource is loaded and
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content is preprocessed before being returned back to the caller.
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGDocumentPtr or NULL in case of error
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDocumentPtr
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt,
1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * URL, const xmlChar * ns)
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr ret = NULL;
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root;
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * check against recursion in the stack
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->docNr; i++) {
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlStrEqual(ctxt->docTab[i]->href, URL)) {
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, NULL, XML_RNGP_EXTERNALREF_RECURSE,
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Detected an externalRef recursion for %s\n", URL,
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * load the document
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlReadFile((const char *) URL,NULL,0);
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR,
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: could not load %s\n", URL, NULL);
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Allocate the document structures and register it first.
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGDocumentPtr) xmlMalloc(sizeof(xmlRelaxNGDocument));
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_ERR_NO_MEMORY,
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: allocate memory for doc %s\n", URL, NULL);
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(doc);
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGDocument));
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->href = xmlStrdup(URL);
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = ctxt->documents;
1975df143a5041f03a22808b59c76698770b74692815Selim Gurun    ret->externalRef = 1;
1976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->documents = ret;
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * transmit the ns if needed
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        root = xmlDocGetRootElement(doc);
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (root != NULL) {
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlHasProp(root, BAD_CAST "ns") == NULL) {
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlSetProp(root, BAD_CAST "ns", ns);
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * push it on the stack and register it in the hash table
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPush(ctxt, ret);
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Some preprocessing of the document content
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlRelaxNGCleanupDoc(ctxt, doc);
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->doc = NULL;
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPop(ctxt);
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
2011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Error functions					*
2012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
2013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0);
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0);
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0);
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1);
2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1);
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *
2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefName(xmlRelaxNGDefinePtr def)
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL)
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return ("none");
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (def->type) {
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("empty");
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("notAllowed");
2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("except");
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("text");
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("element");
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("datatype");
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("value");
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("list");
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("attribute");
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("def");
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("ref");
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("externalRef");
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("parentRef");
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("optional");
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("zeroOrMore");
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("oneOrMore");
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("choice");
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("group");
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("interleave");
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("start");
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("noop");
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("param");
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ("unknown");
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetErrorString:
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error code
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first string argument
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second string argument
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * computes a formatted error string for the given error code and args
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the error string, it must be deallocated by the caller
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar * arg1,
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * arg2)
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char msg[1000];
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1 == NULL)
2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        arg1 = BAD_CAST "";
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg2 == NULL)
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        arg2 = BAD_CAST "";
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg[0] = 0;
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (err) {
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OK:
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_MEMORY:
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("out of memory\n"));
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_TYPE:
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "failed to validate type %s\n", arg1);
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_TYPEVAL:
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Type %s doesn't allow value '%s'\n", arg1,
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg2);
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_DUPID:
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "ID %s redefined\n", arg1);
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_TYPECMP:
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "failed to compare type %s\n", arg1);
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NOSTATE:
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Internal error: no state\n"));
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NODEFINE:
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Internal error: no define\n"));
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INTERNAL:
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Internal error: %s\n", arg1);
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_LISTEXTRA:
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Extra data in list: %s\n", arg1);
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INTERNODATA:
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ("Internal: interleave block has no data\n"));
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INTERSEQ:
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Invalid sequence in interleave\n"));
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INTEREXTRA:
2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Extra element %s in interleave\n", arg1);
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMNAME:
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting element %s, got %s\n", arg1,
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg2);
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMNONS:
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting a namespace for element %s\n",
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMWRONGNS:
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000,
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     "Element %s has wrong namespace: expecting %s\n", arg1,
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg2);
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMWRONG:
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Did not expect element %s there\n", arg1);
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_TEXTWRONG:
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000,
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     "Did not expect text in element %s content\n", arg1);
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMEXTRANS:
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting no namespace for element %s\n",
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMNOTEMPTY:
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting element %s to be empty\n", arg1);
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NOELEM:
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting an element %s, got nothing\n",
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NOTELEM:
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Expecting an element got text\n"));
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ATTRVALID:
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Element %s failed to validate attributes\n",
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_CONTENTVALID:
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Element %s failed to validate content\n",
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_EXTRACONTENT:
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Element %s has extra content: %s\n",
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1, arg2);
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INVALIDATTR:
2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Invalid attribute %s for element %s\n",
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1, arg2);
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_LACKDATA:
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Datatype element %s contains no data\n",
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_DATAELEM:
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Datatype element %s has child elements\n",
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_VALELEM:
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Value element %s has child elements\n",
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_LISTELEM:
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "List element %s has child elements\n",
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_DATATYPE:
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Error validating datatype %s\n", arg1);
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_VALUE:
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Error validating value %s\n", arg1);
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_LIST:
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Error validating list\n"));
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NOGRAMMAR:
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("No top grammar defined\n"));
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_EXTRADATA:
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Extra data in the document\n"));
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Unknown error !\n"));
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (msg[0] == 0) {
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        snprintf(msg, 1000, "Unknown error code %d\n", err);
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg[1000 - 1] = 0;
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlStrdup((xmlChar *) msg));
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGShowValidError:
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error number
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @child:  the node child generating the problem.
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first argument
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second argument
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Show a validation error.
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt,
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidErr err, xmlNodePtr node,
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlNodePtr child, const xmlChar * arg1,
2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * arg2)
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg;
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->flags & FLAGS_NOERROR)
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Show error %d\n", err);
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlRelaxNGGetErrorString(err, arg1, arg2);
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (msg == NULL)
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNo == XML_RELAXNG_OK)
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errNo = err;
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRngVErr(ctxt, (child == NULL ? node : child), err,
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (const char *) msg, arg1, arg2);
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(msg);
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGPopErrors:
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @level:  the error level in the stack
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pop and discard all errors until the given level is reached
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level)
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr err;
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Pop errors till level %d\n", level);
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = level; i < ctxt->errNr; i++) {
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        err = &ctxt->errTab[i];
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (err->flags & ERROR_IS_DUP) {
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (err->arg1 != NULL)
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree((xmlChar *) err->arg1);
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->arg1 = NULL;
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (err->arg2 != NULL)
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree((xmlChar *) err->arg2);
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->arg2 = NULL;
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->flags = 0;
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNr = level;
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNr <= 0)
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = NULL;
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpValidError:
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Show all validation error over a given index.
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt)
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, k;
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr err, dup;
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Dumping error stack %d errors\n", ctxt->errNr);
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0, k = 0; i < ctxt->errNr; i++) {
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        err = &ctxt->errTab[i];
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (k < MAX_ERROR) {
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (j = 0; j < i; j++) {
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                dup = &ctxt->errTab[j];
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((err->err == dup->err) && (err->node == dup->node) &&
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlStrEqual(err->arg1, dup->arg1)) &&
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlStrEqual(err->arg2, dup->arg2))) {
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto skip;
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGShowValidError(ctxt, err->err, err->node, err->seq,
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     err->arg1, err->arg2);
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            k++;
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      skip:
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (err->flags & ERROR_IS_DUP) {
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (err->arg1 != NULL)
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree((xmlChar *) err->arg1);
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->arg1 = NULL;
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (err->arg2 != NULL)
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree((xmlChar *) err->arg2);
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->arg2 = NULL;
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->flags = 0;
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNr = 0;
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddValidError:
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error number
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first argument
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second argument
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dup:  need to dup the args
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a validation error, either generating it if it's sure
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or stacking it for later handling if unsure.
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt,
2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGValidErr err, const xmlChar * arg1,
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        const xmlChar * arg2, int dup)
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->flags & FLAGS_NOERROR)
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err);
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * generate the error directly
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((ctxt->flags & FLAGS_IGNORABLE) == 0) ||
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    	 (ctxt->flags & FLAGS_NEGATIVE)) {
2364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr node, seq;
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Flush first any stacked error which might be the
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * real cause of the problem.
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errNr != 0)
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpValidError(ctxt);
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->state != NULL) {
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = ctxt->state->node;
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            seq = ctxt->state->seq;
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = seq = NULL;
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2378df143a5041f03a22808b59c76698770b74692815Selim Gurun        if ((node == NULL) && (seq == NULL)) {
2379df143a5041f03a22808b59c76698770b74692815Selim Gurun            node = ctxt->pnode;
2380df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
2381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2);
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Stack the error for later processing if needed
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup);
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
2394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Type library hooks				*
2395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
2396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt,
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    const xmlChar * str);
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeHave:
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type is provided by
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the W3C XMLSchema Datatype library.
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED, const xmlChar * type)
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typ;
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    typ = xmlSchemaGetPredefinedType(type,
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     BAD_CAST
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     "http://www.w3.org/2001/XMLSchema");
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typ == NULL)
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeCheck:
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type and value are validated by
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the W3C XMLSchema Datatype library.
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED,
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * type,
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * value,
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          void **result, xmlNodePtr node)
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typ;
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == NULL) || (value == NULL))
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    typ = xmlSchemaGetPredefinedType(type,
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     BAD_CAST
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     "http://www.w3.org/2001/XMLSchema");
2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typ == NULL)
2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValPredefTypeNode(typ, value,
2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     (xmlSchemaValPtr *) result, node);
2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 2)               /* special ID error code */
2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (2);
2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret > 0)
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaFacetCheck:
2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet name
2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the facet value
2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strval:  the string value
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check a value facet
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaFacetCheck(void *data ATTRIBUTE_UNUSED,
2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * type, const xmlChar * facetname,
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * val, const xmlChar * strval,
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           void *value)
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet;
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typ;
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == NULL) || (strval == NULL))
2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    typ = xmlSchemaGetPredefinedType(type,
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     BAD_CAST
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     "http://www.w3.org/2001/XMLSchema");
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typ == NULL)
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet = xmlSchemaNewFacet();
2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL)
2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(facetname, BAD_CAST "minInclusive")) {
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "minExclusive")) {
2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "maxInclusive")) {
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "maxExclusive")) {
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "totalDigits")) {
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "fractionDigits")) {
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "pattern")) {
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_PATTERN;
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "enumeration")) {
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_ENUMERATION;
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "whiteSpace")) {
2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_WHITESPACE;
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "length")) {
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_LENGTH;
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "maxLength")) {
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXLENGTH;
2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "minLength")) {
2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MINLENGTH;
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeFacet(facet);
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet->value = val;
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCheckFacet(facet, typ, NULL, type);
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeFacet(facet);
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValidateFacet(typ, facet, strval, value);
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeFacet(facet);
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaFreeValue:
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to free
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to free a Schemas value
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaFreeValue(void *data ATTRIBUTE_UNUSED, void *value)
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeValue(value);
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeCompare:
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1:  the first value
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2:  the second value
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two values for equality accordingly a type from the W3C XMLSchema
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Datatype library.
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equal, 0 if no and -1 in case of error.
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED,
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            const xmlChar * type,
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            const xmlChar * value1,
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlNodePtr ctxt1,
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            void *comp1,
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            const xmlChar * value2, xmlNodePtr ctxt2)
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typ;
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr res1 = NULL, res2 = NULL;
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == NULL) || (value1 == NULL) || (value2 == NULL))
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    typ = xmlSchemaGetPredefinedType(type,
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     BAD_CAST
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     "http://www.w3.org/2001/XMLSchema");
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typ == NULL)
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp1 == NULL) {
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1);
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0)
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (res1 == NULL)
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        res1 = (xmlSchemaValPtr) comp1;
2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2);
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((comp1 == NULL) && (res1 != NULL))
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(res1);
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res1 == NULL) {
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCompareValues(res1, res2);
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res1 != (xmlSchemaValPtr) comp1)
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(res1);
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeValue(res2);
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -2)
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeHave:
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type is provided by
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the default datatype library.
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeHave(void *data ATTRIBUTE_UNUSED,
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * type)
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "string"))
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "token"))
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeCheck:
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type and value are validated by
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the default datatype library.
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeCheck(void *data ATTRIBUTE_UNUSED,
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * type ATTRIBUTE_UNUSED,
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * value ATTRIBUTE_UNUSED,
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           void **result ATTRIBUTE_UNUSED,
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlNodePtr node ATTRIBUTE_UNUSED)
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "string"))
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "token")) {
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeCompare:
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1:  the first value
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2:  the second value
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two values accordingly a type from the default
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * datatype library.
2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED,
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             const xmlChar * type,
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             const xmlChar * value1,
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlNodePtr ctxt1 ATTRIBUTE_UNUSED,
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             void *comp1 ATTRIBUTE_UNUSED,
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             const xmlChar * value2,
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlNodePtr ctxt2 ATTRIBUTE_UNUSED)
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = -1;
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "string")) {
2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlStrEqual(value1, value2);
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(type, BAD_CAST "token")) {
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlStrEqual(value1, value2)) {
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlChar *nval, *nvalue;
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * TODO: trivial optimizations are possible by
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * computing at compile-time
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nval = xmlRelaxNGNormalize(NULL, value1);
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nvalue = xmlRelaxNGNormalize(NULL, value2);
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((nval == NULL) || (nvalue == NULL))
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (xmlStrEqual(nval, nvalue))
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 1;
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nval != NULL)
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(nval);
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nvalue != NULL)
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(nvalue);
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGTypeInitialized = 0;
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlHashTablePtr xmlRelaxNGRegisteredTypes = NULL;
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeTypeLibrary:
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lib:  the type library structure
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the URI bound to the library
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the structure associated to the type library
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeTypeLibrary(xmlRelaxNGTypeLibraryPtr lib,
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * namespace ATTRIBUTE_UNUSED)
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib == NULL)
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib->namespace != NULL)
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree((xmlChar *) lib->namespace);
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(lib);
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGRegisterTypeLibrary:
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the URI bound to the library
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data associated to the library
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @have:  the provide function
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @check:  the checking function
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the comparison function
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new type library
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error.
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGRegisterTypeLibrary(const xmlChar * namespace, void *data,
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGTypeHave have,
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGTypeCheck check,
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGTypeCompare comp,
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGFacetCheck facet,
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGTypeFree freef)
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeLibraryPtr lib;
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((xmlRelaxNGRegisteredTypes == NULL) || (namespace == NULL) ||
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (check == NULL) || (comp == NULL))
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlHashLookup(xmlRelaxNGRegisteredTypes, namespace) != NULL) {
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Relax-NG types library '%s' already registered\n",
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        namespace);
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib =
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (xmlRelaxNGTypeLibraryPtr)
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlMalloc(sizeof(xmlRelaxNGTypeLibrary));
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib == NULL) {
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(NULL, "adding types library\n");
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(lib, 0, sizeof(xmlRelaxNGTypeLibrary));
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->namespace = xmlStrdup(namespace);
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->data = data;
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->have = have;
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->comp = comp;
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->check = check;
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->facet = facet;
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->freef = freef;
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlHashAddEntry(xmlRelaxNGRegisteredTypes, namespace, lib);
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Relax-NG types library failed to register '%s'\n",
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        namespace);
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeTypeLibrary(lib, namespace);
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInitTypes:
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initilize the default type libraries.
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error.
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGInitTypes(void)
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlRelaxNGTypeInitialized != 0)
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGRegisteredTypes = xmlHashCreate(10);
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlRelaxNGRegisteredTypes == NULL) {
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Failed to allocate sh table for Relax-NG types\n");
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGRegisterTypeLibrary(BAD_CAST
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  "http://www.w3.org/2001/XMLSchema-datatypes",
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  NULL, xmlRelaxNGSchemaTypeHave,
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGSchemaTypeCheck,
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGSchemaTypeCompare,
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGSchemaFacetCheck,
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGSchemaFreeValue);
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGRegisterTypeLibrary(xmlRelaxNGNs, NULL,
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGDefaultTypeHave,
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGDefaultTypeCheck,
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGDefaultTypeCompare, NULL,
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  NULL);
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeInitialized = 1;
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupTypes:
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the default Schemas type library associated to RelaxNG
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupTypes(void)
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCleanupTypes();
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlRelaxNGTypeInitialized == 0)
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator)
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeTypeLibrary);
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeInitialized = 0;
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
2851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Compiling element content into regexp			*
2852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
2853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sometime the element content can be compiled into a pure regexp,	*
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This allows a faster execution and streamability at that level	*
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
2856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2858df143a5041f03a22808b59c76698770b74692815Selim Gurun/* from automata.c but not exported */
2859df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid xmlAutomataSetFlags(xmlAutomataPtr am, int flags);
2860df143a5041f03a22808b59c76698770b74692815Selim Gurun
2861df143a5041f03a22808b59c76698770b74692815Selim Gurun
2862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt,
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGDefinePtr def);
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsCompileable:
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to check
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a definition is nullable.
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsCompileable(xmlRelaxNGDefinePtr def)
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = -1;
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL) {
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def->type != XML_RELAXNG_ELEMENT) &&
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def->dflags & IS_COMPILABLE))
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def->type != XML_RELAXNG_ELEMENT) &&
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def->dflags & IS_NOT_COMPILABLE))
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (def->type) {
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGIsCompileable(def->content);
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Check if the element content is compileable
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (((def->dflags & IS_NOT_COMPILABLE) == 0) &&
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ((def->dflags & IS_COMPILABLE) == 0)) {
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsCompileable(list);
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 1)
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Because the routine is recursive, we must guard against
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * discovering both COMPILABLE and NOT_COMPILABLE
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 0) {
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    def->dflags &= ~IS_COMPILABLE;
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->dflags |= IS_NOT_COMPILABLE;
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ret == 1) && !(def->dflags &= IS_NOT_COMPILABLE))
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->dflags |= IS_COMPILABLE;
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 1) {
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "element content for %s is compilable\n",
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    def->name);
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (ret == 0) {
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "element content for %s is not compilable\n",
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    def->name);
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "Problem in RelaxNGIsCompileable for element %s\n",
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    def->name);
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * All elements return a compileable status unless they
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * are generic like anyName
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((def->nameClass != NULL) || (def->name == NULL))
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 1;
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (ret);
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def->depth == -20) {
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->depth = -20;
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsCompileable(list);
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 1)
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:{
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsCompileable(list);
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 1)
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_NOT_COMPILABLE;
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 1)
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_COMPILABLE;
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 1) {
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "RelaxNGIsCompileable %s : true\n",
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefName(def));
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret == 0) {
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "RelaxNGIsCompileable %s : false\n",
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefName(def));
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Problem in RelaxNGIsCompileable %s\n",
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefName(def));
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompile:
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt:  the RelaxNG parser context
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition tree to compile
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the set of definitions, it works recursively, till the
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element boundaries, where it tries to compile the content if possible
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def)
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr list;
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (def == NULL))
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (def->type) {
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((xmlRelaxNGIsCompileable(def) == 1) && (def->depth != -25)) {
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataPtr oldam = ctxt->am;
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate = ctxt->state;
3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->depth = -25;
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = xmlNewAutomata();
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->am == NULL)
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (-1);
3045df143a5041f03a22808b59c76698770b74692815Selim Gurun
3046df143a5041f03a22808b59c76698770b74692815Selim Gurun                /*
3047df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * assume identical strings but not same pointer are different
3048df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * atoms, needed for non-determinism detection
3049df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * That way if 2 elements with the same name are in a choice
3050df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * branch the automata is found non-deterministic and
3051df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * we fallback to the normal validation which does the right
3052df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * thing of exploring both choices.
3053df143a5041f03a22808b59c76698770b74692815Selim Gurun                 */
3054df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataSetFlags(ctxt->am, 1);
3055df143a5041f03a22808b59c76698770b74692815Selim Gurun
3056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = xmlAutomataGetInitState(ctxt->am);
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataSetFinalState(ctxt->am, ctxt->state);
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->contModel = xmlAutomataCompile(ctxt->am);
3063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRegexpIsDeterminist(def->contModel);
3064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFreeAutomata(ctxt->am);
3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = oldstate;
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = oldam;
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->am != NULL) && (def->name != NULL)) {
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = xmlAutomataNewTransition2(ctxt->am,
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        ctxt->state, NULL,
3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        def->name, def->ns,
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        def);
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataPtr oldam = ctxt->am;
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate = ctxt->state;
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->depth = -25;
3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = xmlNewAutomata();
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->am == NULL)
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (-1);
3087df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataSetFlags(ctxt->am, 1);
3088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = xmlAutomataGetInitState(ctxt->am);
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataSetFinalState(ctxt->am, ctxt->state);
3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->contModel = xmlAutomataCompile(ctxt->am);
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (!xmlRegexpIsDeterminist(def->contModel)) {
3096df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef DEBUG_COMPILE
3097df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlGenericError(xmlGenericErrorContext,
3098df143a5041f03a22808b59c76698770b74692815Selim Gurun                        "Content model not determinist %s\n",
3099df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    def->name);
3100df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
3101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * we can only use the automata if it is determinist
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRegFreeRegexp(def->contModel);
3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->contModel = NULL;
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFreeAutomata(ctxt->am);
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = oldstate;
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = oldam;
3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataPtr oldam = ctxt->am;
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * we can't build the content model for this element content
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * but it still might be possible to build it for some of its
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * children, recurse.
3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGTryCompile(ctxt, def);
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = oldam;
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompile(ctxt, def->content);
3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:{
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate = ctxt->state;
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3128df143a5041f03a22808b59c76698770b74692815Selim Gurun                list = def->content;
3129df143a5041f03a22808b59c76698770b74692815Selim Gurun                while (list != NULL) {
3130df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlRelaxNGCompile(ctxt, list);
3131df143a5041f03a22808b59c76698770b74692815Selim Gurun                    list = list->next;
3132df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
3133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state);
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:{
3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate;
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate = ctxt->state;
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate);
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL);
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:{
3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate;
3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate = ctxt->state;
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate);
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL);
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:{
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr target = NULL;
3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate = ctxt->state;
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = oldstate;
3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGCompile(ctxt, list);
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0)
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (target == NULL)
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        target = ctxt->state;
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else {
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                              target);
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = target;
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = def->content;
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (list != NULL) {
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCompile(ctxt, list);
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0)
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = list->next;
3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:{
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate;
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate = ctxt->state;
3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCompile(ctxt, def->content);
3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewTransition(ctxt->am, ctxt->state,
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         ctxt->state, BAD_CAST "#text",
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         NULL);
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL);
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state =
3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* This should not happen and generate an internal error */
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "RNG internal error trying to compile %s\n",
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDefName(def));
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTryCompile:
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt:  the RelaxNG parser context
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition tree to compile
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to compile the set of definitions, it works recursively,
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possibly ignoring parts which cannot be compiled.
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def)
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr list;
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (def == NULL))
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def->type == XML_RELAXNG_START) ||
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def->type == XML_RELAXNG_ELEMENT)) {
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGIsCompileable(def);
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->am = NULL;
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompile(ctxt, def);
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (def->type == XML_RELAXNG_START)
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "compiled the start\n");
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "compiled element %s\n", def->name);
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (def->type == XML_RELAXNG_START)
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "failed to compile the start\n");
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "failed to compile element %s\n",
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    def->name);
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (ret);
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (def->type) {
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGTryCompile(ctxt, def->content);
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = def->content;
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (list != NULL) {
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGTryCompile(ctxt, list);
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0)
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = list->next;
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
3329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Parsing functions				*
3330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
3331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    ctxt, xmlNodePtr node);
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  ctxt, xmlNodePtr node);
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   ctxt, xmlNodePtr nodes,
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   int group);
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  ctxt, xmlNodePtr node);
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt,
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             xmlNodePtr node);
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt,
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         xmlNodePtr nodes);
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    ctxt, xmlNodePtr node,
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    xmlRelaxNGDefinePtr
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    def);
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   ctxt, xmlNodePtr nodes);
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGDefinePtr define,
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlNodePtr elem);
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content))
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsNullable:
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a definition is nullable.
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsNullable(xmlRelaxNGDefinePtr define)
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL)
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->dflags & IS_NULLABLE)
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->dflags & IS_NOT_NULLABLE)
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (define->type) {
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGIsNullable(define->content);
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:{
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = define->content;
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsNullable(list);
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0)
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto done;
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:{
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = define->content;
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsNullable(list);
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 1)
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto done;
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  done:
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        define->dflags |= IS_NOT_NULLABLE;
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 1)
3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        define->dflags |= IS_NULLABLE;
3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsBlank:
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  a string
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a string is ignorable c.f. 4.2. Whitespace
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsBlank(xmlChar * str)
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL)
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*str != 0) {
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!(IS_BLANK_CH(*str)))
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetDataTypeLibrary:
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the current data or value element
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies algorithm from 4.3. datatypeLibrary attribute
3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the datatypeLibary value or NULL if not found
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetDataTypeLibrary(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlNodePtr node)
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret, *escape;
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3474df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (node == NULL)
3475df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(NULL);
3476df143a5041f03a22808b59c76698770b74692815Selim Gurun
3477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((IS_RELAXNG(node, "data")) || (IS_RELAXNG(node, "value"))) {
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlGetProp(node, BAD_CAST "datatypeLibrary");
3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != NULL) {
3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret[0] == 0) {
3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(ret);
3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (NULL);
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?");
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (escape == NULL) {
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(ret);
3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (escape);
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    node = node->parent;
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((node != NULL) && (node->type == XML_ELEMENT_NODE)) {
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlGetProp(node, BAD_CAST "datatypeLibrary");
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != NULL) {
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret[0] == 0) {
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(ret);
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (NULL);
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?");
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (escape == NULL) {
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(ret);
3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (escape);
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = node->parent;
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseValue:
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the data node.
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG value node.
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL;
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeLibraryPtr lib = NULL;
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *type;
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *library;
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int success = 0;
3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def = xmlRelaxNGNewDefine(ctxt, node);
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL)
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->type = XML_RELAXNG_VALUE;
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = xmlGetProp(node, BAD_CAST "type");
3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type != NULL) {
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGNormExtSpace(type);
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlValidateNCName(type, 0)) {
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE,
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "value type '%s' is not an NCName\n", type, NULL);
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        library = xmlRelaxNGGetDataTypeLibrary(ctxt, node);
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (library == NULL)
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            library =
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0");
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->name = type;
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->ns = library;
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        lib = (xmlRelaxNGTypeLibraryPtr)
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlHashLookup(xmlRelaxNGRegisteredTypes, library);
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lib == NULL) {
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB,
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Use of unregistered type library '%s'\n", library,
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->data = NULL;
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->data = lib;
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (lib->have == NULL) {
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB,
3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Internal error with type library '%s': no 'have'\n",
3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           library, NULL);
3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                success = lib->have(lib->data, def->name);
3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (success != 1) {
3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND,
3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Error type '%s' is not exported by type library '%s'\n",
3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               def->name, library);
3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->children == NULL) {
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->value = xmlStrdup(BAD_CAST "");
3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (((node->children->type != XML_TEXT_NODE) &&
3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (node->children->type != XML_CDATA_SECTION_NODE)) ||
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (node->children->next != NULL)) {
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_TEXT_EXPECTED,
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Expecting a single text value for <value>content\n",
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (def != NULL) {
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->value = xmlNodeGetContent(node);
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def->value == NULL) {
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_VALUE_NO_CONTENT,
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element <value> has no content\n", NULL, NULL);
3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) {
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            void *val = NULL;
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            success =
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                lib->check(lib->data, def->name, def->value, &val, node);
3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (success != 1) {
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_INVALID_VALUE,
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Value '%s' is not acceptable for type '%s'\n",
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           def->value, def->name);
3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL)
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->attrs = val;
3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseData:
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the data node.
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG data node.
3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL, except;
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr param, lastparam = NULL;
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeLibraryPtr lib;
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *type;
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *library;
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr content;
3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = xmlGetProp(node, BAD_CAST "type");
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL) {
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_TYPE_MISSING, "data has no type\n", NULL,
3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGNormExtSpace(type);
3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlValidateNCName(type, 0)) {
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE,
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "data type '%s' is not an NCName\n", type, NULL);
3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    library = xmlRelaxNGGetDataTypeLibrary(ctxt, node);
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (library == NULL)
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        library =
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0");
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def = xmlRelaxNGNewDefine(ctxt, node);
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL) {
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(type);
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->type = XML_RELAXNG_DATATYPE;
3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->name = type;
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->ns = library;
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib = (xmlRelaxNGTypeLibraryPtr)
3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashLookup(xmlRelaxNGRegisteredTypes, library);
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib == NULL) {
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB,
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Use of unregistered type library '%s'\n", library,
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->data = NULL;
3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->data = lib;
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lib->have == NULL) {
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB,
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Internal error with type library '%s': no 'have'\n",
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       library, NULL);
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = lib->have(lib->data, def->name);
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != 1) {
3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND,
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Error type '%s' is not exported by type library '%s'\n",
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           def->name, library);
3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else
3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((xmlStrEqual
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (library,
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      BAD_CAST
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      "http://www.w3.org/2001/XMLSchema-datatypes"))
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    && ((xmlStrEqual(def->name, BAD_CAST "IDREF"))
3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        || (xmlStrEqual(def->name, BAD_CAST "IDREFS")))) {
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->idref = 1;
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    content = node->children;
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Handle optional params
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (content != NULL) {
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlStrEqual(content->name, BAD_CAST "param"))
3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlStrEqual(library,
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        BAD_CAST "http://relaxng.org/ns/structure/1.0")) {
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARAM_FORBIDDEN,
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Type library '%s' does not allow type parameters\n",
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       library, NULL);
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            content = content->next;
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((content != NULL) &&
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (xmlStrEqual(content->name, BAD_CAST "param")))
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                content = content->next;
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            param = xmlRelaxNGNewDefine(ctxt, node);
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (param != NULL) {
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                param->type = XML_RELAXNG_PARAM;
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                param->name = xmlGetProp(content, BAD_CAST "name");
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (param->name == NULL) {
3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_PARAM_NAME_MISSING,
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "param has no name\n", NULL, NULL);
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                param->value = xmlNodeGetContent(content);
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (lastparam == NULL) {
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->attrs = lastparam = param;
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    lastparam->next = param;
3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    lastparam = param;
3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (lib != NULL) {
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            content = content->next;
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Handle optional except
3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((content != NULL)
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        && (xmlStrEqual(content->name, BAD_CAST "except"))) {
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr child;
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr tmp2, last = NULL;
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        except = xmlRelaxNGNewDefine(ctxt, node);
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (except == NULL) {
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (def);
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        except->type = XML_RELAXNG_EXCEPT;
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = content->children;
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	def->content = except;
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (child == NULL) {
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, content, XML_RNGP_EXCEPT_NO_CONTENT,
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "except has no content\n", NULL, NULL);
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (child != NULL) {
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp2 = xmlRelaxNGParsePattern(ctxt, child);
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp2 != NULL) {
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (last == NULL) {
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    except->content = last = tmp2;
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    last->next = tmp2;
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    last = tmp2;
3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        content = content->next;
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check there is no unhandled data
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (content != NULL) {
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, content, XML_RNGP_DATA_CONTENT,
3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Element data has unexpected content %s\n",
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   content->name, NULL);
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *invalidName = BAD_CAST "\1";
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompareNameClasses:
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs1:  the first element/attribute defs
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs2:  the second element/attribute defs
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the restriction on the name
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the restriction on the namespace
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the 2 lists of element definitions. The comparison is
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that if both lists do not accept the same QNames, it returns 1
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the 2 lists can accept the same QName the comparison returns 0
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 disttinct, 0 if equal
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1,
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGDefinePtr def2)
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNode node;
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNs ns;
3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidCtxt ctxt;
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(&ctxt, 0, sizeof(xmlRelaxNGValidCtxt));
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt.flags = FLAGS_IGNORABLE | FLAGS_NOERROR;
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def1->type == XML_RELAXNG_ELEMENT) ||
3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def1->type == XML_RELAXNG_ATTRIBUTE)) {
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def2->type == XML_RELAXNG_TEXT)
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (1);
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def1->name != NULL) {
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.name = def1->name;
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.name = invalidName;
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def1->ns != NULL) {
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def1->ns[0] == 0) {
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node.ns = NULL;
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        node.ns = &ns;
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ns.href = def1->ns;
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.ns = NULL;
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlRelaxNGElementMatch(&ctxt, def2, &node)) {
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def1->nameClass != NULL) {
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCompareNameClasses(def1->nameClass, def2);
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (def1->type == XML_RELAXNG_TEXT) {
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def2->type == XML_RELAXNG_TEXT)
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (def1->type == XML_RELAXNG_EXCEPT) {
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO ret = 0;
3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO ret = 0;
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def2->type == XML_RELAXNG_ELEMENT) ||
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def2->type == XML_RELAXNG_ATTRIBUTE)) {
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def2->name != NULL) {
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.name = def2->name;
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.name = invalidName;
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node.ns = &ns;
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def2->ns != NULL) {
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def2->ns[0] == 0) {
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node.ns = NULL;
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ns.href = def2->ns;
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ns.href = invalidName;
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlRelaxNGElementMatch(&ctxt, def1, &node)) {
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def2->nameClass != NULL) {
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCompareNameClasses(def2->nameClass, def1);
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO ret = 0;
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompareElemDefLists:
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs1:  the first list of element/attribute defs
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs2:  the second list of element/attribute defs
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the 2 lists of element or attribute definitions. The comparison
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is that if both lists do not accept the same QNames, it returns 1
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the 2 lists can accept the same QName the comparison returns 0
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 disttinct, 0 if equal
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompareElemDefLists(xmlRelaxNGParserCtxtPtr ctxt
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              ATTRIBUTE_UNUSED, xmlRelaxNGDefinePtr * def1,
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGDefinePtr * def2)
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *basedef2 = def2;
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def1 == NULL) || (def2 == NULL))
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*def1 == NULL) || (*def2 == NULL))
3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*def1 != NULL) {
3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while ((*def2) != NULL) {
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlRelaxNGCompareNameClasses(*def1, *def2) == 0)
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def2++;
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def2 = basedef2;
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def1++;
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGenerateAttributes:
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the definition definition
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the definition can only generate attributes
3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGenerateAttributes(xmlRelaxNGParserCtxtPtr ctxt,
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGDefinePtr def)
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr parent, cur, tmp;
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    parent = NULL;
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def;
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_ELEMENT) ||
3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_TEXT) ||
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_DATATYPE) ||
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARAM) ||
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_LIST) ||
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_VALUE) ||
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_EMPTY))
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_CHOICE) ||
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_INTERLEAVE) ||
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_GROUP) ||
3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_ONEORMORE) ||
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_ZEROORMORE) ||
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_OPTIONAL) ||
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARENTREF) ||
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_EXTERNALREF) ||
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_REF) ||
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_DEF)) {
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->content != NULL) {
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent = cur;
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->content;
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = cur;
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (tmp != NULL) {
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp->parent = parent;
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = tmp->next;
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == def)
3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->next;
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->parent;
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == def)
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->next != NULL) {
3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->next;
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetElements:
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the definition definition
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @eora:  gather elements (0) or attributes (1)
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute the list of top elements a definition can generate
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a list of elements or NULL if none was found.
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr *
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetElements(xmlRelaxNGParserCtxtPtr ctxt,
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlRelaxNGDefinePtr def, int eora)
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *ret = NULL, parent, cur, tmp;
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 0;
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int max = 0;
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    parent = NULL;
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def;
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (((eora == 0) && ((cur->type == XML_RELAXNG_ELEMENT) ||
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             (cur->type == XML_RELAXNG_TEXT))) ||
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ((eora == 1) && (cur->type == XML_RELAXNG_ATTRIBUTE))) {
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == NULL) {
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                max = 10;
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = (xmlRelaxNGDefinePtr *)
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlMalloc((max + 1) * sizeof(xmlRelaxNGDefinePtr));
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == NULL) {
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErrMemory(ctxt, "getting element list\n");
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (NULL);
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (max <= len) {
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlRelaxNGDefinePtr *temp;
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                max *= 2;
4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                temp = xmlRealloc(ret,
4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (max + 1) * sizeof(xmlRelaxNGDefinePtr));
4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (temp == NULL) {
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErrMemory(ctxt, "getting element list\n");
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ret);
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (NULL);
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = temp;
4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret[len++] = cur;
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret[len] = NULL;
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((cur->type == XML_RELAXNG_CHOICE) ||
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_INTERLEAVE) ||
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_GROUP) ||
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_ONEORMORE) ||
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_ZEROORMORE) ||
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_OPTIONAL) ||
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_PARENTREF) ||
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_REF) ||
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_DEF) ||
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (cur->type == XML_RELAXNG_EXTERNALREF)) {
4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Don't go within elements or attributes or string values.
4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Just gather the element top list
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->content != NULL) {
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent = cur;
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->content;
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = cur;
4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (tmp != NULL) {
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp->parent = parent;
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = tmp->next;
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == def)
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->next;
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->parent;
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == def)
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->next != NULL) {
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->next;
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckChoiceDeterminism:
4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the choice definition
4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also used to find indeterministic pattern in choice
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckChoiceDeterminism(xmlRelaxNGParserCtxtPtr ctxt,
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlRelaxNGDefinePtr def)
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr **list;
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchild = 0, i, j, ret;
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_nullable = 0;
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_indeterminist = 0;
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr triage = NULL;
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_triable = 1;
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def == NULL) || (def->type != XML_RELAXNG_CHOICE))
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def->dflags & IS_PROCESSED)
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    is_nullable = xmlRelaxNGIsNullable(def);
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbchild++;
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild *
4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                              sizeof(xmlRelaxNGDefinePtr
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     *));
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL) {
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "building choice\n");
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = 0;
4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * a bit strong but safe
4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_nullable == 0) {
4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        triage = xmlHashCreate(10);
4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        is_triable = 0;
4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list[i] = xmlRelaxNGGetElements(ctxt, cur, 0);
4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((list[i] == NULL) || (list[i][0] == NULL)) {
4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            is_triable = 0;
4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (is_triable == 1) {
4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDefinePtr *tmp;
4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int res;
4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = list[i];
4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((*tmp != NULL) && (is_triable == 1)) {
4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((*tmp)->type == XML_RELAXNG_TEXT) {
4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    res = xmlHashAddEntry2(triage,
4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           BAD_CAST "#text", NULL,
4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           (void *) cur);
4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_triable = -1;
4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           ((*tmp)->name != NULL)) {
4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(triage,
4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (*tmp)->name, NULL,
4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) cur);
4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(triage,
4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (*tmp)->name, (*tmp)->ns,
4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) cur);
4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_triable = -1;
4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) {
4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(triage,
4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "#any", NULL,
4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) cur);
4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(triage,
4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "#any", (*tmp)->ns,
4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) cur);
4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_triable = -1;
4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    is_triable = -1;
4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp++;
4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i++;
4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbchild; i++) {
4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (list[i] == NULL)
4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = 0; j < i; j++) {
4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (list[j] == NULL)
4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]);
4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                is_indeterminist = 1;
4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbchild; i++) {
4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (list[i] != NULL)
4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(list[i]);
4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_indeterminist) {
4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_INDETERMINIST;
4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_triable == 1) {
4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_TRIABLE;
4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->data = triage;
4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (triage != NULL) {
4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(triage, NULL);
4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->dflags |= IS_PROCESSED;
4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckGroupAttrs:
4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the group definition
4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Detects violations of rule 7.3
4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckGroupAttrs(xmlRelaxNGParserCtxtPtr ctxt,
4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGDefinePtr def)
4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr **list;
4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchild = 0, i, j, ret;
4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def == NULL) ||
4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((def->type != XML_RELAXNG_GROUP) &&
4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         (def->type != XML_RELAXNG_ELEMENT)))
4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def->dflags & IS_PROCESSED)
4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->attrs;
4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbchild++;
4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbchild++;
4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild *
4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                              sizeof(xmlRelaxNGDefinePtr
4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     *));
4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL) {
4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "building group\n");
4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = 0;
4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->attrs;
4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list[i] = xmlRelaxNGGetElements(ctxt, cur, 1);
4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i++;
4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list[i] = xmlRelaxNGGetElements(ctxt, cur, 1);
4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i++;
4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbchild; i++) {
4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (list[i] == NULL)
4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = 0; j < i; j++) {
4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (list[j] == NULL)
4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]);
4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, def->node, XML_RNGP_GROUP_ATTR_CONFLICT,
4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Attributes conflicts in group\n", NULL, NULL);
4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbchild; i++) {
4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (list[i] != NULL)
4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(list[i]);
4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->dflags |= IS_PROCESSED;
4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGComputeInterleaves:
4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the interleave definition
4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the definition name
4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A lot of work for preprocessing interleave definitions
4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is potentially needed to get a decent execution speed at runtime
4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - trying to get a total order on the element nodes generated
4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     by the interleaves, order the list of interleave definitions
4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     following that order.
4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - if <text/> is used to handle mixed content, it is better to
4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     flag this in the define and simplify the runtime checking
4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     algorithm
4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def,
4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGParserCtxtPtr ctxt,
4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlChar * name ATTRIBUTE_UNUSED)
4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur, *tmp;
4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPartitionPtr partitions = NULL;
4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr *groups = NULL;
4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr group;
4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, ret, res;
4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbgroups = 0;
4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchild = 0;
4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_mixed = 0;
4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_determinist = 1;
4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE
4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlRelaxNGComputeInterleaves(%s)\n", name);
4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbchild++;
4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE
4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "  %d child\n", nbchild);
4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    groups = (xmlRelaxNGInterleaveGroupPtr *)
4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlMalloc(nbchild * sizeof(xmlRelaxNGInterleaveGroupPtr));
4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (groups == NULL)
4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr)
4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup));
4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (groups[nbgroups] == NULL)
4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type == XML_RELAXNG_TEXT)
4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            is_mixed++;
4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        groups[nbgroups]->rule = cur;
4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur, 0);
4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt, cur, 1);
4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbgroups++;
4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE
4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "  %d groups\n", nbgroups);
4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Let's check that all rules makes a partitions according to 7.4
4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    partitions = (xmlRelaxNGPartitionPtr)
4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlMalloc(sizeof(xmlRelaxNGPartition));
4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (partitions == NULL)
4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(partitions, 0, sizeof(xmlRelaxNGPartition));
4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    partitions->nbgroups = nbgroups;
4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    partitions->triage = xmlHashCreate(nbgroups);
4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbgroups; i++) {
4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        group = groups[i];
4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = i + 1; j < nbgroups; j++) {
4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (groups[j] == NULL)
4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompareElemDefLists(ctxt, group->defs,
4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                groups[j]->defs);
4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, def->node, XML_RNGP_ELEM_TEXT_CONFLICT,
4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Element or text conflicts in interleave\n",
4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompareElemDefLists(ctxt, group->attrs,
4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                groups[j]->attrs);
4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, def->node, XML_RNGP_ATTR_CONFLICT,
4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Attributes conflicts in interleave\n", NULL,
4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = group->defs;
4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((tmp != NULL) && (*tmp != NULL)) {
4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (*tmp != NULL) {
4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((*tmp)->type == XML_RELAXNG_TEXT) {
4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    res = xmlHashAddEntry2(partitions->triage,
4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           BAD_CAST "#text", NULL,
4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           (void *) (long) (i + 1));
4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_determinist = -1;
4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           ((*tmp)->name != NULL)) {
4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(partitions->triage,
4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (*tmp)->name, NULL,
4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) (long) (i + 1));
4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(partitions->triage,
4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (*tmp)->name, (*tmp)->ns,
4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) (long) (i + 1));
4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_determinist = -1;
4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) {
4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(partitions->triage,
4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "#any", NULL,
4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) (long) (i + 1));
4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(partitions->triage,
4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "#any", (*tmp)->ns,
4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) (long) (i + 1));
4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((*tmp)->nameClass != NULL)
4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_determinist = 2;
4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_determinist = -1;
4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    is_determinist = -1;
4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp++;
4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            is_determinist = 0;
4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    partitions->groups = groups;
4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * and save the partition list back in the def
4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->data = partitions;
4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_mixed != 0)
4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_MIXED;
4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_determinist == 1)
4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        partitions->flags = IS_DETERMINIST;
4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_determinist == 2)
4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        partitions->flags = IS_DETERMINIST | IS_NEEDCHECK;
4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  error:
4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRngPErrMemory(ctxt, "in interleave computation\n");
4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (groups != NULL) {
4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < nbgroups; i++)
4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (groups[i] != NULL) {
4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (groups[i]->defs != NULL)
4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(groups[i]->defs);
4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(groups[i]);
4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(groups);
4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGFreePartition(partitions);
4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseInterleave:
4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the data node.
4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG interleave node.
4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error
4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseInterleave(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL;
4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr last = NULL, cur;
4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def = xmlRelaxNGNewDefine(ctxt, node);
4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL) {
4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->type = XML_RELAXNG_INTERLEAVE;
4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->interleaves == NULL)
4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->interleaves = xmlHashCreate(10);
4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->interleaves == NULL) {
4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "create interleaves\n");
4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        char name[32];
4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        snprintf(name, 32, "interleave%d", ctxt->nbInterleaves++);
4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST name, def) < 0) {
4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_ADD,
4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Failed to add %s to hash table\n",
4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       (const xmlChar *) name, NULL);
4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_NO_CONTENT,
4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Element interleave is empty\n", NULL, NULL);
4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_RELAXNG(child, "element")) {
4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGParseElement(ctxt, child);
4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGParsePattern(ctxt, child);
4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur != NULL) {
4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = def;
4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (last == NULL) {
4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->content = last = cur;
4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last->next = cur;
4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last = cur;
4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseInclude:
4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the include node
4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Integrate the content of an include node in the current grammar
4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success or -1 in case of error
4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr incl;
4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root;
4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, tmp;
4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    incl = node->psvi;
4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl == NULL) {
4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_INCLUDE_EMPTY,
4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Include node has no data\n", NULL, NULL);
4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = xmlDocGetRootElement(incl->doc);
4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root == NULL) {
4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, "Include document is empty\n",
4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrEqual(root->name, BAD_CAST "grammar")) {
4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING,
4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Include document root is not a grammar\n", NULL, NULL);
4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Merge the definition from both the include and the internal list
4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root->children != NULL) {
4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children);
4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0)
4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->children != NULL) {
4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children);
4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0)
4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseDefine:
4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the define node
4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG define element node.
4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success or -1 in case of error
4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;
4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, tmp;
4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def;
4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *olddefine;
4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlGetProp(node, BAD_CAST "name");
4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_NAME_MISSING,
4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "define has no name\n", NULL, NULL);
4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGNormExtSpace(name);
4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlValidateNCName(name, 0)) {
4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_INVALID_DEFINE_NAME,
4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "define name '%s' is not an NCName\n", name, NULL);
4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL) {
4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(name);
4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_DEF;
4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->name = name;
4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_EMPTY,
4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "define has no children\n", NULL, NULL);
4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            olddefine = ctxt->define;
4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->define = name;
4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 0);
4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->define = olddefine;
4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar->defs == NULL)
4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar->defs = xmlHashCreate(10);
4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar->defs == NULL) {
4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED,
4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Could not create definition hash\n", NULL, NULL);
4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlHashAddEntry(ctxt->grammar->defs, name, def);
4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp < 0) {
4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr prev;
4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = xmlHashLookup(ctxt->grammar->defs, name);
4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (prev == NULL) {
4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED,
4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Internal error on define aggregation of %s\n",
4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               name, NULL);
4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (prev->nextHash != NULL)
4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        prev = prev->nextHash;
4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev->nextHash = def;
4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4653df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGParseImportRef:
4654df143a5041f03a22808b59c76698770b74692815Selim Gurun * @payload: the parser context
4655df143a5041f03a22808b59c76698770b74692815Selim Gurun * @data: the current grammar
4656df143a5041f03a22808b59c76698770b74692815Selim Gurun * @name: the reference name
4657df143a5041f03a22808b59c76698770b74692815Selim Gurun *
4658df143a5041f03a22808b59c76698770b74692815Selim Gurun * Import import one references into the current grammar
4659df143a5041f03a22808b59c76698770b74692815Selim Gurun */
4660df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
4661df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGParseImportRef(void *payload, void *data, xmlChar *name) {
4662df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr) data;
4663df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRelaxNGDefinePtr def = (xmlRelaxNGDefinePtr) payload;
4664df143a5041f03a22808b59c76698770b74692815Selim Gurun    int tmp;
4665df143a5041f03a22808b59c76698770b74692815Selim Gurun
4666df143a5041f03a22808b59c76698770b74692815Selim Gurun    def->dflags |= IS_EXTERNAL_REF;
4667df143a5041f03a22808b59c76698770b74692815Selim Gurun
4668df143a5041f03a22808b59c76698770b74692815Selim Gurun    tmp = xmlHashAddEntry(ctxt->grammar->refs, name, def);
4669df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (tmp < 0) {
4670df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlRelaxNGDefinePtr prev;
4671df143a5041f03a22808b59c76698770b74692815Selim Gurun
4672df143a5041f03a22808b59c76698770b74692815Selim Gurun        prev = (xmlRelaxNGDefinePtr)
4673df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlHashLookup(ctxt->grammar->refs, def->name);
4674df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (prev == NULL) {
4675df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (def->name != NULL) {
4676df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED,
4677df143a5041f03a22808b59c76698770b74692815Selim Gurun                           "Error refs definitions '%s'\n",
4678df143a5041f03a22808b59c76698770b74692815Selim Gurun                           def->name, NULL);
4679df143a5041f03a22808b59c76698770b74692815Selim Gurun            } else {
4680df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED,
4681df143a5041f03a22808b59c76698770b74692815Selim Gurun                           "Error refs definitions\n",
4682df143a5041f03a22808b59c76698770b74692815Selim Gurun                           NULL, NULL);
4683df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
4684df143a5041f03a22808b59c76698770b74692815Selim Gurun        } else {
4685df143a5041f03a22808b59c76698770b74692815Selim Gurun            def->nextHash = prev->nextHash;
4686df143a5041f03a22808b59c76698770b74692815Selim Gurun            prev->nextHash = def;
4687df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
4688df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
4689df143a5041f03a22808b59c76698770b74692815Selim Gurun}
4690df143a5041f03a22808b59c76698770b74692815Selim Gurun
4691df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
4692df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGParseImportRefs:
4693df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: the parser context
4694df143a5041f03a22808b59c76698770b74692815Selim Gurun * @grammar: the sub grammar
4695df143a5041f03a22808b59c76698770b74692815Selim Gurun *
4696df143a5041f03a22808b59c76698770b74692815Selim Gurun * Import references from the subgrammar into the current grammar
4697df143a5041f03a22808b59c76698770b74692815Selim Gurun *
4698df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 0 in case of success, -1 in case of failure
4699df143a5041f03a22808b59c76698770b74692815Selim Gurun */
4700df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
4701df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGParseImportRefs(xmlRelaxNGParserCtxtPtr ctxt,
4702df143a5041f03a22808b59c76698770b74692815Selim Gurun                          xmlRelaxNGGrammarPtr grammar) {
4703df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((ctxt == NULL) || (grammar == NULL) || (ctxt->grammar == NULL))
4704df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(-1);
4705df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (grammar->refs == NULL)
4706df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(0);
4707df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt->grammar->refs == NULL)
4708df143a5041f03a22808b59c76698770b74692815Selim Gurun        ctxt->grammar->refs = xmlHashCreate(10);
4709df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt->grammar->refs == NULL) {
4710df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED,
4711df143a5041f03a22808b59c76698770b74692815Selim Gurun                   "Could not create references hash\n", NULL, NULL);
4712df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(-1);
4713df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
4714df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlHashScan(grammar->refs, xmlRelaxNGParseImportRef, ctxt);
4715df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(0);
4716df143a5041f03a22808b59c76698770b74692815Selim Gurun}
4717df143a5041f03a22808b59c76698770b74692815Selim Gurun
4718df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
4719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGProcessExternalRef:
4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the externlRef node
4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process and compile an externlRef node
4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGDefinePtr or NULL in case of error
4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr docu;
4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root, tmp;
4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ns;
4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int newNs = 0, oldflags;
4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def;
4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    docu = node->psvi;
4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu != NULL) {
4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_EXTERNALREF;
4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (docu->content == NULL) {
4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Then do the parsing for good
4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            root = xmlDocGetRootElement(docu->doc);
4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (root == NULL) {
4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_EXTERNALREF_EMTPY,
4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "xmlRelaxNGParse: %s is empty\n", ctxt->URL,
4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (NULL);
4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * ns transmission rules
4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ns = xmlGetProp(root, BAD_CAST "ns");
4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ns == NULL) {
4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = node;
4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((tmp != NULL) && (tmp->type == XML_ELEMENT_NODE)) {
4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ns = xmlGetProp(tmp, BAD_CAST "ns");
4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns != NULL) {
4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = tmp->parent;
4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ns != NULL) {
4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlSetProp(root, BAD_CAST "ns", ns);
4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newNs = 1;
4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(ns);
4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(ns);
4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Parsing to get a precompiled schemas.
4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldflags = ctxt->flags;
4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags |= XML_RELAXNG_IN_EXTERNALREF;
4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            docu->schema = xmlRelaxNGParseDocument(ctxt, root);
4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((docu->schema != NULL) &&
4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (docu->schema->topgrammar != NULL)) {
4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                docu->content = docu->schema->topgrammar->start;
4786df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (docu->schema->topgrammar->refs)
4787df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlRelaxNGParseImportRefs(ctxt, docu->schema->topgrammar);
4788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * the externalRef may be reused in a different ns context
4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (newNs == 1) {
4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlUnsetProp(root, BAD_CAST "ns");
4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->content = docu->content;
4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = NULL;
4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParsePattern:
4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the pattern node.
4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG pattern node.
4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error or if no
4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     pattern is generated.
4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL;
4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL) {
4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_RELAXNG(node, "element")) {
4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseElement(ctxt, node);
4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "attribute")) {
4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseAttribute(ctxt, node);
4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "empty")) {
4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_EMPTY;
4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_NOT_EMPTY,
4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "empty: had a child node\n", NULL, NULL);
4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "text")) {
4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_TEXT;
4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_TEXT_HAS_CHILD,
4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "text: had a child node\n", NULL, NULL);
4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "zeroOrMore")) {
4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_ZEROORMORE;
4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 1);
4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "oneOrMore")) {
4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_ONEORMORE;
4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 1);
4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "optional")) {
4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_OPTIONAL;
4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 1);
4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "choice")) {
4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_CHOICE;
4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 0);
4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "group")) {
4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_GROUP;
4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 0);
4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "ref")) {
4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_REF;
4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->name = xmlGetProp(node, BAD_CAST "name");
4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def->name == NULL) {
4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_REF_NO_NAME, "ref has no name\n",
4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL, NULL);
4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGNormExtSpace(def->name);
4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlValidateNCName(def->name, 0)) {
4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_REF_NAME_INVALID,
4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "ref name '%s' is not an NCName\n", def->name,
4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_REF_NOT_EMPTY, "ref is not empty\n",
4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL, NULL);
4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar->refs == NULL)
4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar->refs = xmlHashCreate(10);
4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar->refs == NULL) {
4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED,
4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Could not create references hash\n", NULL, NULL);
4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = NULL;
4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int tmp;
4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlHashAddEntry(ctxt->grammar->refs, def->name, def);
4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp < 0) {
4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr prev;
4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = (xmlRelaxNGDefinePtr)
4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlHashLookup(ctxt->grammar->refs, def->name);
4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (prev == NULL) {
4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (def->name != NULL) {
4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED,
4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   "Error refs definitions '%s'\n",
4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   def->name, NULL);
4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED,
4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   "Error refs definitions\n",
4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   NULL, NULL);
4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def = NULL;
4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->nextHash = prev->nextHash;
4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev->nextHash = def;
4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "data")) {
4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseData(ctxt, node);
4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "value")) {
4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseValue(ctxt, node);
4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "list")) {
4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_LIST;
4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 0);
4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "interleave")) {
4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseInterleave(ctxt, node);
4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "externalRef")) {
4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGProcessExternalRef(ctxt, node);
4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "notAllowed")) {
4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_NOT_ALLOWED;
4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_NOTALLOWED_NOT_EMPTY,
4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "xmlRelaxNGParse: notAllowed element is not empty\n",
4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL, NULL);
4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "grammar")) {
4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGGrammarPtr grammar, old;
4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGGrammarPtr oldparent;
4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GRAMMAR
4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Found <grammar> pattern\n");
4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldparent = ctxt->parentgrammar;
4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        old = ctxt->grammar;
4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->parentgrammar = old;
4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        grammar = xmlRelaxNGParseGrammar(ctxt, node->children);
5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old != NULL) {
5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar = old;
5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->parentgrammar = oldparent;
5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (grammar != NULL) {
5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                grammar->next = old->next;
5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                old->next = grammar;
5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (grammar != NULL)
5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = grammar->start;
5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = NULL;
5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "parentRef")) {
5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->parentgrammar == NULL) {
5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_PARENT,
5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Use of parentRef without a parent grammar\n", NULL,
5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_PARENTREF;
5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->name = xmlGetProp(node, BAD_CAST "name");
5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def->name == NULL) {
5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_NAME,
5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "parentRef has no name\n", NULL, NULL);
5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGNormExtSpace(def->name);
5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlValidateNCName(def->name, 0)) {
5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NAME_INVALID,
5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "parentRef name '%s' is not an NCName\n",
5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           def->name, NULL);
5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NOT_EMPTY,
5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "parentRef is not empty\n", NULL, NULL);
5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->parentgrammar->refs == NULL)
5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->parentgrammar->refs = xmlHashCreate(10);
5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->parentgrammar->refs == NULL) {
5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED,
5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Could not create references hash\n", NULL, NULL);
5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = NULL;
5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (def->name != NULL) {
5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int tmp;
5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp =
5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlHashAddEntry(ctxt->parentgrammar->refs, def->name, def);
5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp < 0) {
5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr prev;
5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = (xmlRelaxNGDefinePtr)
5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlHashLookup(ctxt->parentgrammar->refs, def->name);
5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (prev == NULL) {
5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED,
5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Internal error parentRef definitions '%s'\n",
5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               def->name, NULL);
5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def = NULL;
5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->nextHash = prev->nextHash;
5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev->nextHash = def;
5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "mixed")) {
5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, "Mixed is empty\n",
5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL, NULL);
5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = NULL;
5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = xmlRelaxNGParseInterleave(ctxt, node);
5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def != NULL) {
5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr tmp;
5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((def->content != NULL) && (def->content->next != NULL)) {
5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = xmlRelaxNGNewDefine(ctxt, node);
5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp != NULL) {
5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp->type = XML_RELAXNG_GROUP;
5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp->content = def->content;
5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        def->content = tmp;
5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGNewDefine(ctxt, node);
5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp == NULL)
5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (def);
5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp->type = XML_RELAXNG_TEXT;
5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp->next = def->content;
5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->content = tmp;
5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_CONSTRUCT,
5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Unexpected node %s is not a pattern\n", node->name,
5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = NULL;
5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseAttribute:
5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the element node
5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG attribute node.
5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret, cur;
5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int old_flags;
5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGNewDefine(ctxt, node);
5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_RELAXNG_ATTRIBUTE;
5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->parent = ctxt->def;
5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_EMPTY,
5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNGParseattribute: attribute has no children\n",
5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    old_flags = ctxt->flags;
5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags |= XML_RELAXNG_IN_ATTRIBUTE;
5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGParseNameClass(ctxt, child, ret);
5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur != NULL)
5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = xmlRelaxNGParsePattern(ctxt, child);
5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur != NULL) {
5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            switch (cur->type) {
5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EMPTY:
5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_NOT_ALLOWED:
5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_TEXT:
5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ELEMENT:
5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_DATATYPE:
5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_VALUE:
5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_LIST:
5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_REF:
5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_PARENTREF:
5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EXTERNALREF:
5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_DEF:
5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ONEORMORE:
5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ZEROORMORE:
5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_OPTIONAL:
5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_CHOICE:
5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_GROUP:
5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_INTERLEAVE:
5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ATTRIBUTE:
5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret->content = cur;
5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->parent = ret;
5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_START:
5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_PARAM:
5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EXCEPT:
5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CONTENT,
5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "attribute has invalid content\n", NULL,
5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL);
5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_NOOP:
5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_NOOP,
5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, noop found in attribute\n",
5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CHILDREN,
5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "attribute has multiple children\n", NULL, NULL);
5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags = old_flags;
5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseExceptNameClass:
5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the except node
5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  1 if within an attribute, 0 if within an element
5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG nameClass node.
5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseExceptNameClass(xmlRelaxNGParserCtxtPtr ctxt,
5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               xmlNodePtr node, int attr)
5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret, cur, last = NULL;
5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!IS_RELAXNG(node, "except")) {
5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MISSING,
5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Expecting an except node\n", NULL, NULL);
5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->next != NULL) {
5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MULTIPLE,
5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "exceptNameClass allows only a single except node\n",
5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->children == NULL) {
5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_EMPTY, "except has no content\n",
5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGNewDefine(ctxt, node);
5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_RELAXNG_EXCEPT;
5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = xmlRelaxNGNewDefine(ctxt, child);
5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL)
5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (attr)
5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->type = XML_RELAXNG_ATTRIBUTE;
5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->type = XML_RELAXNG_ELEMENT;
5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlRelaxNGParseNameClass(ctxt, child, cur) != NULL) {
5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (last == NULL) {
5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->content = cur;
5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last->next = cur;
5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            last = cur;
5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseNameClass:
5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the nameClass node
5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the current definition
5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG nameClass node.
5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node,
5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGDefinePtr def)
5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret, tmp;
5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *val;
5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = def;
5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((IS_RELAXNG(node, "name")) || (IS_RELAXNG(node, "anyName")) ||
5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (IS_RELAXNG(node, "nsName"))) {
5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((def->type != XML_RELAXNG_ELEMENT) &&
5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (def->type != XML_RELAXNG_ATTRIBUTE)) {
5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGNewDefine(ctxt, node);
5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == NULL)
5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (NULL);
5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->parent = def;
5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE)
5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->type = XML_RELAXNG_ATTRIBUTE;
5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->type = XML_RELAXNG_ELEMENT;
5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_RELAXNG(node, "name")) {
5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        val = xmlNodeGetContent(node);
5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGNormExtSpace(val);
5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlValidateNCName(val, 0)) {
5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->parent != NULL)
5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME,
5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   "Element %s name '%s' is not an NCName\n",
5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   node->parent->name, val);
5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME,
5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   "name '%s' is not an NCName\n",
5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   val, NULL);
5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->name = val;
5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        val = xmlGetProp(node, BAD_CAST "ns");
5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->ns = val;
5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (val != NULL) &&
5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlStrEqual(val, BAD_CAST "http://www.w3.org/2000/xmlns"))) {
5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRngPErr(ctxt, node, XML_RNGP_XML_NS,
5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Attribute with namespace '%s' is not allowed\n",
5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        val, NULL);
5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (val != NULL) &&
5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (val[0] == 0) && (xmlStrEqual(ret->name, BAD_CAST "xmlns"))) {
5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRngPErr(ctxt, node, XML_RNGP_XMLNS_NAME,
5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Attribute with QName 'xmlns' is not allowed\n",
5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       val, NULL);
5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "anyName")) {
5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->name = NULL;
5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->ns = NULL;
5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->nameClass =
5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParseExceptNameClass(ctxt, node->children,
5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (def->type ==
5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                XML_RELAXNG_ATTRIBUTE));
5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "nsName")) {
5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->name = NULL;
5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->ns = xmlGetProp(node, BAD_CAST "ns");
5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret->ns == NULL) {
5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_NSNAME_NO_NS,
5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "nsName has no ns attribute\n", NULL, NULL);
5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (ret->ns != NULL) &&
5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlStrEqual
5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             (ret->ns, BAD_CAST "http://www.w3.org/2000/xmlns"))) {
5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_XML_NS,
5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Attribute with namespace '%s' is not allowed\n",
5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       ret->ns, NULL);
5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->nameClass =
5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParseExceptNameClass(ctxt, node->children,
5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (def->type ==
5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                XML_RELAXNG_ATTRIBUTE));
5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "choice")) {
5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr child;
5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr last = NULL;
5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGNewDefine(ctxt, node);
5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret == NULL)
5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->parent = def;
5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->type = XML_RELAXNG_CHOICE;
5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_EMPTY,
5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element choice is empty\n", NULL, NULL);
5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = node->children;
5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (child != NULL) {
5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGParseNameClass(ctxt, child, ret);
5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp != NULL) {
5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (last == NULL) {
5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last = ret->nameClass = tmp;
5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last->next = tmp;
5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last = tmp;
5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                child = child->next;
5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_CONTENT,
5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "expecting name, anyName, nsName or choice : got %s\n",
5372df143a5041f03a22808b59c76698770b74692815Selim Gurun                   (node == NULL ? (const xmlChar *) "nothing" : node->name),
5373df143a5041f03a22808b59c76698770b74692815Selim Gurun		   NULL);
5374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != def) {
5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def->nameClass == NULL) {
5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->nameClass = ret;
5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = def->nameClass;
5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (tmp->next != NULL) {
5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = tmp->next;
5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp->next = ret;
5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseElement:
5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the element node
5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG element node.
5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret, cur, last;
5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *olddefine;
5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGNewDefine(ctxt, node);
5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_RELAXNG_ELEMENT;
5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->parent = ctxt->def;
5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_EMPTY,
5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNGParseElement: element has no children\n",
5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGParseNameClass(ctxt, child, ret);
5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur != NULL)
5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NO_CONTENT,
5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNGParseElement: element has no content\n",
5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    olddefine = ctxt->define;
5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->define = NULL;
5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    last = NULL;
5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = xmlRelaxNGParsePattern(ctxt, child);
5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur != NULL) {
5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = ret;
5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            switch (cur->type) {
5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EMPTY:
5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_NOT_ALLOWED:
5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_TEXT:
5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ELEMENT:
5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_DATATYPE:
5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_VALUE:
5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_LIST:
5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_REF:
5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_PARENTREF:
5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EXTERNALREF:
5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_DEF:
5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ZEROORMORE:
5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ONEORMORE:
5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_OPTIONAL:
5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_CHOICE:
5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_GROUP:
5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_INTERLEAVE:
5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (last == NULL) {
5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret->content = last = cur;
5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((last->type == XML_RELAXNG_ELEMENT) &&
5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ret->content == last)) {
5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret->content = xmlRelaxNGNewDefine(ctxt, node);
5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ret->content != NULL) {
5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ret->content->type = XML_RELAXNG_GROUP;
5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ret->content->content = last;
5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ret->content = last;
5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last->next = cur;
5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last = cur;
5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ATTRIBUTE:
5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->next = ret->attrs;
5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret->attrs = cur;
5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_START:
5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT,
5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, start found in element\n",
5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_PARAM:
5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT,
5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, param found in element\n",
5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EXCEPT:
5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT,
5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, except found in element\n",
5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_NOOP:
5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT,
5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, noop found in element\n",
5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->define = olddefine;
5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParsePatterns:
5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  list of nodes
5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @group:  use an implicit <group> for elements
5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG start node.
5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes,
5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        int group)
5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL, last = NULL, cur, parent;
5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    parent = ctxt->def;
5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (nodes != NULL) {
5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_RELAXNG(nodes, "element")) {
5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGParseElement(ctxt, nodes);
5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def == NULL) {
5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def = last = cur;
5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((group == 1) && (def->type == XML_RELAXNG_ELEMENT) &&
5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (def == last)) {
5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def = xmlRelaxNGNewDefine(ctxt, nodes);
5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->type = XML_RELAXNG_GROUP;
5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->content = last;
5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last->next = cur;
5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last = cur;
5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = parent;
5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGParsePattern(ctxt, nodes);
5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur != NULL) {
5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (def == NULL) {
5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def = last = cur;
5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    last->next = cur;
5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    last = cur;
5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nodes = nodes->next;
5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseStart:
5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  start children nodes
5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG start node.
5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL, last;
5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nodes == NULL) {
5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, "start has no children\n",
5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_RELAXNG(nodes, "empty")) {
5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, nodes);
5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_EMPTY;
5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nodes->children != NULL) {
5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, nodes, XML_RNGP_EMPTY_CONTENT,
5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "element empty is not empty\n", NULL, NULL);
5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(nodes, "notAllowed")) {
5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, nodes);
5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_NOT_ALLOWED;
5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nodes->children != NULL) {
5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, nodes, XML_RNGP_NOTALLOWED_NOT_EMPTY,
5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "element notAllowed is not empty\n", NULL, NULL);
5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParsePatterns(ctxt, nodes, 1);
5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->grammar->start != NULL) {
5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        last = ctxt->grammar->start;
5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (last->next != NULL)
5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            last = last->next;
5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        last->next = def;
5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->grammar->start = def;
5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nodes = nodes->next;
5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nodes != NULL) {
5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_START_CONTENT,
5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "start more than one children\n", NULL, NULL);
5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseGrammarContent:
5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  grammar children nodes
5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG grammar node.
5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt,
5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlNodePtr nodes)
5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, tmp;
5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nodes == NULL) {
5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_EMPTY,
5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "grammar has no children\n", NULL, NULL);
5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (nodes != NULL) {
5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_RELAXNG(nodes, "start")) {
5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nodes->children == NULL) {
5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY,
5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "start has no children\n", NULL, NULL);
5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGParseStart(ctxt, nodes->children);
5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp != 0)
5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_RELAXNG(nodes, "define")) {
5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlRelaxNGParseDefine(ctxt, nodes);
5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != 0)
5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_RELAXNG(nodes, "include")) {
5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlRelaxNGParseInclude(ctxt, nodes);
5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != 0)
5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT,
5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "grammar has unexpected child %s\n", nodes->name,
5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nodes = nodes->next;
5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckReference:
5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ref:  the ref
5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name associated to the defines
5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine attribute rule for all the define
5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar using the same name.
5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckReference(xmlRelaxNGDefinePtr ref,
5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGParserCtxtPtr ctxt,
5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * name)
5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr grammar;
5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def, cur;
5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5675df143a5041f03a22808b59c76698770b74692815Selim Gurun    /*
5676df143a5041f03a22808b59c76698770b74692815Selim Gurun     * Those rules don't apply to imported ref from xmlRelaxNGParseImportRef
5677df143a5041f03a22808b59c76698770b74692815Selim Gurun     */
5678df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ref->dflags & IS_EXTERNAL_REF)
5679df143a5041f03a22808b59c76698770b74692815Selim Gurun        return;
5680df143a5041f03a22808b59c76698770b74692815Selim Gurun
5681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    grammar = ctxt->grammar;
5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar == NULL) {
5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR,
5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Internal error: no grammar in CheckReference %s\n",
5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   name, NULL);
5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ref->content != NULL) {
5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR,
5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Internal error: reference has content in CheckReference %s\n",
5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   name, NULL);
5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->defs != NULL) {
5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlHashLookup(grammar->defs, name);
5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def != NULL) {
5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = ref;
5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (cur != NULL) {
5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->content = def;
5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->nextHash;
5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF,
5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Reference %s has no matching definition\n", name,
5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF,
5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Reference %s has no matching definition\n", name,
5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckCombine:
5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the define(s) list
5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name associated to the defines
5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine attribute rule for all the define
5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar using the same name.
5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckCombine(xmlRelaxNGDefinePtr define,
5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * name)
5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *combine;
5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int choiceOrInterleave = -1;
5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int missing = 0;
5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur, last, tmp, tmp2;
5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->nextHash == NULL)
5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = define;
5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        combine = xmlGetProp(cur->node, BAD_CAST "combine");
5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (combine != NULL) {
5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlStrEqual(combine, BAD_CAST "choice")) {
5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (choiceOrInterleave == -1)
5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave = 1;
5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (choiceOrInterleave == 0) {
5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE,
5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Defines for %s use both 'choice' and 'interleave'\n",
5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               name, NULL);
5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(combine, BAD_CAST "interleave")) {
5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (choiceOrInterleave == -1)
5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave = 0;
5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (choiceOrInterleave == 1) {
5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE,
5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Defines for %s use both 'choice' and 'interleave'\n",
5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               name, NULL);
5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, define->node, XML_RNGP_UNKNOWN_COMBINE,
5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Defines for %s use unknown combine value '%s''\n",
5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           name, combine);
5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(combine);
5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (missing == 0)
5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                missing = 1;
5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else {
5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, define->node, XML_RNGP_NEED_COMBINE,
5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Some defines for %s needs the combine attribute\n",
5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           name, NULL);
5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->nextHash;
5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlRelaxNGCheckCombine(): merging %s defines: %d\n",
5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    name, choiceOrInterleave);
5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == -1)
5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        choiceOrInterleave = 0;
5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGNewDefine(ctxt, define->node);
5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == 0)
5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->type = XML_RELAXNG_INTERLEAVE;
5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->type = XML_RELAXNG_CHOICE;
5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = define;
5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    last = NULL;
5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (tmp != NULL) {
5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp->content != NULL) {
5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp->content->next != NULL) {
5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * we need first to create a wrapper.
5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node);
5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp2 == NULL)
5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp2->type = XML_RELAXNG_GROUP;
5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp2->content = tmp->content;
5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp2 = tmp->content;
5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (last == NULL) {
5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->content = tmp2;
5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last->next = tmp2;
5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            last = tmp2;
5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp->content = cur;
5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = tmp->nextHash;
5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    define->content = cur;
5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == 0) {
5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->interleaves == NULL)
5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->interleaves = xmlHashCreate(10);
5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->interleaves == NULL) {
5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Failed to create interleaves hash table\n", NULL,
5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            char tmpname[32];
5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++);
5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) <
5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                0) {
5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Failed to add %s to hash table\n",
5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   (const xmlChar *) tmpname, NULL);
5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCombineStart:
5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar:  the grammar
5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine rule for all the start
5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar.
5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt,
5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlRelaxNGGrammarPtr grammar)
5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr starts;
5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *combine;
5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int choiceOrInterleave = -1;
5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int missing = 0;
5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    starts = grammar->start;
5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((starts == NULL) || (starts->next == NULL))
5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = starts;
5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->node == NULL) || (cur->node->parent == NULL) ||
5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (!xmlStrEqual(cur->node->parent->name, BAD_CAST "start"))) {
5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            combine = NULL;
5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, cur->node, XML_RNGP_START_MISSING,
5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Internal error: start element not found\n", NULL,
5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            combine = xmlGetProp(cur->node->parent, BAD_CAST "combine");
5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (combine != NULL) {
5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlStrEqual(combine, BAD_CAST "choice")) {
5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (choiceOrInterleave == -1)
5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave = 1;
5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (choiceOrInterleave == 0) {
5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE,
5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "<start> use both 'choice' and 'interleave'\n",
5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(combine, BAD_CAST "interleave")) {
5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (choiceOrInterleave == -1)
5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave = 0;
5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (choiceOrInterleave == 1) {
5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE,
5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "<start> use both 'choice' and 'interleave'\n",
5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_UNKNOWN_COMBINE,
5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "<start> uses unknown combine value '%s''\n",
5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           combine, NULL);
5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(combine);
5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (missing == 0)
5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                missing = 1;
5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else {
5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_NEED_COMBINE,
5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Some <start> element miss the combine attribute\n",
5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlRelaxNGCombineStart(): merging <start>: %d\n",
5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave);
5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == -1)
5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        choiceOrInterleave = 0;
5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGNewDefine(ctxt, starts->node);
5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == 0)
5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->type = XML_RELAXNG_INTERLEAVE;
5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->type = XML_RELAXNG_CHOICE;
5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->content = grammar->start;
5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    grammar->start = cur;
5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == 0) {
5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->interleaves == NULL)
5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->interleaves = xmlHashCreate(10);
5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->interleaves == NULL) {
5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Failed to create interleaves hash table\n", NULL,
5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            char tmpname[32];
5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++);
5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) <
5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                0) {
5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Failed to add %s to hash table\n",
5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   (const xmlChar *) tmpname, NULL);
5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckCycles:
5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  grammar children nodes
5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth:  the counter
5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for cycles.
5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if check passed, and -1 in case of error
5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt,
5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlRelaxNGDefinePtr cur, int depth)
5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((ret == 0) && (cur != NULL)) {
5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_REF) ||
5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARENTREF)) {
5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->depth == -1) {
5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = depth;
5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth);
5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = -2;
5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (depth == cur->depth) {
5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_CYCLE,
5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Detected a cycle in %s references\n",
5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           cur->name, NULL);
5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (-1);
5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_ELEMENT) {
5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1);
5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth);
5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTryUnlink:
5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the definition to unlink
5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent:  the parent definition
5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prev:  the previous sibling definition
5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to unlink a definition. If not possble make it a NOOP
5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new prev definition
5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGTryUnlink(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDefinePtr cur,
5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDefinePtr parent, xmlRelaxNGDefinePtr prev)
5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prev != NULL) {
5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        prev->next = cur->next;
5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (parent != NULL) {
5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (parent->content == cur)
5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->content = cur->next;
6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (parent->attrs == cur)
6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->attrs = cur->next;
6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (parent->nameClass == cur)
6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->nameClass = cur->next;
6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->type = XML_RELAXNG_NOOP;
6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            prev = cur;
6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (prev);
6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSimplify:
6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  grammar children nodes
6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for simplification of empty and notAllowed
6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlRelaxNGDefinePtr cur, xmlRelaxNGDefinePtr parent)
6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr prev = NULL;
6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_REF) ||
6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARENTREF)) {
6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->depth != -3) {
6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = -3;
6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGSimplify(ctxt, cur->content, cur);
6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) {
6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = parent;
6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((parent != NULL) &&
6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ((parent->type == XML_RELAXNG_ATTRIBUTE) ||
6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_LIST) ||
6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_GROUP) ||
6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_INTERLEAVE) ||
6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_ONEORMORE) ||
6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_ZEROORMORE))) {
6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->type = XML_RELAXNG_NOT_ALLOWED;
6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((parent != NULL) && (parent->type == XML_RELAXNG_CHOICE)) {
6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else
6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = cur;
6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_EMPTY) {
6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = parent;
6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((parent != NULL) &&
6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ((parent->type == XML_RELAXNG_ONEORMORE) ||
6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_ZEROORMORE))) {
6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->type = XML_RELAXNG_EMPTY;
6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((parent != NULL) &&
6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ((parent->type == XML_RELAXNG_GROUP) ||
6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_INTERLEAVE))) {
6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else
6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = cur;
6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = parent;
6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->content != NULL)
6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGSimplify(ctxt, cur->content, cur);
6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL))
6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGSimplify(ctxt, cur->attrs, cur);
6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->nameClass != NULL)
6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGSimplify(ctxt, cur->nameClass, cur);
6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * On Elements, try to move attribute only generating rules on
6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * the attrs rules.
6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->type == XML_RELAXNG_ELEMENT) {
6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int attronly;
6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr tmp, pre;
6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (cur->content != NULL) {
6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    attronly =
6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGGenerateAttributes(ctxt, cur->content);
6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (attronly == 1) {
6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * migrate cur->content to attrs
6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = cur->content;
6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->content = tmp->next;
6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp->next = cur->attrs;
6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->attrs = tmp;
6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * cur->content can generate elements or text
6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                pre = cur->content;
6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((pre != NULL) && (pre->next != NULL)) {
6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = pre->next;
6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    attronly = xmlRelaxNGGenerateAttributes(ctxt, tmp);
6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (attronly == 1) {
6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * migrate tmp to attrs
6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pre->next = tmp->next;
6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp->next = cur->attrs;
6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->attrs = tmp;
6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pre = tmp;
6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * This may result in a simplification
6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->type == XML_RELAXNG_GROUP) ||
6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->type == XML_RELAXNG_INTERLEAVE)) {
6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->content == NULL)
6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->type = XML_RELAXNG_EMPTY;
6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (cur->content->next == NULL) {
6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((parent == NULL) && (prev == NULL)) {
6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->type = XML_RELAXNG_NOOP;
6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if (prev == NULL) {
6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        parent->content = cur->content;
6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->content->next = cur->next;
6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur = cur->content;
6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->content->next = cur->next;
6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        prev->next = cur->content;
6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur = cur->content;
6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * the current node may have been transformed back
6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->type == XML_RELAXNG_EXCEPT) &&
6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->content != NULL) &&
6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->content->type == XML_RELAXNG_NOT_ALLOWED)) {
6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) {
6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((parent != NULL) &&
6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((parent->type == XML_RELAXNG_ATTRIBUTE) ||
6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_LIST) ||
6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_GROUP) ||
6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_INTERLEAVE) ||
6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_ONEORMORE) ||
6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_ZEROORMORE))) {
6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    parent->type = XML_RELAXNG_NOT_ALLOWED;
6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((parent != NULL) &&
6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (parent->type == XML_RELAXNG_CHOICE)) {
6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev = cur;
6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (cur->type == XML_RELAXNG_EMPTY) {
6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((parent != NULL) &&
6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((parent->type == XML_RELAXNG_ONEORMORE) ||
6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_ZEROORMORE))) {
6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    parent->type = XML_RELAXNG_EMPTY;
6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((parent != NULL) &&
6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((parent->type == XML_RELAXNG_GROUP) ||
6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_INTERLEAVE) ||
6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_CHOICE))) {
6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev = cur;
6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = cur;
6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGroupContentType:
6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct1:  the first content type
6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct2:  the second content type
6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to group 2 content types
6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type
6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType
6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGroupContentType(xmlRelaxNGContentType ct1,
6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlRelaxNGContentType ct2)
6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_ERROR) ||
6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_ERROR))
6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_ERROR);
6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ct1 == XML_RELAXNG_CONTENT_EMPTY)
6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ct2);
6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ct2 == XML_RELAXNG_CONTENT_EMPTY)
6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ct1);
6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) &&
6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_COMPLEX))
6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_COMPLEX);
6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (XML_RELAXNG_CONTENT_ERROR);
6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGMaxContentType:
6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct1:  the first content type
6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct2:  the second content type
6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute the max content-type
6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type
6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType
6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGMaxContentType(xmlRelaxNGContentType ct1,
6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGContentType ct2)
6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_ERROR) ||
6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_ERROR))
6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_ERROR);
6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_SIMPLE) ||
6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_SIMPLE))
6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_SIMPLE);
6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) ||
6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_COMPLEX))
6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_COMPLEX);
6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (XML_RELAXNG_CONTENT_EMPTY);
6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckRules:
6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current definition
6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags:  some accumulated flags
6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ptype:  the parent type
6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for rules in section 7.1 and 7.2
6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type of @cur
6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType
6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt,
6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlRelaxNGDefinePtr cur, int flags,
6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlRelaxNGType ptype)
6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6245df143a5041f03a22808b59c76698770b74692815Selim Gurun    int nflags;
6246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGContentType ret, tmp, val = XML_RELAXNG_CONTENT_EMPTY;
6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = XML_RELAXNG_CONTENT_EMPTY;
6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_REF) ||
6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARENTREF)) {
6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           /*
6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            * This should actually be caught by list//element(ref) at the
6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            * element boundaries, c.f. Bug #159968 local refs are dropped
6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            * in step 4.19.
6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            */
6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_REF,
6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//ref\n", NULL,
6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_REF,
6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//ref\n",
6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6269df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (cur->content == NULL) {
6270df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (cur->type == XML_RELAXNG_PARENTREF)
6271df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF,
6272df143a5041f03a22808b59c76698770b74692815Selim Gurun                               "Internal found no define for parent refs\n",
6273df143a5041f03a22808b59c76698770b74692815Selim Gurun                               NULL, NULL);
6274df143a5041f03a22808b59c76698770b74692815Selim Gurun                else
6275df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF,
6276df143a5041f03a22808b59c76698770b74692815Selim Gurun                               "Internal found no define for ref %s\n",
6277df143a5041f03a22808b59c76698770b74692815Selim Gurun                               (cur->name ? cur->name: BAD_CAST "null"), NULL);
6278df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
6279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->depth > -4) {
6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = -4;
6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCheckRules(ctxt, cur->content,
6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           flags, cur->type);
6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = ret - 15;
6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (cur->depth == -4) {
6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = XML_RELAXNG_CONTENT_COMPLEX;
6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = (xmlRelaxNGContentType) (cur->depth + 15);
6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_ELEMENT) {
6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * The 7.3 Attribute derivation rule for groups is plugged there
6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckGroupAttrs(ctxt, cur);
6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ELEM,
6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//element(ref)\n",
6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ELEM,
6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//element(ref)\n",
6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM,
6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern attribute//element(ref)\n",
6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM,
6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern attribute//element(ref)\n",
6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * reset since in the simple form elements are only child
6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * of grammar/define
6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nflags = 0;
6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->attrs, nflags, cur->type);
6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != XML_RELAXNG_CONTENT_EMPTY) {
6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_EMPTY,
6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Element %s attributes have a content type error\n",
6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           cur->name, NULL);
6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == XML_RELAXNG_CONTENT_ERROR) {
6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_ERROR,
6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Element %s has a content type error\n",
6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           cur->name, NULL);
6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = XML_RELAXNG_CONTENT_COMPLEX;
6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_ATTRIBUTE) {
6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ATTR,
6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern attribute//attribute\n",
6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ATTR,
6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//attribute\n",
6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_OOMGROUP) {
6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_GROUP_ATTR,
6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern oneOrMore//group//attribute\n",
6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_OOMINTERLEAVE) {
6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR,
6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern oneOrMore//interleave//attribute\n",
6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ATTR,
6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//attribute\n",
6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ATTR,
6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//attribute\n",
6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((!(flags & XML_RELAXNG_IN_ONEORMORE))
6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (cur->name == NULL)) {
6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->ns == NULL) {
6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR,
6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Found anyName attribute without oneOrMore ancestor\n",
6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur->node, XML_RNGP_NSNAME_ATTR_ANCESTOR,
6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Found nsName attribute without oneOrMore ancestor\n",
6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nflags = flags | XML_RELAXNG_IN_ATTRIBUTE;
6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckRules(ctxt, cur->content, nflags, cur->type);
6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_EMPTY;
6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((cur->type == XML_RELAXNG_ONEORMORE) ||
6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_ZEROORMORE)) {
6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ONEMORE,
6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//oneOrMore\n",
6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ONEMORE,
6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//oneOrMore\n",
6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nflags = flags | XML_RELAXNG_IN_ONEORMORE;
6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGGroupContentType(ret, ret);
6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_LIST) {
6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_LIST,
6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//list\n", NULL,
6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_LIST,
6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//list\n",
6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_LIST,
6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//list\n", NULL,
6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nflags = flags | XML_RELAXNG_IN_LIST;
6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_GROUP) {
6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_GROUP,
6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//group\n",
6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_GROUP,
6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//group\n", NULL,
6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ONEORMORE)
6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags | XML_RELAXNG_IN_OOMGROUP;
6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags;
6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * The 7.3 Attribute derivation rule for groups is plugged there
6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckGroupAttrs(ctxt, cur);
6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_INTERLEAVE) {
6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_INTERLEAVE,
6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//interleave\n",
6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE,
6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//interleave\n",
6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE,
6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//interleave\n",
6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ONEORMORE)
6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags | XML_RELAXNG_IN_OOMINTERLEAVE;
6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags;
6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_EXCEPT) {
6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->parent != NULL) &&
6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->parent->type == XML_RELAXNG_DATATYPE))
6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags | XML_RELAXNG_IN_DATAEXCEPT;
6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags;
6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_DATATYPE) {
6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_DATA,
6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//data\n", NULL,
6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_SIMPLE;
6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_VALUE) {
6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_VALUE,
6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//value\n", NULL,
6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_SIMPLE;
6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_TEXT) {
6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_TEXT,
6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//text\n", NULL,
6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_TEXT,
6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//text\n",
6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_TEXT,
6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//text\n", NULL,
6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_COMPLEX;
6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_EMPTY) {
6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_EMPTY,
6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//empty\n",
6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_EMPTY,
6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//empty\n", NULL,
6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_EMPTY;
6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_CHOICE) {
6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckChoiceDeterminism(ctxt, cur);
6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ptype == XML_RELAXNG_GROUP) {
6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            val = xmlRelaxNGGroupContentType(val, ret);
6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ptype == XML_RELAXNG_INTERLEAVE) {
6530df143a5041f03a22808b59c76698770b74692815Selim Gurun            /*
6531df143a5041f03a22808b59c76698770b74692815Selim Gurun             * TODO: scan complain that tmp is never used, seems on purpose
6532df143a5041f03a22808b59c76698770b74692815Selim Gurun             *       need double-checking
6533df143a5041f03a22808b59c76698770b74692815Selim Gurun             */
6534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlRelaxNGGroupContentType(val, ret);
6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != XML_RELAXNG_CONTENT_ERROR)
6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGMaxContentType(val, ret);
6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ptype == XML_RELAXNG_CHOICE) {
6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            val = xmlRelaxNGMaxContentType(val, ret);
6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ptype == XML_RELAXNG_LIST) {
6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            val = XML_RELAXNG_CONTENT_SIMPLE;
6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ptype == XML_RELAXNG_EXCEPT) {
6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == XML_RELAXNG_CONTENT_ERROR)
6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                val = XML_RELAXNG_CONTENT_ERROR;
6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                val = XML_RELAXNG_CONTENT_SIMPLE;
6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            val = xmlRelaxNGGroupContentType(val, ret);
6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (val);
6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseGrammar:
6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  grammar children nodes
6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a Relax-NG <grammar> node
6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal xmlRelaxNGGrammarPtr built or
6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr
6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr ret, tmp, old;
6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GRAMMAR
6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Parsing a new grammar\n");
6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGNewGrammar(ctxt);
6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Link the new grammar in the tree
6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->parent = ctxt->grammar;
6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->grammar != NULL) {
6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = ctxt->grammar->children;
6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar->children = ret;
6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (tmp->next != NULL)
6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = tmp->next;
6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp->next = ret;
6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    old = ctxt->grammar;
6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->grammar = ret;
6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGParseGrammarContent(ctxt, nodes);
6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->grammar = ret;
6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->grammar == NULL) {
6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT,
6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Failed to parse <grammar> content\n", NULL, NULL);
6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->grammar->start == NULL) {
6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_NO_START,
6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Element <grammar> has no <start>\n", NULL, NULL);
6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Apply 4.17 mergingd rules to defines and starts
6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGCombineStart(ctxt, ret);
6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->defs != NULL) {
6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine,
6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt);
6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * link together defines and refs in this grammar
6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->refs != NULL) {
6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashScan(ret->refs, (xmlHashScanner) xmlRelaxNGCheckReference,
6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt);
6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6621df143a5041f03a22808b59c76698770b74692815Selim Gurun
662260a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* @@@@ */
662360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
6624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->grammar = old;
6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseDocument:
6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the root node of the RelaxNG schema
6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a Relax-NG definition resource and build an internal
6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNG struture which can be used to validate instances.
6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML RelaxNG structure built or
6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr
6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema = NULL;
6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *olddefine;
6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr old;
6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (node == NULL))
6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    schema = xmlRelaxNGNewRelaxNG(ctxt);
6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    olddefine = ctxt->define;
6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->define = NULL;
6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_RELAXNG(node, "grammar")) {
6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children);
6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGGrammarPtr tmp, ret;
6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt);
6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (schema->topgrammar == NULL) {
6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (schema);
6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Link the new grammar in the tree
6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->parent = ctxt->grammar;
6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar != NULL) {
6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = ctxt->grammar->children;
6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == NULL) {
6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->grammar->children = ret;
6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (tmp->next != NULL)
6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = tmp->next;
6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp->next = ret;
6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        old = ctxt->grammar;
6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->grammar = ret;
6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGParseStart(ctxt, node);
6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old != NULL)
6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar = old;
6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->define = olddefine;
6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->topgrammar->start != NULL) {
6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0);
6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) {
6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL);
6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((schema->topgrammar->start != NULL) &&
6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (schema->topgrammar->start->type == XML_RELAXNG_NOOP) &&
6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (schema->topgrammar->start->next != NULL))
6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                schema->topgrammar->start =
6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    schema->topgrammar->start->content;
6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckRules(ctxt, schema->topgrammar->start,
6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 XML_RELAXNG_IN_START, XML_RELAXNG_NOOP);
6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "xmlRelaxNGParseDocument() failed\n");
6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (schema);
6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
6709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Reading RelaxNGs				*
6710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
6711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewParserCtxt:
6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the location of the schema
6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parse context for that file/resource expected
6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML RelaxNGs file.
6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr
6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewParserCtxt(const char *URL)
6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGParserCtxtPtr ret;
6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URL == NULL)
6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret =
6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(NULL, "building parser\n");
6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGParserCtxt));
6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->URL = xmlStrdup((const xmlChar *) URL);
6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->error = xmlGenericError;
6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->userData = xmlGenericErrorContext;
6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewMemParserCtxt:
6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  a pointer to a char array containing the schemas
6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the size of the array
6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parse context for that memory buffer expected
6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML RelaxNGs file.
6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr
6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewMemParserCtxt(const char *buffer, int size)
6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGParserCtxtPtr ret;
6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((buffer == NULL) || (size <= 0))
6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret =
6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(NULL, "building parser\n");
6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGParserCtxt));
6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buffer = buffer;
6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->size = size;
6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->error = xmlGenericError;
6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->userData = xmlGenericErrorContext;
6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewDocParserCtxt:
6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a preparsed document tree
6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parser context for that document.
6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: since the process of compiling a RelaxNG schemas modifies the
6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *       document, the @doc parameter is duplicated internally.
6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr
6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewDocParserCtxt(xmlDocPtr doc)
6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGParserCtxtPtr ret;
6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr copy;
6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL)
6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    copy = xmlCopyDoc(doc, 1);
6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (copy == NULL)
6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret =
6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(NULL, "building parser\n");
6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGParserCtxt));
6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->document = copy;
6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->freedoc = 1;
6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->userData = xmlGenericErrorContext;
6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeParserCtxt:
6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema parser context
6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxtPtr ctxt)
6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->URL != NULL)
6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->URL);
6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->doc != NULL)
6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeDocument(ctxt->doc);
6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->interleaves != NULL)
6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(ctxt->interleaves, NULL);
6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->documents != NULL)
6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeDocumentList(ctxt->documents);
6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->includes != NULL)
6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeIncludeList(ctxt->includes);
6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docTab != NULL)
6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->docTab);
6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incTab != NULL)
6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->incTab);
6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->defTab != NULL) {
6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->defNr; i++)
6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeDefine(ctxt->defTab[i]);
6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->defTab);
6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->document != NULL) && (ctxt->freedoc))
6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(ctxt->document);
6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNormExtSpace:
6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  a value
6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes the leading and ending spaces of the value
6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string is modified "in situ"
6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNormExtSpace(xmlChar * value)
6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *start = value;
6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cur = value;
6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == start) {
6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((*cur != 0) && (!IS_BLANK_CH(*cur)))
6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur++;
6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == 0)
6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return;
6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            start = cur;
6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (IS_BLANK_CH(*cur))
6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur++;
6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == 0) {
6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *start = 0;
6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return;
6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (1);
6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((*cur != 0) && (!IS_BLANK_CH(*cur)))
6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *start++ = *cur++;
6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == 0) {
6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *start = 0;
6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return;
6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* don't try to normalize the inner spaces */
6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (IS_BLANK_CH(*cur))
6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur++;
6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == 0) {
6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *start = 0;
6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return;
6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            *start++ = *cur++;
6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (1);
6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupAttributes:
6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a Relax-NG node
6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all the attributes on the given node
6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr cur, next;
6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = node->properties;
6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        next = cur->next;
6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->ns == NULL) ||
6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) {
6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlStrEqual(cur->name, BAD_CAST "name")) {
6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((!xmlStrEqual(node->name, BAD_CAST "element")) &&
6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "attribute")) &&
6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "ref")) &&
6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "parentRef")) &&
6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "param")) &&
6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "define"))) {
6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Attribute %s is not allowed on %s\n",
6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->name, node->name);
6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(cur->name, BAD_CAST "type")) {
6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((!xmlStrEqual(node->name, BAD_CAST "value")) &&
6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "data"))) {
6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Attribute %s is not allowed on %s\n",
6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->name, node->name);
6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(cur->name, BAD_CAST "href")) {
6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((!xmlStrEqual(node->name, BAD_CAST "externalRef")) &&
6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "include"))) {
6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Attribute %s is not allowed on %s\n",
6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->name, node->name);
6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(cur->name, BAD_CAST "combine")) {
6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((!xmlStrEqual(node->name, BAD_CAST "start")) &&
6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "define"))) {
6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Attribute %s is not allowed on %s\n",
6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->name, node->name);
6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(cur->name, BAD_CAST "datatypeLibrary")) {
6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *val;
6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlURIPtr uri;
6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                val = xmlNodeListGetString(node->doc, cur->children, 1);
6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (val[0] != 0) {
6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        uri = xmlParseURI((const char *) val);
6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (uri == NULL) {
6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRngPErr(ctxt, node, XML_RNGP_INVALID_URI,
6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       "Attribute %s contains invalid URI %s\n",
6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       cur->name, val);
6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (uri->scheme == NULL) {
6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRngPErr(ctxt, node, XML_RNGP_URI_NOT_ABSOLUTE,
6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           "Attribute %s URI %s is not absolute\n",
6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           cur->name, val);
6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (uri->fragment != NULL) {
6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRngPErr(ctxt, node, XML_RNGP_URI_FRAGMENT,
6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           "Attribute %s URI %s has a fragment ID\n",
6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           cur->name, val);
6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFreeURI(uri);
6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(val);
6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (!xmlStrEqual(cur->name, BAD_CAST "ns")) {
6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_ATTRIBUTE,
6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Unknown attribute %s on %s\n", cur->name,
6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           node->name);
6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = next;
6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupTree:
6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @root:  an xmlNodePtr subtree
6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the subtree from unwanted nodes for parsing, resolve
6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Include and externalRef lookups.
6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root)
6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur, delete;
6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    delete = NULL;
7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = root;
7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (delete != NULL) {
7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlUnlinkNode(delete);
7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFreeNode(delete);
7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            delete = NULL;
7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type == XML_ELEMENT_NODE) {
7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Simplification 4.1. Annotations
7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->ns == NULL) ||
7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (!xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) {
7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((cur->parent != NULL) &&
7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (cur->parent->type == XML_ELEMENT_NODE) &&
7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((xmlStrEqual(cur->parent->name, BAD_CAST "name")) ||
7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (xmlStrEqual(cur->parent->name, BAD_CAST "value")) ||
7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (xmlStrEqual(cur->parent->name, BAD_CAST "param")))) {
7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur, XML_RNGP_FOREIGN_ELEMENT,
7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "element %s doesn't allow foreign elements\n",
7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->parent->name, NULL);
7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                delete = cur;
7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto skip_children;
7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCleanupAttributes(ctxt, cur);
7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) {
7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *href, *ns, *base, *URL;
7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDocumentPtr docu;
7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr tmp;
7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlURIPtr uri;
7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ns = xmlGetProp(cur, BAD_CAST "ns");
7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns == NULL) {
7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = cur->parent;
7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while ((tmp != NULL) &&
7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (tmp->type == XML_ELEMENT_NODE)) {
7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ns = xmlGetProp(tmp, BAD_CAST "ns");
7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ns != NULL)
7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                break;
7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            tmp = tmp->parent;
7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    href = xmlGetProp(cur, BAD_CAST "href");
7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href == NULL) {
7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF,
7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "xmlRelaxNGParse: externalRef has no href attribute\n",
7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL, NULL);
7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    uri = xmlParseURI((const char *) href);
7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (uri == NULL) {
7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR,
7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Incorrect URI for externalRef %s\n",
7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   href, NULL);
7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (href != NULL)
7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(href);
7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (uri->fragment != NULL) {
7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR,
7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       "Fragment forbidden in URI for externalRef %s\n",
7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   href, NULL);
7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlFreeURI(uri);
7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (href != NULL)
7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(href);
7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFreeURI(uri);
7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    base = xmlNodeGetBase(cur->doc, cur);
7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    URL = xmlBuildURI(href, base);
7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (URL == NULL) {
7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR,
7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Failed to compute URL for externalRef %s\n",
7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   href, NULL);
7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (href != NULL)
7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(href);
7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (base != NULL)
7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(base);
7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href != NULL)
7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(href);
7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (base != NULL)
7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(base);
7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    docu = xmlRelaxNGLoadExternalRef(ctxt, URL, ns);
7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (docu == NULL) {
7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_EXTERNAL_REF_FAILURE,
7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Failed to load externalRef %s\n", URL,
7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL);
7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(URL);
7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns != NULL)
7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(ns);
7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(URL);
7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->psvi = docu;
7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (xmlStrEqual(cur->name, BAD_CAST "include")) {
7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *href, *ns, *base, *URL;
7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGIncludePtr incl;
7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr tmp;
7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    href = xmlGetProp(cur, BAD_CAST "href");
7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href == NULL) {
7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF,
7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "xmlRelaxNGParse: include has no href attribute\n",
7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL, NULL);
7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    base = xmlNodeGetBase(cur->doc, cur);
7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    URL = xmlBuildURI(href, base);
7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (URL == NULL) {
7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR,
7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Failed to compute URL for include %s\n",
7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   href, NULL);
7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (href != NULL)
7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(href);
7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (base != NULL)
7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(base);
7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href != NULL)
7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(href);
7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (base != NULL)
7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(base);
7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ns = xmlGetProp(cur, BAD_CAST "ns");
7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns == NULL) {
7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = cur->parent;
7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while ((tmp != NULL) &&
7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (tmp->type == XML_ELEMENT_NODE)) {
7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ns = xmlGetProp(tmp, BAD_CAST "ns");
7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ns != NULL)
7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                break;
7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            tmp = tmp->parent;
7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    incl = xmlRelaxNGLoadInclude(ctxt, URL, cur, ns);
7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns != NULL)
7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(ns);
7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (incl == NULL) {
7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_INCLUDE_FAILURE,
7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Failed to load include %s\n", URL,
7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL);
7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(URL);
7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(URL);
7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->psvi = incl;
7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((xmlStrEqual(cur->name, BAD_CAST "element")) ||
7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (xmlStrEqual(cur->name, BAD_CAST "attribute")))
7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                {
7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *name, *ns;
7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr text = NULL;
7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Simplification 4.8. name attribute of element
7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * and attribute elements
7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    name = xmlGetProp(cur, BAD_CAST "name");
7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (name != NULL) {
7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->children == NULL) {
7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            text =
7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlNewChild(cur, cur->ns, BAD_CAST "name",
7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            name);
7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlNodePtr node;
7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            node = xmlNewDocNode(cur->doc, cur->ns,
7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                         BAD_CAST "name", NULL);
7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (node != NULL) {
7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlAddPrevSibling(cur->children, node);
7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                text = xmlNewText(name);
7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlAddChild(node, text);
7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                text = node;
7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (text == NULL) {
7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRngPErr(ctxt, cur, XML_RNGP_CREATE_FAILURE,
7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       "Failed to create a name %s element\n",
7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       name, NULL);
7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlUnsetProp(cur, BAD_CAST "name");
7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(name);
7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ns = xmlGetProp(cur, BAD_CAST "ns");
7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL) {
7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (text != NULL) {
7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSetProp(text, BAD_CAST "ns", ns);
7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                /* xmlUnsetProp(cur, BAD_CAST "ns"); */
7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else if (xmlStrEqual(cur->name,
7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "attribute")) {
7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlSetProp(text, BAD_CAST "ns", BAD_CAST "");
7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((xmlStrEqual(cur->name, BAD_CAST "name")) ||
7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (xmlStrEqual(cur->name, BAD_CAST "nsName")) ||
7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (xmlStrEqual(cur->name, BAD_CAST "value"))) {
7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Simplification 4.8. name attribute of element
7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * and attribute elements
7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (xmlHasProp(cur, BAD_CAST "ns") == NULL) {
7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr node;
7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlChar *ns = NULL;
7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        node = cur->parent;
7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while ((node != NULL) &&
7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (node->type == XML_ELEMENT_NODE)) {
7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ns = xmlGetProp(node, BAD_CAST "ns");
7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ns != NULL) {
7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                break;
7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            node = node->parent;
7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns == NULL) {
7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlSetProp(cur, BAD_CAST "ns", BAD_CAST "");
7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlSetProp(cur, BAD_CAST "ns", ns);
7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (xmlStrEqual(cur->name, BAD_CAST "name")) {
7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlChar *name, *local, *prefix;
7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Simplification: 4.10. QNames
7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        name = xmlNodeGetContent(cur);
7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (name != NULL) {
7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            local = xmlSplitQName2(name, &prefix);
7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (local != NULL) {
7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlNsPtr ns;
7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ns = xmlSearchNs(cur->doc, cur, prefix);
7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (ns == NULL) {
7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlRngPErr(ctxt, cur,
7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               XML_RNGP_PREFIX_UNDEFINED,
7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               "xmlRelaxNGParse: no namespace for prefix %s\n",
7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               prefix, NULL);
7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                } else {
7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlSetProp(cur, BAD_CAST "ns",
7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               ns->href);
7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlNodeSetContent(cur, local);
7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlFree(local);
7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlFree(prefix);
7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(name);
7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * 4.16
7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (xmlStrEqual(cur->name, BAD_CAST "nsName")) {
7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRngPErr(ctxt, cur,
7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME,
7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       "Found nsName/except//nsName forbidden construct\n",
7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       NULL, NULL);
7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((xmlStrEqual(cur->name, BAD_CAST "except")) &&
7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (cur != root)) {
7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int oldflags = ctxt->flags;
7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * 4.16
7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((cur->parent != NULL) &&
7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (xmlStrEqual
7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (cur->parent->name, BAD_CAST "anyName"))) {
7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags |= XML_RELAXNG_IN_ANYEXCEPT;
7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGCleanupTree(ctxt, cur);
7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags = oldflags;
7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if ((cur->parent != NULL) &&
7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (xmlStrEqual
7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                (cur->parent->name, BAD_CAST "nsName"))) {
7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags |= XML_RELAXNG_IN_NSEXCEPT;
7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGCleanupTree(ctxt, cur);
7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags = oldflags;
7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (xmlStrEqual(cur->name, BAD_CAST "anyName")) {
7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * 4.16
7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->flags & XML_RELAXNG_IN_ANYEXCEPT) {
7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur,
7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME,
7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Found anyName/except//anyName forbidden construct\n",
7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL, NULL);
7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur,
7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME,
7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Found nsName/except//anyName forbidden construct\n",
7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL, NULL);
7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Thisd is not an else since "include" is transformed
7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * into a div
7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual(cur->name, BAD_CAST "div")) {
7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *ns;
7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr child, ins, tmp;
7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * implements rule 4.11
7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ns = xmlGetProp(cur, BAD_CAST "ns");
7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    child = cur->children;
7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ins = cur;
7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (child != NULL) {
7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL) {
7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (!xmlHasProp(child, BAD_CAST "ns")) {
7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSetProp(child, BAD_CAST "ns", ns);
7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = child->next;
7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlUnlinkNode(child);
7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ins = xmlAddNextSibling(ins, child);
7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        child = tmp;
7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns != NULL)
7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(ns);
7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * Since we are about to delete cur, if it's nsDef is non-NULL we
7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * need to preserve it (it contains the ns definitions for the
7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * children we just moved).  We'll just stick it on to the end
7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * of cur->parent's list, since it's never going to be re-serialized
7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * (bug 143738).
7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->nsDef != NULL) {
7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef;
7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			while (parDef->next != NULL)
7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parDef = parDef->next;
7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parDef->next = cur->nsDef;
7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur->nsDef = NULL;
7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    delete = cur;
7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto skip_children;
7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Simplification 4.2 whitespaces
7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if ((cur->type == XML_TEXT_NODE) ||
7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (cur->type == XML_CDATA_SECTION_NODE)) {
7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (IS_BLANK_NODE(cur)) {
7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->parent->type == XML_ELEMENT_NODE) {
7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value"))
7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        &&
7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (!xmlStrEqual
7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (cur->parent->name, BAD_CAST "param")))
7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    delete = cur;
7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto skip_children;
7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            delete = cur;
7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto skip_children;
7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Skip to next node
7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->children != NULL) {
7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->children->type != XML_ENTITY_DECL) &&
7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->children->type != XML_ENTITY_REF_NODE) &&
7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->children->type != XML_ENTITY_NODE)) {
7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->children;
7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      skip_children:
7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->next;
7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->parent;
7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == root) {
7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = NULL;
7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->next != NULL) {
7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->next;
7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (delete != NULL) {
7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlUnlinkNode(delete);
7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeNode(delete);
7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        delete = NULL;
7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupDoc:
7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  an xmldocPtr document pointer
7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the document from unwanted nodes for parsing, resolve
7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Include and externalRef lookups.
7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the cleaned up document or NULL in case of error
7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlDocPtr
7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc)
7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root;
7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Extract the root
7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = xmlDocGetRootElement(doc);
7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root == NULL) {
7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n",
7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   ctxt->URL, NULL);
7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGCleanupTree(ctxt, root);
7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (doc);
7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParse:
7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a schema definition resource and build an internal
7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML Shema struture which can be used to validate instances.
7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML RelaxNG structure built from the resource or
7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGPtr
7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParse(xmlRelaxNGParserCtxtPtr ctxt)
7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr ret = NULL;
7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root;
7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInitTypes();
7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * First step is to parse the input document into an DOM/Infoset
7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->URL != NULL) {
7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        doc = xmlReadFile((const char *) ctxt->URL,NULL,0);
7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (doc == NULL) {
7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR,
7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "xmlRelaxNGParse: could not load %s\n", ctxt->URL,
7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->buffer != NULL) {
7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        doc = xmlReadMemory(ctxt->buffer, ctxt->size,NULL,NULL,0);
7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (doc == NULL) {
7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR,
7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "xmlRelaxNGParse: could not parse schemas\n", NULL,
7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer");
7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->URL = xmlStrdup(BAD_CAST "in_memory_buffer");
7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->document != NULL) {
7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        doc = ctxt->document;
7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, NULL, XML_RNGP_EMPTY,
7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNGParse: nothing to parse\n", NULL, NULL);
7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->document = doc;
7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Some preprocessing of the document content
7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlRelaxNGCleanupDoc(ctxt, doc);
7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(ctxt->document);
7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->document = NULL;
7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Then do the parsing for good
7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = xmlDocGetRootElement(doc);
7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root == NULL) {
7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, (xmlNodePtr) doc,
7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n",
7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL);
7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(ctxt->document);
7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->document = NULL;
7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGParseDocument(ctxt, root);
7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(ctxt->document);
7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->document = NULL;
7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check the ref/defines links
7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * try to preprocess interleaves
7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->interleaves != NULL) {
7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashScan(ctxt->interleaves,
7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlHashScanner) xmlRelaxNGComputeInterleaves, ctxt);
7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * if there was a parsing error return NULL
7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors > 0) {
7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFree(ret);
7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->document = NULL;
7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(doc);
7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * try to compile (parts of) the schemas
7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret->topgrammar != NULL) && (ret->topgrammar->start != NULL)) {
7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret->topgrammar->start->type != XML_RELAXNG_START) {
7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDefinePtr def;
7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = xmlRelaxNGNewDefine(ctxt, NULL);
7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def != NULL) {
7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->type = XML_RELAXNG_START;
7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->content = ret->topgrammar->start;
7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->topgrammar->start = def;
7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGTryCompile(ctxt, ret->topgrammar->start);
7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Transfer the pointer for cleanup at the schema level.
7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->document = NULL;
7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->documents = ctxt->documents;
7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->documents = NULL;
7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->includes = ctxt->includes;
7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->includes = NULL;
7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->defNr = ctxt->defNr;
7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->defTab = ctxt->defTab;
7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->defTab = NULL;
7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->idref == 1)
7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->idref = 1;
7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetParserErrors:
7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error callback
7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn:  the warning callback
7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  contextual data for the callbacks
7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a validation context
7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidityErrorFunc err,
7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidityWarningFunc warn, void *ctx)
7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = err;
7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = warn;
7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = NULL;
7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->userData = ctx;
7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetParserErrors:
7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error callback result
7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn:  the warning callback result
7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  contextual data for the callbacks result
7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the callback information used to handle errors for a validation context
7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise.
7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidityErrorFunc * err,
7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidityWarningFunc * warn, void **ctx)
7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (err != NULL)
7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *err = ctxt->error;
7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (warn != NULL)
7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *warn = ctxt->warning;
7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctx != NULL)
7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *ctx = ctxt->userData;
7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetParserStructuredErrors:
7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror:  the error callback
7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  contextual data for the callbacks
7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a parsing context
7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt,
7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlStructuredErrorFunc serror,
7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    void *ctx)
7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = serror;
7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = NULL;
7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = NULL;
7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->userData = ctx;
7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
7667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Dump back a compiled form			*
7668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
7669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGDumpDefine(FILE * output,
7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlRelaxNGDefinePtr define);
7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpDefines:
7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines:  a list of define structures
7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back
7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpDefines(FILE * output, xmlRelaxNGDefinePtr defines)
7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (defines != NULL) {
7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDumpDefine(output, defines);
7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        defines = defines->next;
7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpDefine:
7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  a define structure
7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back
7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define)
7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL)
7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (define->type) {
7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<empty/>\n");
7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<notAllowed/>\n");
7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<text/>\n");
7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<element>\n");
7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->name != NULL) {
7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, "<name");
7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (define->ns != NULL)
7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    fprintf(output, " ns=\"%s\"", define->ns);
7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, ">%s</name>\n", define->name);
7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->attrs);
7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</element>\n");
7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<list>\n");
7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</list>\n");
7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<oneOrMore>\n");
7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</oneOrMore>\n");
7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:
7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<zeroOrMore>\n");
7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</zeroOrMore>\n");
7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:
7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<choice>\n");
7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</choice>\n");
7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<group>\n");
7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</group>\n");
7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<interleave>\n");
7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</interleave>\n");
7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:
7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<optional>\n");
7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</optional>\n");
7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<attribute>\n");
7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</attribute>\n");
7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<define");
7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->name != NULL)
7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, " name=\"%s\"", define->name);
7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, ">\n");
7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</define>\n");
7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<ref");
7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->name != NULL)
7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, " name=\"%s\"", define->name);
7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, ">\n");
7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</ref>\n");
7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<parentRef");
7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->name != NULL)
7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, " name=\"%s\"", define->name);
7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, ">\n");
7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</parentRef>\n");
7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<externalRef>");
7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</externalRef>\n");
7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO break;
7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO break;
7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpGrammar:
7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar:  a grammar structure
7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @top:  is this a top grammar
7810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back
7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top)
7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar == NULL)
7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "<grammar");
7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (top)
7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, " xmlns=\"http://relaxng.org/ns/structure/1.0\"");
7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (grammar->combine) {
7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_COMBINE_UNDEFINED:
7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_COMBINE_CHOICE:
7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, " combine=\"choice\"");
7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_COMBINE_INTERLEAVE:
7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, " combine=\"interleave\"");
7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, " <!-- invalid combine value -->");
7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, ">\n");
7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->start == NULL) {
7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, " <!-- grammar had no start -->");
7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "<start>\n");
7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDumpDefine(output, grammar->start);
7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "</start>\n");
7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO ? Dump the defines ? */
7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "</grammar>\n");
7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDump:
7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back
7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDump(FILE * output, xmlRelaxNGPtr schema)
7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL)
7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL) {
7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "RelaxNG empty or failed to compile\n");
7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "RelaxNG: ");
7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->doc == NULL) {
7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "no document\n");
7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (schema->doc->URL != NULL) {
7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "%s\n", schema->doc->URL);
7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "\n");
7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->topgrammar == NULL) {
7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "RelaxNG has no top grammar\n");
7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1);
7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpTree:
7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the transformed RelaxNG tree.
7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema)
7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL)
7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL) {
7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "RelaxNG empty or failed to compile\n");
7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->doc == NULL) {
7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "no document\n");
7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlDocDump(output, schema->doc);
7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
7903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Validation of compiled content				*
7904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
7905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        xmlRelaxNGDefinePtr define);
7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateCompiledCallback:
7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec:  the regular expression instance
7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token:  the token which matched
7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @transdata:  callback data, the define for the subelement if available
7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @ @inputdata:  callback data, the Relax NG validation context
7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle the callback and if needed validate the element children.
7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED,
7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   const xmlChar * token,
7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   void *transdata, void *inputdata)
7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata;
7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata;
7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE
7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Compiled callback for: '%s'\n", token);
7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) {
7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing context\n", token);
7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL) {
7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (token[0] == '#')
7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return;
7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing define\n", token);
7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (define == NULL)) {
7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing info\n", token);
7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (define->type != XML_RELAXNG_ELEMENT) {
7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s define is not element\n", token);
7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errNo == XML_RELAXNG_OK)
7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGValidateDefinition(ctxt, define);
7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->perr = ret;
7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateCompiledContent:
7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the RelaxNG validation context
7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp:  the regular expression as compiled
7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content:  list of children to test against the regexp
7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the content model of an element or start using the regexp
7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error.
7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt,
7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRegexpPtr regexp, xmlNodePtr content)
7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr exec;
7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int oldperr;
7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (regexp == NULL))
7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldperr = ctxt->perr;
7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec = xmlRegNewExecCtxt(regexp,
7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGValidateCompiledCallback, ctxt);
7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->perr = 0;
7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = content;
7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = cur;
7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        switch (cur->type) {
7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlIsBlankNode(cur))
7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt);
7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret < 0) {
7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG,
7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->parent->name);
7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->ns != NULL) {
8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRegExecPushString2(exec, cur->name,
8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                cur->ns->href, ctxt);
8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRegExecPushString(exec, cur->name, ctxt);
8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret < 0) {
8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, cur->name);
8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            default:
8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret < 0)
8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Switch to next element
8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegExecPushString(exec, NULL, NULL);
8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 1) {
8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = NULL;
8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret == 0) {
8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * TODO: get some of the names needed to exit the current state of exec
8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST "");
8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpValidError(ctxt);
8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegFreeExecCtxt(exec);
8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * There might be content model errors outside of the pure
8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * regexp validation, e.g. for attribute values.
8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (ctxt->perr != 0)) {
8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ctxt->perr;
8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->perr = oldperr;
8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
8048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Progressive validation of when possible			*
8049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
8050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           xmlRelaxNGDefinePtr defines);
8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt,
8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        int dolog);
8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt);
8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElemPush:
8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec:  the regexp runtime for the new content model
8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new regexp for the current node content model on the stack
8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error.
8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec)
8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemTab == NULL) {
8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elemMax = 10;
8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax *
8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        sizeof
8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        (xmlRegExecCtxtPtr));
8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->elemTab == NULL) {
8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "validating\n");
8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemNr >= ctxt->elemMax) {
8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elemMax *= 2;
8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab,
8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         ctxt->elemMax *
8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         sizeof
8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         (xmlRegExecCtxtPtr));
8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->elemTab == NULL) {
8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "validating\n");
8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->elemTab[ctxt->elemNr++] = exec;
8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->elem = exec;
8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElemPop:
8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the regexp of the current node content model from the stack
8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the exec or NULL if empty
8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegExecCtxtPtr
8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt)
8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr ret;
8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemNr <= 0)
8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->elemNr--;
8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ctxt->elemTab[ctxt->elemNr];
8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->elemTab[ctxt->elemNr] = NULL;
8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemNr > 0)
8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1];
8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elem = NULL;
8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateProgressiveCallback:
8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec:  the regular expression instance
8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token:  the token which matched
8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @transdata:  callback data, the define for the subelement if available
8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @ @inputdata:  callback data, the Relax NG validation context
8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle the callback and if needed validate the element children.
8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * some of the in/out informations are passed via the context in @inputdata.
8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec
8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      ATTRIBUTE_UNUSED,
8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      const xmlChar * token,
8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      void *transdata, void *inputdata)
8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata;
8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata;
8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state, oldstate;
8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, oldflags;
8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Progressive callback for: '%s'\n", token);
8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) {
8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing context\n", token);
8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    node = ctxt->pnode;
8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->pstate = 1;
8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL) {
8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (token[0] == '#')
8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return;
8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing define\n", token);
8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (define == NULL)) {
8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing info\n", token);
8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (define->type != XML_RELAXNG_ELEMENT) {
8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s define is not element\n", token);
8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errNo == XML_RELAXNG_OK)
8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->type != XML_ELEMENT_NODE) {
8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_NOTELEM);
8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpValidError(ctxt);
8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->contModel == NULL) {
8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * this node cannot be validated in a streamable fashion
8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Element '%s' validation is not streamable\n",
8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        token);
8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = 0;
8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pdef = define;
8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec = xmlRegNewExecCtxt(define->contModel,
8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGValidateProgressiveCallback, ctxt);
8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec == NULL) {
8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGElemPush(ctxt, exec);
8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Validate the attributes part of the content.
8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = xmlRelaxNGNewValidState(ctxt, node);
8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldstate = ctxt->state;
8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = state;
8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->attrs != NULL) {
8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs);
8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0) {
8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->pstate = -1;
8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name);
8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL) {
8220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = NULL;
8221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
8222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0) {
8223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->pstate = -1;
8224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->states != NULL) {
8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int tmp = -1, i;
8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldflags = ctxt->flags;
8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->states->nbState; i++) {
8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            state = ctxt->states->tabState[i];
8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = state;
8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = NULL;
8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = 0;
8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0) {
8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * validation error, log the message for the "best" one
8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags |= FLAGS_IGNORABLE;
8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGLogBestError(ctxt);
8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->states->nbState; i++) {
8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]);
8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(ctxt, ctxt->states);
8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->states = NULL;
8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ret == 0) && (tmp == -1))
8254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->pstate = -1;
8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->flags = oldflags;
8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->pstate == -1) {
8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpValidError(ctxt);
8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = oldstate;
8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePushElement:
8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
8268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a document instance
8269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element instance
8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new element start on the RelaxNG validation stack.
8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 if validating the
8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         element requires a full node, and -1 in case of error.
8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt,
8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlDocPtr doc ATTRIBUTE_UNUSED,
8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlNodePtr elem)
8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (elem == NULL))
8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name);
8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elem == 0) {
8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGPtr schema;
8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGGrammarPtr grammar;
8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegExecCtxtPtr exec;
8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr define;
8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        schema = ctxt->schema;
8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (schema == NULL) {
8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        grammar = schema->topgrammar;
8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((grammar == NULL) || (grammar->start == NULL)) {
8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        define = grammar->start;
8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (define->contModel == NULL) {
8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->pdef = define;
8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        exec = xmlRegNewExecCtxt(define->contModel,
8311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlRelaxNGValidateProgressiveCallback,
8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 ctxt);
8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (exec == NULL) {
8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGElemPush(ctxt, exec);
8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->pnode = elem;
8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->pstate = 0;
8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->ns != NULL) {
8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret =
8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href,
8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  ctxt);
8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt);
8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, elem->name);
8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->pstate == 0)
8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (ctxt->pstate < 0)
8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n",
8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        elem->name);
8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePushCData:
8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the RelaxNG validation context
8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  some character data read
8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @len:  the lenght of the data
8350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check the CData parsed for validation in the current stack
8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or -1 otherwise
8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt,
8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            const xmlChar * data, int len ATTRIBUTE_UNUSED)
8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL))
8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len);
8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*data != 0) {
8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!IS_BLANK_CH(*data))
8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data++;
8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*data == 0)
8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt);
8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO ");
8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "CDATA failed\n");
8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePopElement:
8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the RelaxNG validation context
8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a document instance
8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element instance
8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the element end from the RelaxNG validation stack.
8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 otherwise
8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt,
8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlDocPtr doc ATTRIBUTE_UNUSED,
8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlNodePtr elem)
8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr exec;
8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL))
8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name);
8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * verify that we reached a terminal state of the content model.
8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec = xmlRelaxNGElemPop(ctxt);
8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegExecPushString(exec, NULL, NULL);
8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0) {
8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * TODO: get some of the names needed to exit the current state of exec
8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST "");
8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret < 0) {
8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 1;
8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegFreeExecCtxt(exec);
8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n",
8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        elem->name);
8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateFullElement:
8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a document instance
8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element instance
8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a full subtree when xmlRelaxNGValidatePushElement() returned
8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 and the content of the node has been expanded.
8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or -1 in case of error.
8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt,
8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlDocPtr doc ATTRIBUTE_UNUSED,
8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlNodePtr elem)
8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;
8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL))
8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name);
8459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = xmlRelaxNGNewValidState(ctxt, elem->parent);
8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->seq = elem;
8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = state;
8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNo = XML_RELAXNG_OK;
8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef);
8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret != 0) || (ctxt->errNo != XML_RELAXNG_OK))
8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 1;
8472df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRelaxNGFreeValidState(ctxt, ctxt->state);
8473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = NULL;
8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n",
8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        elem->name);
8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
8484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 		Generic interpreted validation implementation		*
8485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
8486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   xmlRelaxNGDefinePtr define);
8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSkipIgnored:
8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the top node.
8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip ignorable nodes in that context
8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new sibling or NULL in case of error.
8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED,
8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlNodePtr node)
8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * TODO complete and handle entities
8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((node != NULL) &&
8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((node->type == XML_COMMENT_NODE) ||
8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (node->type == XML_PI_NODE) ||
8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (node->type == XML_XINCLUDE_START) ||
8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (node->type == XML_XINCLUDE_END) ||
8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (((node->type == XML_TEXT_NODE) ||
8512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              (node->type == XML_CDATA_SECTION_NODE)) &&
8513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             ((ctxt->flags & FLAGS_MIXED_CONTENT) ||
8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              (IS_BLANK_NODE(node)))))) {
8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = node->next;
8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (node);
8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNormalize:
8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the string to normalize
8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the  normalizeWhiteSpace( s ) function from
8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * section 6.2.9 of the spec
8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new string or NULL in case of error.
8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str)
8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret, *p;
8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *tmp;
8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;
8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL)
8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = str;
8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*tmp != 0)
8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp++;
8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = tmp - str;
8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar));
8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "validating\n");
8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    p = ret;
8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*str))
8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*str != 0) {
8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_BLANK_CH(*str)) {
8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (IS_BLANK_CH(*str))
8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                str++;
8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*str == 0)
8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            *p++ = ' ';
8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else
8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            *p++ = *str++;
8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *p = 0;
8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDatatype:
8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the string value
8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the datatype definition
8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given value against the dataype
8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt,
8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * value,
8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlRelaxNGDefinePtr define, xmlNodePtr node)
8581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, tmp;
8583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeLibraryPtr lib;
8584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *result = NULL;
8585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define == NULL) || (define->data == NULL)) {
8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib = (xmlRelaxNGTypeLibraryPtr) define->data;
8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib->check != NULL) {
8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((define->attrs != NULL) &&
8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (define->attrs->type == XML_RELAXNG_PARAM)) {
8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                lib->check(lib->data, define->name, value, &result, node);
8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = lib->check(lib->data, define->name, value, NULL, node);
8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name);
8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((result != NULL) && (lib != NULL) && (lib->freef != NULL))
8604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lib->freef(lib->data, result);
8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret == 1) {
8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret == 2) {
8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2P(XML_RELAXNG_ERR_DUPID, value);
8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value);
8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = define->attrs;
8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) {
8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lib->facet != NULL) {
8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = lib->facet(lib->data, define->name, cur->name,
8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             cur->value, value, result);
8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != 0)
8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (define->content != NULL)) {
8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        const xmlChar *oldvalue, *oldendvalue;
8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldvalue = ctxt->state->value;
8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldendvalue = ctxt->state->endvalue;
8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = (xmlChar *) value;
8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->endvalue = NULL;
8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateValue(ctxt, define->content);
8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = (xmlChar *) oldvalue;
8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->endvalue = (xmlChar *) oldendvalue;
8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((result != NULL) && (lib != NULL) && (lib->freef != NULL))
8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        lib->freef(lib->data, result);
8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNextValue:
8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to the next value when validating within a list
8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the operation succeeded or an error code.
8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt)
8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cur;
8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->state->value;
8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (ctxt->state->endvalue == NULL)) {
8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = NULL;
8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->endvalue = NULL;
8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*cur != 0)
8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((cur != ctxt->state->endvalue) && (*cur == 0))
8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == ctxt->state->endvalue)
8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = NULL;
8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = cur;
8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValueList:
8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines:  the list of definitions to verify
8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given set of definitions for the current value
8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt,
8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGDefinePtr defines)
8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (defines != NULL) {
8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateValue(ctxt, defines);
8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0)
8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        defines = defines->next;
8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValue:
8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given definition for the current value
8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefinePtr define)
8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, oldflags;
8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value;
8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = ctxt->state->value;
8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (define->type) {
8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:{
8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((value != NULL) && (value[0] != 0)) {
8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int idx = 0;
8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (IS_BLANK_CH(value[idx]))
8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        idx++;
8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (value[idx] != 0)
8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:{
8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (!xmlStrEqual(value, define->value)) {
8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (define->name != NULL) {
8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGTypeLibraryPtr lib;
8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        lib = (xmlRelaxNGTypeLibraryPtr) define->data;
8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((lib != NULL) && (lib->comp != NULL)) {
8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = lib->comp(lib->data, define->name,
8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            define->value, define->node,
8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            (void *) define->attrs,
8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            value, ctxt->state->node);
8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else
8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = -1;
8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ret < 0) {
8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            VALID_ERR2(XML_RELAXNG_ERR_TYPECMP,
8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       define->name);
8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            return (-1);
8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else if (ret == 1) {
8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = 0;
8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = -1;
8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlChar *nval, *nvalue;
8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * TODO: trivial optimizations are possible by
8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * computing at compile-time
8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        nval = xmlRelaxNGNormalize(ctxt, define->value);
8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        nvalue = xmlRelaxNGNormalize(ctxt, value);
8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((nval == NULL) || (nvalue == NULL) ||
8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (!xmlStrEqual(nval, nvalue)))
8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = -1;
8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (nval != NULL)
8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(nval);
8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (nvalue != NULL)
8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(nvalue);
8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 0)
8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGNextValue(ctxt);
8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:{
8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateDatatype(ctxt, value, define,
8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->state->seq);
8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 0)
8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGNextValue(ctxt);
8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:{
8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = define->content;
8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *oldvalue;
8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldvalue = ctxt->state->value;
8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateValue(ctxt, list);
8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0) {
8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->value = oldvalue;
8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0) {
8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDumpValidError(ctxt);
8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->errNr > 0)
8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGPopErrors(ctxt, 0);
8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:{
8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = define->content;
8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *oldvalue, *oldend, *val, *cur;
8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int nb_values = 0;
8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldvalue = ctxt->state->value;
8813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldend = ctxt->state->endvalue;
8814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                val = xmlStrdup(oldvalue);
8816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val == NULL) {
8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    val = xmlStrdup(BAD_CAST "");
8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val == NULL) {
8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (-1);
8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = val;
8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (*cur != 0) {
8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (IS_BLANK_CH(*cur)) {
8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *cur = 0;
8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur++;
8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        nb_values++;
8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while (IS_BLANK_CH(*cur))
8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            *cur++ = 0;
8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else
8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur++;
8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext,
8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                "list value: '%s' found %d items\n",
8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                oldvalue, nb_values);
8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nb_values = 0;
8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->endvalue = cur;
8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = val;
8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((*cur == 0) && (cur != ctxt->state->endvalue))
8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = cur;
8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->state->value == ctxt->state->endvalue)
8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state->value = NULL;
8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateValue(ctxt, list);
8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0) {
8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlGenericError(xmlGenericErrorContext,
8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        "Failed to validate value: '%s' with %d rule\n",
8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        ctxt->state->value, nb_values);
8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nb_values++;
8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ret == 0) && (ctxt->state->value != NULL) &&
8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (ctxt->state->value != ctxt->state->endvalue)) {
8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA,
8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               ctxt->state->value);
8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(val);
8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = oldvalue;
8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->endvalue = oldend;
8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateValueList(ctxt, define->content);
8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != 0) {
8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* no break on purpose */
8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:{
8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *cur, *temp;
8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8887df143a5041f03a22808b59c76698770b74692815Selim Gurun                if ((ctxt->state->value == NULL) ||
8888df143a5041f03a22808b59c76698770b74692815Selim Gurun                    (*ctxt->state->value == 0)) {
8889df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ret = 0;
8890df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
8891df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
8892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = ctxt->state->value;
8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                temp = NULL;
8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((cur != NULL) && (cur != ctxt->state->endvalue) &&
8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       (temp != cur)) {
8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    temp = cur;
8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret =
8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGValidateValueList(ctxt, define->content);
8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0) {
8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state->value = temp;
8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 0;
8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur = ctxt->state->value;
8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->errNr > 0)
8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRelaxNGPopErrors(ctxt, 0);
8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8913df143a5041f03a22808b59c76698770b74692815Selim Gurun        case XML_RELAXNG_OPTIONAL:{
8914df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlChar *temp;
8915df143a5041f03a22808b59c76698770b74692815Selim Gurun
8916df143a5041f03a22808b59c76698770b74692815Selim Gurun                if ((ctxt->state->value == NULL) ||
8917df143a5041f03a22808b59c76698770b74692815Selim Gurun                    (*ctxt->state->value == 0)) {
8918df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ret = 0;
8919df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
8920df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
8921df143a5041f03a22808b59c76698770b74692815Selim Gurun                oldflags = ctxt->flags;
8922df143a5041f03a22808b59c76698770b74692815Selim Gurun                ctxt->flags |= FLAGS_IGNORABLE;
8923df143a5041f03a22808b59c76698770b74692815Selim Gurun                temp = ctxt->state->value;
8924df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = xmlRelaxNGValidateValue(ctxt, define->content);
8925df143a5041f03a22808b59c76698770b74692815Selim Gurun                ctxt->flags = oldflags;
8926df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (ret != 0) {
8927df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ctxt->state->value = temp;
8928df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (ctxt->errNr > 0)
8929df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlRelaxNGPopErrors(ctxt, 0);
8930df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ret = 0;
8931df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
8932df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
8933df143a5041f03a22808b59c76698770b74692815Selim Gurun		if (ctxt->errNr > 0)
8934df143a5041f03a22808b59c76698770b74692815Selim Gurun		    xmlRelaxNGPopErrors(ctxt, 0);
8935df143a5041f03a22808b59c76698770b74692815Selim Gurun                break;
8936df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
8937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:{
8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = define->content;
8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateValue(ctxt, list);
8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0) {
8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else
8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 0;
8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:{
8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = define->content;
8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateValue(ctxt, list);
8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0) {
8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else
8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 0;
8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
897060a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (define->content == NULL) {
8971df143a5041f03a22808b59c76698770b74692815Selim Gurun                VALID_ERR(XML_RELAXNG_ERR_NODEFINE);
8972df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = -1;
8973df143a5041f03a22808b59c76698770b74692815Selim Gurun	    } else {
8974df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = xmlRelaxNGValidateValue(ctxt, define->content);
8975df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
8976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO ret = -1;
8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValueContent:
8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines:  the list of definitions to verify
8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given definitions for the current value
8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt,
8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               xmlRelaxNGDefinePtr defines)
8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (defines != NULL) {
8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateValue(ctxt, defines);
9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0)
9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        defines = defines->next;
9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAttributeMatch:
9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to check
9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prop:  the attribute
9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the attribute matches the definition nameClass
9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the attribute matches, 0 if no, or -1 in case of error
9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt,
9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGDefinePtr define, xmlAttrPtr prop)
9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL) {
9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlStrEqual(define->name, prop->name))
9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->ns != NULL) {
9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (define->ns[0] == 0) {
9029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (prop->ns != NULL)
9030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
9031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((prop->ns == NULL) ||
9033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (!xmlStrEqual(define->ns, prop->ns->href)))
9034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->nameClass == NULL)
9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    define = define->nameClass;
9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->type == XML_RELAXNG_EXCEPT) {
9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr list;
9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list = define->content;
9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (list != NULL) {
9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGAttributeMatch(ctxt, list, prop);
9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 1)
9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret < 0)
9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = list->next;
9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO}
9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateAttribute:
9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given attribute definition for that node
9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt,
9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGDefinePtr define)
9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i;
9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value, *oldvalue;
9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr prop = NULL, tmp;
9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr oldseq;
9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state->nbAttrLeft <= 0)
9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL) {
9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->state->nbAttrs; i++) {
9079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = ctxt->state->attrs[i];
9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) {
9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((((define->ns == NULL) || (define->ns[0] == 0)) &&
9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (tmp->ns == NULL)) ||
9083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((tmp->ns != NULL) &&
9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (xmlStrEqual(define->ns, tmp->ns->href)))) {
9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prop = tmp;
9086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (prop != NULL) {
9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            value = xmlNodeListGetString(prop->doc, prop->children, 1);
9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldvalue = ctxt->state->value;
9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldseq = ctxt->state->seq;
9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = (xmlNodePtr) prop;
9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->value = value;
9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->endvalue = NULL;
9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateValueContent(ctxt, define->content);
9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->state->value != NULL)
9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = ctxt->state->value;
9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (value != NULL)
9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(value);
9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->value = oldvalue;
9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = oldseq;
9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * flag the attribute as processed
9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->attrs[i] = NULL;
9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->nbAttrLeft--;
9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "xmlRelaxNGValidateAttribute(%s): %d\n",
9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        define->name, ret);
9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->state->nbAttrs; i++) {
9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = ctxt->state->attrs[i];
9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((tmp != NULL) &&
9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) {
9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prop = tmp;
9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (prop != NULL) {
9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            value = xmlNodeListGetString(prop->doc, prop->children, 1);
9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldvalue = ctxt->state->value;
9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldseq = ctxt->state->seq;
9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = (xmlNodePtr) prop;
9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->value = value;
9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateValueContent(ctxt, define->content);
9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->state->value != NULL)
9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = ctxt->state->value;
9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (value != NULL)
9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(value);
9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->value = oldvalue;
9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = oldseq;
9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * flag the attribute as processed
9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->attrs[i] = NULL;
9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->nbAttrLeft--;
9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
9152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (define->ns != NULL) {
9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n",
9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            define->ns, ret);
9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
9158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "xmlRelaxNGValidateAttribute(anyName): %d\n",
9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret);
9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateAttributeList:
9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the list of definition to verify
9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given node against the list of attribute definitions
9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGDefinePtr defines)
9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, res;
9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int needmore = 0;
9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = defines;
9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type == XML_RELAXNG_ATTRIBUTE) {
9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlRelaxNGValidateAttribute(ctxt, cur) != 0)
9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else
9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            needmore = 1;
9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!needmore)
9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
9195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = defines;
9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type != XML_RELAXNG_ATTRIBUTE) {
9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->state != NULL) || (ctxt->states != NULL)) {
9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                res = xmlRelaxNGValidateDefinition(ctxt, cur);
9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (res < 0)
9201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (-1);
9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (res == -1)      /* continues on -2 */
9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNodeMatchesList:
9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @list:  a NULL terminated array of definitions
9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a node can be matched by one of the definitions
9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if matches 0 otherwise
9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list)
9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i = 0, tmp;
9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (list == NULL))
9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = list[i++];
9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((node->type == XML_ELEMENT_NODE) &&
9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_ELEMENT)) {
9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlRelaxNGElementMatch(NULL, cur, node);
9238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == 1)
9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (((node->type == XML_TEXT_NODE) ||
9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_CDATA_SECTION_NODE)) &&
9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_TEXT)) {
9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (1);
9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = list[i++];
9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateInterleave:
9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate an interleave definition for a node.
9256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGDefinePtr define)
9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i, nbgroups;
9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errNr = ctxt->errNr;
9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int oldflags;
9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr oldstate;
9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPartitionPtr partitions;
9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr group = NULL;
9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem;
9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr *list = NULL, *lasts = NULL;
9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->data != NULL) {
9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        partitions = (xmlRelaxNGPartitionPtr) define->data;
9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbgroups = partitions->nbgroups;
9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_INTERNODATA);
9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Optimizations for MIXED
9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldflags = ctxt->flags;
9284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->dflags & IS_MIXED) {
9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->flags |= FLAGS_MIXED_CONTENT;
9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nbgroups == 2) {
9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * this is a pure <mixed> case
9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->state != NULL)
9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         ctxt->state->seq);
9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT)
9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateDefinition(ctxt,
9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   partitions->groups[1]->
9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   rule);
9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateDefinition(ctxt,
9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   partitions->groups[0]->
9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   rule);
9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
9302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->state != NULL)
9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                             ctxt->state->
9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                             seq);
9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (ret);
9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Build arrays to store the first and last node of the chain
9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * pertaining to each group
9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr));
9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL) {
9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "validating\n");
9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(list, 0, nbgroups * sizeof(xmlNodePtr));
9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr));
9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lasts == NULL) {
9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "validating\n");
9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(lasts, 0, nbgroups * sizeof(xmlNodePtr));
9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Walk the sequence of children finding the right group and
9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * sorting them in sequences.
9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->state->seq;
9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGSkipIgnored(ctxt, cur);
9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = cur;
9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = cur;
9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((partitions->triage != NULL) &&
9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (partitions->flags & IS_DETERMINIST)) {
9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            void *tmp = NULL;
9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->type == XML_TEXT_NODE) ||
9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->type == XML_CDATA_SECTION_NODE)) {
9344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text",
9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     NULL);
9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (cur->type == XML_ELEMENT_NODE) {
9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->ns != NULL) {
9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = xmlHashLookup2(partitions->triage, cur->name,
9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         cur->ns->href);
9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp == NULL)
9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = xmlHashLookup2(partitions->triage,
9352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             BAD_CAST "#any",
9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             cur->ns->href);
9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp =
9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlHashLookup2(partitions->triage, cur->name,
9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       NULL);
9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp == NULL)
9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp =
9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlHashLookup2(partitions->triage, BAD_CAST "#any",
9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       NULL);
9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == NULL) {
9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                i = nbgroups;
9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                i = ((long) tmp) - 1;
9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (partitions->flags & IS_NEEDCHECK) {
9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    group = partitions->groups[i];
9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (!xmlRelaxNGNodeMatchesList(cur, group->defs))
9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        i = nbgroups;
9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (i = 0; i < nbgroups; i++) {
9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                group = partitions->groups[i];
9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (group == NULL)
9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    continue;
9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlRelaxNGNodeMatchesList(cur, group->defs))
9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * We break as soon as an element not matched is found
9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (i >= nbgroups) {
9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lasts[i] != NULL) {
9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i]->next = cur;
9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i] = cur;
9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list[i] = cur;
9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i] = cur;
9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL)
9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lastchg = cur->next;
9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lastchg = cur;
9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = xmlRelaxNGSkipIgnored(ctxt, cur->next);
9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto done;
9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lastelem = cur;
9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldstate = ctxt->state;
9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbgroups; i++) {
9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate);
9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        group = partitions->groups[i];
9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lasts[i] != NULL) {
9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            last = lasts[i]->next;
9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i]->next = NULL;
9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = list[i];
9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateDefinition(ctxt, group->rule);
9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0)
9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->state != NULL) {
9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = ctxt->state->seq;
9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGSkipIgnored(ctxt, cur);
9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(ctxt, oldstate);
9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldstate = ctxt->state;
9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = NULL;
9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur != NULL) {
9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name);
9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = oldstate;
9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto done;
9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ctxt->states != NULL) {
9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int j;
9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int found = 0;
9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int best = -1;
9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int lowattr = -1;
9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * PBM: what happen if there is attributes checks in the interleaves
9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (j = 0; j < ctxt->states->nbState; j++) {
9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = ctxt->states->tabState[j]->seq;
9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = xmlRelaxNGSkipIgnored(ctxt, cur);
9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur == NULL) {
9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (found == 0) {
9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        lowattr = ctxt->states->tabState[j]->nbAttrLeft;
9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			best = j;
9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    found = 1;
9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) {
9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        /* try  to keep the latest one to mach old heuristic */
9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        lowattr = ctxt->states->tabState[j]->nbAttrLeft;
9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			best = j;
9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (lowattr == 0)
9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        break;
9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (found == 0) {
9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (lowattr == -1) {
9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        lowattr = ctxt->states->tabState[j]->nbAttrLeft;
9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			best = j;
9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else
9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr)  {
9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        /* try  to keep the latest one to mach old heuristic */
9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        lowattr = ctxt->states->tabState[j]->nbAttrLeft;
9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			best = j;
9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * BIG PBM: here we pick only one restarting point :-(
9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->states->nbState > 0) {
9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeValidState(ctxt, oldstate);
9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (best != -1) {
9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    oldstate = ctxt->states->tabState[best];
9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->states->tabState[best] = NULL;
9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    oldstate =
9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->states->tabState[ctxt->states->nbState - 1];
9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states->tabState[ctxt->states->nbState - 1] = NULL;
9482df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ctxt->states->nbState--;
9483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (j = 0; j < ctxt->states->nbState ; j++) {
9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]);
9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(ctxt, ctxt->states);
9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->states = NULL;
9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (found == 0) {
9491df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (cur == NULL) {
9492df143a5041f03a22808b59c76698770b74692815Selim Gurun		    VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA,
9493df143a5041f03a22808b59c76698770b74692815Selim Gurun			       (const xmlChar *) "noname");
9494df143a5041f03a22808b59c76698770b74692815Selim Gurun                } else {
9495df143a5041f03a22808b59c76698770b74692815Selim Gurun                    VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name);
9496df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
9497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = oldstate;
9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto done;
9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lasts[i] != NULL) {
9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i]->next = last;
9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL)
9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = oldstate;
9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state->seq = lastelem;
9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto done;
9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  done:
9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags = oldflags;
9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * builds the next links chain from the prev one
9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = lastchg;
9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur == start) || (cur->prev == NULL))
9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->prev->next = cur;
9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->prev;
9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0) {
9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errNr > errNr)
9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGPopErrors(ctxt, errNr);
9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
9537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(lasts);
9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDefinitionList:
9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the list of definition to verify
9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given node content against the (list) of definitions
9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt,
9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlRelaxNGDefinePtr defines)
9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, res;
9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (defines == NULL) {
9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_INTERNAL,
9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   BAD_CAST "NULL definition list");
9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (defines != NULL) {
9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->state != NULL) || (ctxt->states != NULL)) {
9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            res = xmlRelaxNGValidateDefinition(ctxt, defines);
9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (res < 0)
9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (res == -1)          /* continues on -2 */
9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        defines = defines->next;
9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElementMatch:
9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to check
9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  the element
9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the element matches the definition nameClass
9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the element matches, 0 if no, or -1 in case of error
9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlRelaxNGDefinePtr define, xmlNodePtr elem)
9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, oldflags = 0;
9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL) {
9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlStrEqual(elem->name, define->name)) {
9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name);
9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define->ns != NULL) && (define->ns[0] != 0)) {
9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (elem->ns == NULL) {
9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS, elem->name);
9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (!xmlStrEqual(elem->ns->href, define->ns)) {
9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS,
9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       elem->name, define->ns);
9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((elem->ns != NULL) && (define->ns != NULL) &&
9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (define->name == NULL)) {
9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name);
9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((elem->ns != NULL) && (define->name != NULL)) {
9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name);
9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->nameClass == NULL)
9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    define = define->nameClass;
9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->type == XML_RELAXNG_EXCEPT) {
9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr list;
9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldflags = ctxt->flags;
9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags |= FLAGS_IGNORABLE;
9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list = define->content;
9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (list != NULL) {
9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGElementMatch(ctxt, list, elem);
9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 1) {
9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt != NULL)
9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret < 0) {
9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt != NULL)
9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = list->next;
9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 1;
9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (define->type == XML_RELAXNG_CHOICE) {
9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr list;
9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldflags = ctxt->flags;
9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags |= FLAGS_IGNORABLE;
9656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list = define->nameClass;
9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (list != NULL) {
9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGElementMatch(ctxt, list, elem);
9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 1) {
9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt != NULL)
9663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret < 0) {
9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt != NULL)
9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = list->next;
9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != 0) {
9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > 0)
9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, 0);
9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO ret = -1;
9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGBestState:
9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the "best" state in the ctxt->states list of states to report
9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors about. I.e. a state with no element left in the child list
9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or the one with the less attributes left.
9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is called only if a falidation error was detected
9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the index of the "best" state or -1 in case of error
9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt)
9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;
9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, tmp;
9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int best = -1;
9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value = 1000000;
9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->states == NULL) ||
9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->states->nbState <= 0))
9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->states->nbState; i++) {
9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        state = ctxt->states->tabState[i];
9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state == NULL)
9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state->seq != NULL) {
9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((best == -1) || (value > 100000)) {
9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = 100000;
9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                best = i;
9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = state->nbAttrLeft;
9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((best == -1) || (value > tmp)) {
9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = tmp;
9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                best = i;
9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (best);
9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLogBestError:
9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the "best" state in the ctxt->states list of states to report
9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors about and log it.
9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt)
9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int best;
9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->states == NULL) ||
9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->states->nbState <= 0))
9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    best = xmlRelaxNGBestState(ctxt);
9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((best >= 0) && (best < ctxt->states->nbState)) {
9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = ctxt->states->tabState[best];
9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGValidateElementEnd(ctxt, 1);
9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateElementEnd:
9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dolog:  indicate that error logging should be done
9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the end of the element, implements check that
9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * there is nothing left not consumed in the element content
9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or in the attribute list.
9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog)
9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;
9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = ctxt->state;
9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->seq != NULL) {
9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq);
9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state->seq != NULL) {
9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (dolog) {
9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT,
9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           state->node->name, state->seq->name);
9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < state->nbAttrs; i++) {
9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state->attrs[i] != NULL) {
9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (dolog) {
9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR,
9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           state->attrs[i]->name, state->node->name);
9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1 - i);
9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateState:
9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the current state against the definition
9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefinePtr define)
9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i, tmp, oldflags, errNr;
9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr oldstate = NULL, state;
9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL) {
9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_NODEFINE);
9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL) {
9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = ctxt->state->seq;
9823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = NULL;
9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->depth; i++)
9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, " ");
9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Start validating %s ", xmlRelaxNGDefName(define));
9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL)
9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "%s ", define->name);
9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node != NULL) && (node->name != NULL))
9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name);
9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "\n");
9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->depth++;
9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (define->type) {
9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = xmlRelaxNGSkipIgnored(ctxt, node);
9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
9843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((node != NULL) &&
9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   ((node->type == XML_TEXT_NODE) ||
9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_COMMENT_NODE) ||
9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_PI_NODE) ||
9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_CDATA_SECTION_NODE)))
9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node = node->next;
9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = node;
9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            errNr = ctxt->errNr;
9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = xmlRelaxNGSkipIgnored(ctxt, node);
9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (node == NULL) {
9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name);
9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (node->type != XML_ELEMENT_NODE) {
9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR(XML_RELAXNG_ERR_NOTELEM);
9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * This node was already validated successfully against
9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * this definition.
9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (node->psvi == define) {
9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr != 0) {
9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while ((ctxt->err != NULL) &&
9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME)
9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             && (xmlStrEqual(ctxt->err->arg2, node->name)))
9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ||
9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ((ctxt->err->err ==
9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              XML_RELAXNG_ERR_ELEMEXTRANS)
9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             && (xmlStrEqual(ctxt->err->arg1, node->name)))
9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM)
9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            || (ctxt->err->err ==
9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                XML_RELAXNG_ERR_NOTELEM)))
9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGValidErrorPop(ctxt);
9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGElementMatch(ctxt, define, node);
9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret <= 0) {
9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->errNr != 0) {
9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((ctxt->err != NULL) &&
9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) &&
9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (xmlStrEqual(ctxt->err->arg2, node->name))) ||
9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) &&
9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (xmlStrEqual(ctxt->err->arg1, node->name))) ||
9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) ||
9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM)))
9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGValidErrorPop(ctxt);
9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            errNr = ctxt->errNr;
9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldflags = ctxt->flags;
9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->flags & FLAGS_MIXED_CONTENT) {
9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags -= FLAGS_MIXED_CONTENT;
9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            state = xmlRelaxNGNewValidState(ctxt, node);
9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (state == NULL) {
9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldstate = ctxt->state;
9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = state;
9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->attrs != NULL) {
9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs);
9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp != 0) {
9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name);
9938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->contModel != NULL) {
9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state;
9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGStatesPtr tmpstates = ctxt->states;
9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr nseq;
9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nstate = xmlRelaxNGNewValidState(ctxt, node);
9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = nstate;
9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->states = NULL;
9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGValidateCompiledContent(ctxt,
9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        define->contModel,
9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        ctxt->state->seq);
9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nseq = ctxt->state->seq;
9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = tmpstate;
9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->states = tmpstates;
9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeValidState(ctxt, nstate);
9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE
9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext,
9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                "Validating content of '%s' : %d\n",
9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                define->name, tmp);
9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp != 0)
9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->states != NULL) {
9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = -1;
9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < ctxt->states->nbState; i++) {
9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        state = ctxt->states->tabState[i];
9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state = state;
9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state->seq = nseq;
9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            tmp = 0;
9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            break;
9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp != 0) {
9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * validation error, log the message for the "best" one
9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags |= FLAGS_IGNORABLE;
9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGLogBestError(ctxt);
9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
9985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < ctxt->states->nbState; i++) {
9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt,
9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->states->
9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 tabState[i]);
9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeStates(ctxt, ctxt->states);
9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ret == 0) && (tmp == -1))
9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    state = ctxt->state;
9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxt->state != NULL)
9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->state->seq = nseq;
9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0)
10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeValidState(ctxt, state);
10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (define->content != NULL) {
10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = xmlRelaxNGValidateDefinitionList(ctxt,
10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                           define->
10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                           content);
10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp != 0) {
10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->state == NULL) {
10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = oldstate;
10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID,
10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       node->name);
10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = NULL;
10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID,
10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       node->name);
10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->states != NULL) {
10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = -1;
10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < ctxt->states->nbState; i++) {
10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        state = ctxt->states->tabState[i];
10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state = state;
10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            tmp = 0;
10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            break;
10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp != 0) {
10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * validation error, log the message for the "best" one
10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags |= FLAGS_IGNORABLE;
10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGLogBestError(ctxt);
10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < ctxt->states->nbState; i++) {
10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt,
10043df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 ctxt->states->tabState[i]);
10044df143a5041f03a22808b59c76698770b74692815Selim Gurun                        ctxt->states->tabState[i] = NULL;
10045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeStates(ctxt, ctxt->states);
10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ret == 0) && (tmp == -1))
10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    state = ctxt->state;
10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0)
10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeValidState(ctxt, state);
10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node->psvi = define;
10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = oldstate;
10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (oldstate != NULL)
10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != 0) {
10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 0;
10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -2;
10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "xmlRelaxNGValidateDefinition(): validated %s : %d",
10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            node->name, ret);
10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (oldstate == NULL)
10084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext, ": no state\n");
10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (oldstate->seq == NULL)
10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext, ": done\n");
10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (oldstate->seq->type == XML_ELEMENT_NODE)
10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext, ": next elem %s\n",
10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                oldstate->seq->name);
10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext, ": next %s %d\n",
10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                oldstate->seq->name, oldstate->seq->type);
10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:{
10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                errNr = ctxt->errNr;
10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret =
10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGValidateDefinitionList(ctxt,
10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     define->content);
10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0) {
10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->state != NULL)
10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = oldstate;
10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 0;
10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->errNr > errNr)
10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGPopErrors(ctxt, errNr);
10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->states != NULL) {
10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate);
10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = xmlRelaxNGNewStates(ctxt, 1);
10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->states == NULL) {
10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt, oldstate);
10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags = oldflags;
10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->errNr > errNr)
10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGPopErrors(ctxt, errNr);
10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate);
10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state);
10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = NULL;
10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
10130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
10131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
10136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            errNr = ctxt->errNr;
10137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content);
10138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != 0) {
10139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->errNr > errNr)
10142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGPopErrors(ctxt, errNr);
10143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* no break on purpose */
10144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:{
10145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int progress;
10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGStatesPtr states = NULL, res = NULL;
10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int base, j;
10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                errNr = ctxt->errNr;
10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                res = xmlRelaxNGNewStates(ctxt, 1);
10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (res == NULL) {
10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * All the input states are also exit states
10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->state != NULL) {
10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, res,
10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        xmlRelaxNGCopyValidState(ctxt,
10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 ctxt->
10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 state));
10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (j = 0; j < ctxt->states->nbState; j++) {
10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGAddStates(ctxt, res,
10166df143a5041f03a22808b59c76698770b74692815Selim Gurun                            xmlRelaxNGCopyValidState(ctxt,
10167df143a5041f03a22808b59c76698770b74692815Selim Gurun                                            ctxt->states->tabState[j]));
10168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                do {
10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    progress = 0;
10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    base = res->nbState;
10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->states != NULL) {
10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        states = ctxt->states;
10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        for (i = 0; i < states->nbState; i++) {
10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = states->tabState[i];
10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->states = NULL;
10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = xmlRelaxNGValidateDefinitionList(ctxt,
10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   define->
10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   content);
10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ret == 0) {
10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (ctxt->state != NULL) {
10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    tmp = xmlRelaxNGAddStates(ctxt, res,
10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                              ctxt->state);
10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    ctxt->state = NULL;
10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if (tmp == 1)
10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        progress = 1;
10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                } else if (ctxt->states != NULL) {
10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    for (j = 0; j < ctxt->states->nbState;
10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         j++) {
10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        tmp =
10195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            xmlRelaxNGAddStates(ctxt, res,
10196df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                   ctxt->states->tabState[j]);
10197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        if (tmp == 1)
10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            progress = 1;
10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    }
10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlRelaxNGFreeStates(ctxt,
10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         ctxt->states);
10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    ctxt->states = NULL;
10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (ctxt->state != NULL) {
10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlRelaxNGFreeValidState(ctxt,
10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                             ctxt->state);
10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    ctxt->state = NULL;
10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = xmlRelaxNGValidateDefinitionList(ctxt,
10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                               define->
10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                               content);
10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ret != 0) {
10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = NULL;
10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            base = res->nbState;
10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ctxt->state != NULL) {
10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                tmp = xmlRelaxNGAddStates(ctxt, res,
10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                          ctxt->state);
10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ctxt->state = NULL;
10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (tmp == 1)
10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    progress = 1;
10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else if (ctxt->states != NULL) {
10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                for (j = 0; j < ctxt->states->nbState; j++) {
10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    tmp = xmlRelaxNGAddStates(ctxt, res,
10230df143a5041f03a22808b59c76698770b74692815Selim Gurun                                               ctxt->states->tabState[j]);
10231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if (tmp == 1)
10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        progress = 1;
10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (states == NULL) {
10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    states = ctxt->states;
10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                } else {
10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlRelaxNGFreeStates(ctxt,
10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         ctxt->states);
10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ctxt->states = NULL;
10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (progress) {
10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Collect all the new nodes added at that step
10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * and make them the new node set
10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res->nbState - base == 1) {
10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = xmlRelaxNGCopyValidState(ctxt,
10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   res->
10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   tabState
10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   [base]);
10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (states == NULL) {
10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGNewStates(ctxt,
10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    res->nbState - base);
10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			        states = ctxt->states;
10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (states == NULL) {
10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    progress = 0;
10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            states->nbState = 0;
10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            for (i = base; i < res->nbState; i++)
10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGAddStates(ctxt, states,
10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    xmlRelaxNGCopyValidState
10268df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                    (ctxt, res->tabState[i]));
10269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->states = states;
10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } while (progress == 1);
10273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (states != NULL) {
10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeStates(ctxt, states);
10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->states = res;
10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * errors may have to be propagated back...
10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:{
10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = NULL;
10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGStatesPtr states = NULL;
10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node = xmlRelaxNGSkipIgnored(ctxt, node);
10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                errNr = ctxt->errNr;
10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((define->dflags & IS_TRIABLE) && (define->data != NULL) &&
10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (node != NULL)) {
10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * node == NULL can't be optimized since IS_TRIABLE
10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * doesn't account for choice which may lead to
10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * only attributes.
10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlHashTablePtr triage =
10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (xmlHashTablePtr) define->data;
10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Something we can optimize cleanly there is only one
10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * possble branch out !
10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((node->type == XML_TEXT_NODE) ||
10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (node->type == XML_CDATA_SECTION_NODE)) {
10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        list =
10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlHashLookup2(triage, BAD_CAST "#text", NULL);
10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if (node->type == XML_ELEMENT_NODE) {
10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (node->ns != NULL) {
10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            list = xmlHashLookup2(triage, node->name,
10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  node->ns->href);
10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (list == NULL)
10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                list =
10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlHashLookup2(triage, BAD_CAST "#any",
10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   node->ns->href);
10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else
10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            list =
10323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlHashLookup2(triage, node->name, NULL);
10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (list == NULL)
10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            list =
10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlHashLookup2(triage, BAD_CAST "#any",
10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               NULL);
10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (list == NULL) {
10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, node->name);
10332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateDefinition(ctxt, list);
10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0) {
10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = define->content;
10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
10346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateDefinition(ctxt, list);
10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0) {
10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (states == NULL) {
10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            states = xmlRelaxNGNewStates(ctxt, 1);
10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->state != NULL) {
10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGAddStates(ctxt, states, ctxt->state);
10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else if (ctxt->states != NULL) {
10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            for (i = 0; i < ctxt->states->nbState; i++) {
10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGAddStates(ctxt, states,
10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    ctxt->states->
10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    tabState[i]);
10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGFreeStates(ctxt, ctxt->states);
10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->states = NULL;
10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = oldstate;
10366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
10367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (states != NULL) {
10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeValidState(ctxt, oldstate);
10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = states;
10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = NULL;
10372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 0;
10373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
10375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
10377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0) {
10378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
10379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDumpValidError(ctxt);
10380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->errNr > errNr)
10383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGPopErrors(ctxt, errNr);
10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content);
10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateInterleave(ctxt, define);
10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateAttribute(ctxt, define);
10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateDefinition(ctxt, define->content);
10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:{
10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr child;
10406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *content = NULL;
10407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                child = node;
10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (child != NULL) {
10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (child->type == XML_ELEMENT_NODE) {
10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        VALID_ERR2(XML_RELAXNG_ERR_DATAELEM,
10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   node->parent->name);
10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if ((child->type == XML_TEXT_NODE) ||
10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (child->type == XML_CDATA_SECTION_NODE)) {
10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        content = xmlStrcat(content, child->content);
10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* TODO: handle entities ... */
10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    child = child->next;
10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content != NULL)
10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(content);
10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content == NULL) {
10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    content = xmlStrdup(BAD_CAST "");
10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content == NULL) {
10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngVErrMemory(ctxt, "validating\n");
10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateDatatype(ctxt, content, define,
10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->state->seq);
10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name);
10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (ret == 0) {
10440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->seq = NULL;
10441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content != NULL)
10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(content);
10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:{
10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *content = NULL;
10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *oldvalue;
10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr child;
10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                child = node;
10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (child != NULL) {
10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (child->type == XML_ELEMENT_NODE) {
10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        VALID_ERR2(XML_RELAXNG_ERR_VALELEM,
10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   node->parent->name);
10456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if ((child->type == XML_TEXT_NODE) ||
10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (child->type == XML_CDATA_SECTION_NODE)) {
10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        content = xmlStrcat(content, child->content);
10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* TODO: handle entities ... */
10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    child = child->next;
10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content != NULL)
10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(content);
10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content == NULL) {
10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    content = xmlStrdup(BAD_CAST "");
10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content == NULL) {
10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngVErrMemory(ctxt, "validating\n");
10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldvalue = ctxt->state->value;
10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = content;
10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateValue(ctxt, define);
10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = oldvalue;
10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name);
10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (ret == 0) {
10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->seq = NULL;
10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content != NULL)
10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(content);
10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:{
10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *content;
10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr child;
10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *oldvalue, *oldendvalue;
10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int len;
10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Make sure it's only text nodes
10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                content = NULL;
10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                child = node;
10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (child != NULL) {
10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (child->type == XML_ELEMENT_NODE) {
10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        VALID_ERR2(XML_RELAXNG_ERR_LISTELEM,
10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   node->parent->name);
10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if ((child->type == XML_TEXT_NODE) ||
10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (child->type == XML_CDATA_SECTION_NODE)) {
10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        content = xmlStrcat(content, child->content);
10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* TODO: handle entities ... */
10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    child = child->next;
10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content != NULL)
10518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(content);
10519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content == NULL) {
10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    content = xmlStrdup(BAD_CAST "");
10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content == NULL) {
10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngVErrMemory(ctxt, "validating\n");
10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                len = xmlStrlen(content);
10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldvalue = ctxt->state->value;
10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldendvalue = ctxt->state->endvalue;
10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = content;
10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->endvalue = content + len;
10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateValue(ctxt, define);
10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = oldvalue;
10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->endvalue = oldendvalue;
10537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR(XML_RELAXNG_ERR_LIST);
10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((ret == 0) && (node != NULL)) {
10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->seq = node->next;
10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content != NULL)
10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(content);
10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO ret = -1;
10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->depth--;
10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->depth; i++)
10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, " ");
10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Validating %s ", xmlRelaxNGDefName(define));
10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL)
10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "%s ", define->name);
10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "suceeded\n");
10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "failed\n");
10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDefinition:
10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the current node lists against the definition
10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
10578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGDefinePtr define)
10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr states, res;
10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, k, ret, oldflags;
10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * We should NOT have both ctxt->state and ctxt->states
10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = NULL;
10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) {
10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->states != NULL) {
10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = ctxt->states->tabState[0];
10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(ctxt, ctxt->states);
10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->states = NULL;
10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateState(ctxt, define);
10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = NULL;
10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) {
10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = ctxt->states->tabState[0];
10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(ctxt, ctxt->states);
10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->states = NULL;
10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    states = ctxt->states;
10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->states = NULL;
10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = NULL;
10613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    j = 0;
10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldflags = ctxt->flags;
10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags |= FLAGS_IGNORABLE;
10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < states->nbState; i++) {
10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = states->tabState[i];
10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->states = NULL;
10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateState(ctxt, define);
10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * We should NOT have both ctxt->state and ctxt->states
10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = NULL;
10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret == 0) {
10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->states == NULL) {
10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (res != NULL) {
10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* add the state to the container */
10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, res, ctxt->state);
10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = NULL;
10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* add the state directly in states */
10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    states->tabState[j++] = ctxt->state;
10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = NULL;
10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (res == NULL) {
10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* make it the new container and copy other results */
10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    res = ctxt->states;
10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (k = 0; k < j; k++)
10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGAddStates(ctxt, res,
10645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            states->tabState[k]);
10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* add all the new results to res and reff the container */
10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (k = 0; k < ctxt->states->nbState; k++)
10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGAddStates(ctxt, res,
10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            ctxt->states->tabState[k]);
10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeStates(ctxt, ctxt->states);
10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->state != NULL) {
10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = NULL;
10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (ctxt->states != NULL) {
10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                for (k = 0; k < ctxt->states->nbState; k++)
10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeValidState(ctxt,
10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             ctxt->states->tabState[k]);
10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeStates(ctxt, ctxt->states);
10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->states = NULL;
10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags = oldflags;
10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != NULL) {
10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(ctxt, states);
10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->states = res;
10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (j > 1) {
10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->nbState = j;
10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->states = states;
10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
10677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (j == 1) {
10678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = states->tabState[0];
10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(ctxt, states);
10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(ctxt, states);
10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->states != NULL) {
10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(ctxt, ctxt->states);
10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->states = NULL;
10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = NULL;
10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDocument:
10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given document
10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc)
10707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;
10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr grammar;
10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;
10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL))
10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNo = XML_RELAXNG_OK;
10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    schema = ctxt->schema;
10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    grammar = schema->topgrammar;
10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar == NULL) {
10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = xmlRelaxNGNewValidState(ctxt, NULL);
10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = state;
10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start);
10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->state != NULL) && (state->seq != NULL)) {
10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        state = ctxt->state;
10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = state->seq;
10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = xmlRelaxNGSkipIgnored(ctxt, node);
10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node != NULL) {
10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != -1) {
10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR(XML_RELAXNG_ERR_EXTRADATA);
10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->states != NULL) {
10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
10739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int tmp = -1;
10740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->states->nbState; i++) {
10742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            state = ctxt->states->tabState[i];
10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = state->seq;
10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = xmlRelaxNGSkipIgnored(ctxt, node);
10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (node == NULL)
10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = 0;
10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(ctxt, state);
10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == -1) {
10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != -1) {
10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR(XML_RELAXNG_ERR_EXTRADATA);
10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
10753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL) {
10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = NULL;
10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDumpValidError(ctxt);
10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (ctxt->errNr != 0) {
10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->error(ctxt->userData,
10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "%d Extra error messages left on stack !\n",
10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->errNr);
10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDumpValidError(ctxt);
10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED
10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->idref == 1) {
10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlValidCtxt vctxt;
10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memset(&vctxt, 0, sizeof(xmlValidCtxt));
10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        vctxt.valid = 1;
10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        vctxt.error = ctxt->error;
10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        vctxt.warning = ctxt->warning;
10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        vctxt.userData = ctxt->userData;
10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlValidateDocumentFinal(&vctxt, doc) != 1)
10781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
10782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */
10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (ctxt->errNo != XML_RELAXNG_OK))
10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10790df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
10791df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGCleanPSVI:
10792df143a5041f03a22808b59c76698770b74692815Selim Gurun * @node:  an input element or document
10793df143a5041f03a22808b59c76698770b74692815Selim Gurun *
10794df143a5041f03a22808b59c76698770b74692815Selim Gurun * Call this routine to speed up XPath computation on static documents.
10795df143a5041f03a22808b59c76698770b74692815Selim Gurun * This stamps all the element nodes with the document order
10796df143a5041f03a22808b59c76698770b74692815Selim Gurun * Like for line information, the order is kept in the element->content
10797df143a5041f03a22808b59c76698770b74692815Selim Gurun * field, the value stored is actually - the node number (starting at -1)
10798df143a5041f03a22808b59c76698770b74692815Selim Gurun * to be able to differentiate from line numbers.
10799df143a5041f03a22808b59c76698770b74692815Selim Gurun *
10800df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the number of elements found in the document or -1 in case
10801df143a5041f03a22808b59c76698770b74692815Selim Gurun *    of error.
10802df143a5041f03a22808b59c76698770b74692815Selim Gurun */
10803df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
10804df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGCleanPSVI(xmlNodePtr node) {
10805df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlNodePtr cur;
10806df143a5041f03a22808b59c76698770b74692815Selim Gurun
10807df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((node == NULL) ||
10808df143a5041f03a22808b59c76698770b74692815Selim Gurun        ((node->type != XML_ELEMENT_NODE) &&
10809df143a5041f03a22808b59c76698770b74692815Selim Gurun         (node->type != XML_DOCUMENT_NODE) &&
10810df143a5041f03a22808b59c76698770b74692815Selim Gurun         (node->type != XML_HTML_DOCUMENT_NODE)))
10811df143a5041f03a22808b59c76698770b74692815Selim Gurun	return;
10812df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (node->type == XML_ELEMENT_NODE)
10813df143a5041f03a22808b59c76698770b74692815Selim Gurun        node->psvi = NULL;
10814df143a5041f03a22808b59c76698770b74692815Selim Gurun
10815df143a5041f03a22808b59c76698770b74692815Selim Gurun    cur = node->children;
10816df143a5041f03a22808b59c76698770b74692815Selim Gurun    while (cur != NULL) {
10817df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (cur->type == XML_ELEMENT_NODE) {
10818df143a5041f03a22808b59c76698770b74692815Selim Gurun	    cur->psvi = NULL;
10819df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (cur->children != NULL) {
10820df143a5041f03a22808b59c76698770b74692815Selim Gurun		cur = cur->children;
10821df143a5041f03a22808b59c76698770b74692815Selim Gurun		continue;
10822df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
10823df143a5041f03a22808b59c76698770b74692815Selim Gurun	}
10824df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (cur->next != NULL) {
10825df143a5041f03a22808b59c76698770b74692815Selim Gurun	    cur = cur->next;
10826df143a5041f03a22808b59c76698770b74692815Selim Gurun	    continue;
10827df143a5041f03a22808b59c76698770b74692815Selim Gurun	}
10828df143a5041f03a22808b59c76698770b74692815Selim Gurun	do {
10829df143a5041f03a22808b59c76698770b74692815Selim Gurun	    cur = cur->parent;
10830df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (cur == NULL)
10831df143a5041f03a22808b59c76698770b74692815Selim Gurun		break;
10832df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (cur == node) {
10833df143a5041f03a22808b59c76698770b74692815Selim Gurun		cur = NULL;
10834df143a5041f03a22808b59c76698770b74692815Selim Gurun		break;
10835df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
10836df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (cur->next != NULL) {
10837df143a5041f03a22808b59c76698770b74692815Selim Gurun		cur = cur->next;
10838df143a5041f03a22808b59c76698770b74692815Selim Gurun		break;
10839df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
10840df143a5041f03a22808b59c76698770b74692815Selim Gurun	} while (cur != NULL);
10841df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
10842df143a5041f03a22808b59c76698770b74692815Selim Gurun    return;
10843df143a5041f03a22808b59c76698770b74692815Selim Gurun}
10844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
10846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 			Validation interfaces				*
10847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 									*
10848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewValidCtxt:
10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a precompiled XML RelaxNGs
10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs validation context based on the given schema
10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the validation context or NULL in case of error
10857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidCtxtPtr
10859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema)
10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidCtxtPtr ret;
10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt));
10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(NULL, "building context\n");
10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGValidCtxt));
10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->schema = schema;
10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->error = xmlGenericError;
10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->userData = xmlGenericErrorContext;
10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->errNr = 0;
10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->errMax = 0;
10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->err = NULL;
10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->errTab = NULL;
10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL)
10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->idref = schema->idref;
10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->states = NULL;
10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->freeState = NULL;
10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->freeStates = NULL;
10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->errNo = XML_RELAXNG_OK;
10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeValidCtxt:
10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema validation context
10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context
10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt)
10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int k;
10895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->states != NULL)
10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(NULL, ctxt->states);
10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->freeState != NULL) {
10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (k = 0; k < ctxt->freeState->nbState; k++) {
10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]);
10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(NULL, ctxt->freeState);
10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->freeStates != NULL) {
10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (k = 0; k < ctxt->freeStatesNr; k++) {
10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]);
10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->freeStates);
10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errTab != NULL)
10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->errTab);
10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemTab != NULL) {
10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegExecCtxtPtr exec;
10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        exec = xmlRelaxNGElemPop(ctxt);
10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (exec != NULL) {
10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRegFreeExecCtxt(exec);
10920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            exec = xmlRelaxNGElemPop(ctxt);
10921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->elemTab);
10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetValidErrors:
10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error function
10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function
10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the error and warning callback informations
10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidityErrorFunc err,
10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidityWarningFunc warn, void *ctx)
10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = err;
10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = warn;
10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->userData = ctx;
10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = NULL;
10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetValidStructuredErrors:
10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror:  the structured error function
10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the structured error callback
10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt,
10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   xmlStructuredErrorFunc serror, void *ctx)
10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = serror;
10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = NULL;
10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = NULL;
10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->userData = ctx;
10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetValidErrors:
10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error function result
10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function result
10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context result
10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the error and warning callback informations
10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error and 0 otherwise
10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidityErrorFunc * err,
10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidityWarningFunc * warn, void **ctx)
10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (err != NULL)
10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *err = ctxt->error;
10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (warn != NULL)
10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *warn = ctxt->warning;
10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctx != NULL)
10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *ctx = ctxt->userData;
10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDoc:
10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a parsed document tree
11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a document tree in memory.
11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is valid, a positive error code
11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc)
11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (doc == NULL))
11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->doc = doc;
11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGValidateDocument(ctxt, doc);
11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11018df143a5041f03a22808b59c76698770b74692815Selim Gurun     * Remove all left PSVI
11019df143a5041f03a22808b59c76698770b74692815Selim Gurun     */
11020df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRelaxNGCleanPSVI((xmlNodePtr) doc);
11021df143a5041f03a22808b59c76698770b74692815Selim Gurun
11022df143a5041f03a22808b59c76698770b74692815Selim Gurun    /*
11023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * TODO: build error codes
11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -1)
11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_relaxng
11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SCHEMAS_ENABLED */
11033