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
4294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define IS_RELAXNG(node, typ)						\
43ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project   ((node != NULL) && (node->ns != NULL) &&				\
4494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    (node->type == XML_ELEMENT_NODE) &&					\
4594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun    (xmlStrEqual(node->name, (const xmlChar *) typ)) &&		\
46ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    (xmlStrEqual(node->ns->href, xmlRelaxNGNs)))
47ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
48ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
49ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
50ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG 1
51ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
52ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_GRAMMAR 1
53ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
54ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_CONTENT 1
55ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
56ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_TYPE 1
57ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
58ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_VALID 1
59ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
60ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_INTERLEAVE 1
61ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
62ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_LIST 1
63ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define DEBUG_INCLUDE 1
65ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
66ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_ERROR 1
67ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
68ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_COMPILE 1
69ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
70ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define DEBUG_PROGRESSIVE 1
71ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
72ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
73ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_ERROR 5
74ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun#define TODO								\
76ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,				\
77ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    "Unimplemented block at %s:%d\n",				\
78ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            __FILE__, __LINE__);
79ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
80ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGSchema xmlRelaxNGSchema;
81ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGSchema *xmlRelaxNGSchemaPtr;
82ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
83ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGDefine xmlRelaxNGDefine;
84ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGDefine *xmlRelaxNGDefinePtr;
85ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
86ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGDocument xmlRelaxNGDocument;
87ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGDocument *xmlRelaxNGDocumentPtr;
88ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
89ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGInclude xmlRelaxNGInclude;
90ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGInclude *xmlRelaxNGIncludePtr;
91ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
92ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
93ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_COMBINE_UNDEFINED = 0,  /* undefined */
94ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_COMBINE_CHOICE, /* choice */
95ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_COMBINE_INTERLEAVE      /* interleave */
96ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGCombine;
97ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
98ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
99ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CONTENT_ERROR = -1,
100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CONTENT_EMPTY = 0,
101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CONTENT_SIMPLE,
102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CONTENT_COMPLEX
103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGContentType;
104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGGrammar xmlRelaxNGGrammar;
106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGGrammar *xmlRelaxNGGrammarPtr;
107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGGrammar {
109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr parent;        /* the parent grammar if any */
110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr children;      /* the children grammar if any */
111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr next;  /* the next grammar if any */
112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr start;  /* <start> content */
113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGCombine combine;  /* the default combine value */
114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr startList;      /* list of <start> definitions */
115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr defs;       /* define* */
116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr refs;       /* references */
117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef enum {
121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_NOOP = -1,      /* a no operation from simplification  */
122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_EMPTY = 0,      /* an empty pattern */
123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_NOT_ALLOWED,    /* not allowed top */
124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_EXCEPT,         /* except present in nameclass defs */
125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_TEXT,           /* textual content */
126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_ELEMENT,        /* an element */
127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_DATATYPE,       /* extenal data type definition */
128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_PARAM,          /* extenal data type parameter */
129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_VALUE,          /* value from an extenal data type definition */
130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_LIST,           /* a list of patterns */
131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_ATTRIBUTE,      /* an attrbute following a pattern */
132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_DEF,            /* a definition */
133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_REF,            /* reference to a definition */
134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_EXTERNALREF,    /* reference to an external def */
135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_PARENTREF,      /* reference to a def in the parent grammar */
136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_OPTIONAL,       /* optional patterns */
137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_ZEROORMORE,     /* zero or more non empty patterns */
138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_ONEORMORE,      /* one or more non empty patterns */
139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_CHOICE,         /* a choice between non empty patterns */
140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_GROUP,          /* a pair/group of non empty patterns */
141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_INTERLEAVE,     /* interleaving choice of non-empty patterns */
142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    XML_RELAXNG_START           /* Used to keep track of starts on grammars */
143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project} xmlRelaxNGType;
144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NULLABLE		(1 << 0)
146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NOT_NULLABLE		(1 << 1)
147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_INDETERMINIST	(1 << 2)
148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_MIXED		(1 << 3)
149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_TRIABLE		(1 << 4)
150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_PROCESSED		(1 << 5)
151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_COMPILABLE		(1 << 6)
152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NOT_COMPILABLE	(1 << 7)
153df143a5041f03a22808b59c76698770b74692815Selim Gurun#define IS_EXTERNAL_REF	        (1 << 8)
154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGDefine {
156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGType type;        /* the type of definition */
157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;            /* the node in the source */
158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;              /* the element local name if present */
159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ns;                /* the namespace local name if present */
160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value;             /* value when available */
161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data;                 /* data lib or specific pointer */
162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr content;        /* the expected content */
163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr parent; /* the parent definition, if any */
164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr next;   /* list within grouping sequences */
165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr attrs;  /* list of attributes for elements */
166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr nameClass;      /* the nameClass definition if any */
167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr nextHash;       /* next define in defs/refs hash tables */
168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    short depth;                /* used for the cycle detection */
169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    short dflags;               /* define related flags */
170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegexpPtr contModel;     /* a compiled content model if available */
171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * _xmlRelaxNG:
175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs definition
177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNG {
179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *_private;             /* unused by the library for users or bindings */
180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr topgrammar;
181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int idref;                  /* requires idref checking */
184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr defs;       /* define */
186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr refs;       /* references */
187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr documents;    /* all the documents loaded */
188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr includes;      /* all the includes loaded */
189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int defNr;                  /* number of defines used */
190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *defTab;        /* pointer to the allocated definitions */
191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ATTRIBUTE	(1 << 0)
195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ONEORMORE	(1 << 1)
196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_LIST		(1 << 2)
197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_DATAEXCEPT	(1 << 3)
198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_START		(1 << 4)
199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_OOMGROUP		(1 << 5)
200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_OOMINTERLEAVE	(1 << 6)
201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_EXTERNALREF	(1 << 7)
202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_ANYEXCEPT	(1 << 8)
203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define XML_RELAXNG_IN_NSEXCEPT		(1 << 9)
204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGParserCtxt {
206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *userData;             /* user specific data block */
207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidityErrorFunc error;  /* the callback in case of errors */
208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidityWarningFunc warning;      /* the callback in case of warning */
209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc serror;
210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErr err;
211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;       /* The schema in use */
213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr grammar;       /* the current grammar */
214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr parentgrammar; /* the parent grammar */
215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;                  /* parser flags */
216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbErrors;               /* number of errors at parse time */
217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbWarnings;             /* number of warnings at parse time */
218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *define;      /* the current define scope */
219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def;    /* the current define */
220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbInterleaves;
222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr interleaves;        /* keep track of all the interleaves */
223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr documents;    /* all the documents loaded */
225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr includes;      /* all the includes loaded */
226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *URL;
227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr document;
228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int defNr;                  /* number of defines used */
230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int defMax;                 /* number of defines aloocated */
231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *defTab;        /* pointer to the allocated definitions */
232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const char *buffer;
234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int size;
235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the document stack */
237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr doc;  /* Current parsed external ref */
238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int docNr;                  /* Depth of the parsing stack */
239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int docMax;                 /* Max depth of the parsing stack */
240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr *docTab;      /* array of docs */
241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* the include stack */
243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr inc;   /* Current parsed include */
244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int incNr;                  /* Depth of the include parsing stack */
245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int incMax;                 /* Max depth of the parsing stack */
246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr *incTab;       /* array of incs */
247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int idref;                  /* requires idref checking */
249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* used to compile content models */
251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataPtr am;          /* the automata */
252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAutomataStatePtr state;  /* used to build the automata */
253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int crng;			/* compact syntax and other flags */
255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int freedoc;		/* need to free the document */
256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_IGNORABLE		1
259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_NEGATIVE		2
260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_MIXED_CONTENT	4
261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define FLAGS_NOERROR		8
262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInterleaveGroup:
265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs partition set associated to lists of definitions
267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGInterleaveGroup xmlRelaxNGInterleaveGroup;
269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGInterleaveGroup *xmlRelaxNGInterleaveGroupPtr;
270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGInterleaveGroup {
271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr rule;   /* the rule to satisfy */
272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *defs;  /* the array of element definitions */
273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *attrs; /* the array of attributes definitions */
274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_DETERMINIST		1
277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_NEEDCHECK		2
278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGPartitions:
281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs partition associated to an interleave group
283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGPartition xmlRelaxNGPartition;
285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGPartition *xmlRelaxNGPartitionPtr;
286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGPartition {
287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbgroups;               /* number of groups in the partitions */
288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr triage;     /* hash table used to direct nodes to the
289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 * right group when possible */
290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;                  /* determinist ? */
291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr *groups;
292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidState:
296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation state
298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define MAX_ATTR 20
300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGValidState xmlRelaxNGValidState;
301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGValidState *xmlRelaxNGValidStatePtr;
302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidState {
303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;            /* the current node */
304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr seq;             /* the sequence of children left to validate */
305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAttrs;                /* the number of attributes */
306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxAttrs;               /* the size of attrs */
307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAttrLeft;             /* the number of attributes left to validate */
308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value;             /* the value when operating on string */
309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *endvalue;          /* the end value when operating on string */
310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr *attrs;          /* the array of attributes */
311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGStates:
315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs container for validation state
317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGStates xmlRelaxNGStates;
319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGStates *xmlRelaxNGStatesPtr;
320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGStates {
321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbState;                /* the number of states */
322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int maxState;               /* the size of the array */
323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr *tabState;
324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define ERROR_IS_DUP	1
327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidError:
330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation error
332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGValidError xmlRelaxNGValidError;
334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGValidError *xmlRelaxNGValidErrorPtr;
335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidError {
336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErr err;     /* the error number */
337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;                  /* flags */
338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;            /* the current node */
339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr seq;             /* the current child */
340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *arg1;        /* first arg */
341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *arg2;        /* second arg */
342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidCtxt:
346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A RelaxNGs validation context
348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGValidCtxt {
351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *userData;             /* user specific data block */
352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidityErrorFunc error;  /* the callback in case of errors */
353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidityWarningFunc warning;      /* the callback in case of warning */
354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc serror;
355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbErrors;               /* number of errors in validation */
356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;       /* The schema in use */
358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;              /* the document being validated */
359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int flags;                  /* validation flags */
360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int depth;                  /* validation depth */
361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int idref;                  /* requires idref checking */
362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errNo;                  /* the first error found */
363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Errors accumulated in branches may have to be stacked to be
366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * provided back when it's sure they affect validation.
367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr err;        /* Last error */
369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errNr;                  /* Depth of the error stack */
370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errMax;                 /* Max depth of the error stack */
371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr errTab;     /* stack of errors */
372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;      /* the current validation state */
374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr states; /* the accumulated state list */
375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr freeState;      /* the pool of free valid states */
377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int freeStatesNr;
378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int freeStatesMax;
379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr *freeStates;    /* the pool of free state groups */
380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * This is used for "progressive" validation
383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr elem;     /* the current element regexp */
385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int elemNr;                 /* the number of element validated */
386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int elemMax;                /* the max depth of elements */
387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr *elemTab; /* the stack of regexp runtime */
388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int pstate;                 /* progressive state */
389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr pnode;           /* the current node */
390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr pdef;   /* the non-streamable definition */
391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int perr;                   /* signal error in content model
392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 * outside the regexp */
393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInclude:
397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to a RelaxNGs document element
399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGInclude {
401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr next;  /* keep a chain of includes */
402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *href;              /* the normalized href value */
403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;              /* the associated XML document */
404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr content;        /* the definitions */
405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;       /* the schema */
406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocument:
410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Structure associated to a RelaxNGs document element
412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGDocument {
414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr next; /* keep a chain of documents */
415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *href;              /* the normalized href value */
416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;              /* the associated XML document */
417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr content;        /* the definitions */
418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;       /* the schema */
419df143a5041f03a22808b59c76698770b74692815Selim Gurun    int externalRef;            /* 1 if an external ref */
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 *									*
42594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Some factorized error routines				*
426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *									*
427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngPErrMemory:
431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  an Relax-NG parser context
432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngPErrMemory(xmlRelaxNGParserCtxtPtr ctxt, const char *extra)
438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->serror != NULL)
445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->serror;
446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->error;
448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->userData;
449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nbErrors++;
450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (extra)
452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlRaiseError(schannel, channel, data,
453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, XML_FROM_RELAXNGP,
454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra,
455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, 0, 0,
456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Memory allocation failed : %s\n", extra);
457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlRaiseError(schannel, channel, data,
459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, XML_FROM_RELAXNGP,
460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL,
461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, 0, 0, "Memory allocation failed\n");
462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngVErrMemory:
466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @extra:  extra informations
468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a redefinition of attribute error
470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngVErrMemory(xmlRelaxNGValidCtxtPtr ctxt, const char *extra)
473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->serror != NULL)
480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->serror;
481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->error;
483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->userData;
484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nbErrors++;
485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (extra)
487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlRaiseError(schannel, channel, data,
488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, XML_FROM_RELAXNGV,
489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, extra,
490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, 0, 0,
491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Memory allocation failed : %s\n", extra);
492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        __xmlRaiseError(schannel, channel, data,
494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, XML_FROM_RELAXNGV,
495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        XML_ERR_NO_MEMORY, XML_ERR_FATAL, NULL, 0, NULL,
496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        NULL, NULL, 0, 0, "Memory allocation failed\n");
497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngPErr:
501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node raising the error
503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error:  the error code
504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg:  message
505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  extra info
506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  extra info
507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a Relax NG Parsing error
509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngPErr(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node, int error,
512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           const char *msg, const xmlChar * str1, const xmlChar * str2)
513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->serror != NULL)
520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->serror;
521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->error;
523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->userData;
524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nbErrors++;
525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data,
527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    NULL, node, XML_FROM_RELAXNGP,
528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    error, XML_ERR_ERROR, NULL, 0,
529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (const char *) str1, (const char *) str2, NULL, 0, 0,
530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    msg, str1, str2);
531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRngVErr:
535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node raising the error
537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @error:  the error code
538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @msg:  message
539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str1:  extra info
540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str2:  extra info
541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle a Relax NG Validation error
543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRngVErr(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node, int error,
546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           const char *msg, const xmlChar * str1, const xmlChar * str2)
547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlStructuredErrorFunc schannel = NULL;
549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericErrorFunc channel = NULL;
550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data = NULL;
551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt != NULL) {
553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->serror != NULL)
554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    schannel = ctxt->serror;
555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	else
556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    channel = ctxt->error;
557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data = ctxt->userData;
558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->nbErrors++;
559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    __xmlRaiseError(schannel, channel, data,
561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    NULL, node, XML_FROM_RELAXNGV,
562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    error, XML_ERR_ERROR, NULL, 0,
563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (const char *) str1, (const char *) str2, NULL, 0, 0,
564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    msg, str1, str2);
565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
56894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
56994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Preliminary type checking interfaces			*
57094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeHave:
575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check if a type is exported
580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeHave) (void *data, const xmlChar * type);
584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeCheck:
587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @result:  place to store the result if needed
591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check if a value match a type
593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeCheck) (void *data, const xmlChar * type,
597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    const xmlChar * value, void **result,
598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlNodePtr node);
599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFacetCheck:
602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet name
605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the facet value
606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strval:  the string value
607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check a value facet
610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGFacetCheck) (void *data, const xmlChar * type,
614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     const xmlChar * facet,
615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     const xmlChar * val,
616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     const xmlChar * strval, void *value);
617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeFree:
620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @result:  the value to free
622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to free a returned result
624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef void (*xmlRelaxNGTypeFree) (void *data, void *result);
626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTypeCompare:
629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1:  the first value
632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2:  the second value
633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to compare two values accordingly
635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to a type.
636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef int (*xmlRelaxNGTypeCompare) (void *data, const xmlChar * type,
640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      const xmlChar * value1,
641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      xmlNodePtr ctxt1,
642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      void *comp1,
643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      const xmlChar * value2,
644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      xmlNodePtr ctxt2);
645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef struct _xmlRelaxNGTypeLibrary xmlRelaxNGTypeLibrary;
646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projecttypedef xmlRelaxNGTypeLibrary *xmlRelaxNGTypeLibraryPtr;
647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstruct _xmlRelaxNGTypeLibrary {
648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *namespace;   /* the datatypeLibrary value */
649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *data;                 /* data needed for the library */
650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeHave have;    /* the export function */
651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeCheck check;  /* the checking function */
652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeCompare comp; /* the compare function */
653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGFacetCheck facet; /* the facet check function */
654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeFree freef;   /* the freeing function */
655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project};
656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
65894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
65994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Allocation functions				*
66094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar);
663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define);
664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGNormExtSpace(xmlChar * value);
665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema);
666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt
667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     ATTRIBUTE_UNUSED,
668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     xmlRelaxNGValidStatePtr state1,
669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     xmlRelaxNGValidStatePtr state2);
670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     xmlRelaxNGValidStatePtr state);
672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDocument:
675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @docu:  a document structure
676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG document structure.
678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDocument(xmlRelaxNGDocumentPtr docu)
681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu == NULL)
683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu->href != NULL)
686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(docu->href);
687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu->doc != NULL)
688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(docu->doc);
689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu->schema != NULL)
690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeInnerSchema(docu->schema);
691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(docu);
692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDocumentList:
696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @docu:  a list of  document structure
697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG document structures.
699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDocumentList(xmlRelaxNGDocumentPtr docu)
702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr next;
704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (docu != NULL) {
706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        next = docu->next;
707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeDocument(docu);
708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        docu = next;
709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeInclude:
714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @incl:  a include structure
715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG include structure.
717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeInclude(xmlRelaxNGIncludePtr incl)
720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl == NULL)
722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl->href != NULL)
725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(incl->href);
726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl->doc != NULL)
727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(incl->doc);
728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl->schema != NULL)
729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFree(incl->schema);
730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(incl);
731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeIncludeList:
735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @incl:  a include structure list
736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG include structure.
738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeIncludeList(xmlRelaxNGIncludePtr incl)
741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr next;
743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (incl != NULL) {
745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        next = incl->next;
746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeInclude(incl);
747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        incl = next;
748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewRelaxNG:
753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context (optional)
754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG structure.
756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr
760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewRelaxNG(xmlRelaxNGParserCtxtPtr ctxt)
761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr ret;
763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGPtr) xmlMalloc(sizeof(xmlRelaxNG));
765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, NULL);
767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNG));
770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeInnerSchema:
776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG schema structure.
779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeInnerSchema(xmlRelaxNGPtr schema)
782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->doc != NULL)
787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(schema->doc);
788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->defTab != NULL) {
789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < schema->defNr; i++)
792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeDefine(schema->defTab[i]);
793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(schema->defTab);
794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(schema);
797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFree:
801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG structure.
804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFree(xmlRelaxNGPtr schema)
807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->topgrammar != NULL)
812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeGrammar(schema->topgrammar);
813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->doc != NULL)
814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(schema->doc);
815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->documents != NULL)
816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeDocumentList(schema->documents);
817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->includes != NULL)
818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeIncludeList(schema->includes);
819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->defTab != NULL) {
820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < schema->defNr; i++)
823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeDefine(schema->defTab[i]);
824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(schema->defTab);
825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(schema);
828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewGrammar:
832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context (optional)
833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG grammar.
835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr
839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewGrammar(xmlRelaxNGParserCtxtPtr ctxt)
840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr ret;
842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGGrammarPtr) xmlMalloc(sizeof(xmlRelaxNGGrammar));
844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, NULL);
846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGGrammar));
849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeGrammar:
855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar:  a grammar structure
856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG grammar structure.
858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeGrammar(xmlRelaxNGGrammarPtr grammar)
861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar == NULL)
863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->children != NULL) {
866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeGrammar(grammar->children);
867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->next != NULL) {
869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeGrammar(grammar->next);
870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->refs != NULL) {
872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(grammar->refs, NULL);
873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->defs != NULL) {
875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(grammar->defs, NULL);
876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(grammar);
879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewDefine:
883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node in the input document.
885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG define.
887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret;
894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->defMax == 0) {
896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defMax = 16;
897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defNr = 0;
898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defTab = (xmlRelaxNGDefinePtr *)
899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(ctxt->defMax * sizeof(xmlRelaxNGDefinePtr));
900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->defTab == NULL) {
901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "allocating define\n");
902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->defMax <= ctxt->defNr) {
905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr *tmp;
906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defMax *= 2;
908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlRelaxNGDefinePtr *) xmlRealloc(ctxt->defTab,
909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->defMax *
910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 sizeof
911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 (xmlRelaxNGDefinePtr));
912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "allocating define\n");
914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->defTab = tmp;
917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGDefinePtr) xmlMalloc(sizeof(xmlRelaxNGDefine));
919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "allocating define\n");
921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGDefine));
924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->defTab[ctxt->defNr++] = ret;
925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->node = node;
926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->depth = -1;
927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreePartition:
932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @partitions:  a partition set structure
933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate RelaxNG partition set structures.
935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreePartition(xmlRelaxNGPartitionPtr partitions)
938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr group;
940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int j;
941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (partitions != NULL) {
943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (partitions->groups != NULL) {
944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (j = 0; j < partitions->nbgroups; j++) {
945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                group = partitions->groups[j];
946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (group != NULL) {
947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (group->defs != NULL)
948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(group->defs);
949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (group->attrs != NULL)
950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(group->attrs);
951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(group);
952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(partitions->groups);
955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (partitions->triage != NULL) {
957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlHashFree(partitions->triage, NULL);
958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(partitions);
960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeDefine:
965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  a define structure
966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG define structure.
968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeDefine(xmlRelaxNGDefinePtr define)
971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL)
973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define->type == XML_RELAXNG_VALUE) && (define->attrs != NULL)) {
976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGTypeLibraryPtr lib;
977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        lib = (xmlRelaxNGTypeLibraryPtr) define->data;
979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((lib != NULL) && (lib->freef != NULL))
980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lib->freef(lib->data, (void *) define->attrs);
981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define->data != NULL) && (define->type == XML_RELAXNG_INTERLEAVE))
983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreePartition((xmlRelaxNGPartitionPtr) define->data);
984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define->data != NULL) && (define->type == XML_RELAXNG_CHOICE))
985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree((xmlHashTablePtr) define->data, NULL);
986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL)
987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(define->name);
988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->ns != NULL)
989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(define->ns);
990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->value != NULL)
991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(define->value);
992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->contModel != NULL)
993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegFreeRegexp(define->contModel);
994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(define);
995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewStates:
999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the default size for the container
1001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG validation state container
1003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
1005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGStatesPtr
1007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewStates(xmlRelaxNGValidCtxtPtr ctxt, int size)
1008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr ret;
1010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) &&
1012df143a5041f03a22808b59c76698770b74692815Selim Gurun        (ctxt->freeStates != NULL) && (ctxt->freeStatesNr > 0)) {
1013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStatesNr--;
1014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ctxt->freeStates[ctxt->freeStatesNr];
1015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->nbState = 0;
1016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
1017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (size < 16)
1019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        size = 16;
1020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGStatesPtr) xmlMalloc(sizeof(xmlRelaxNGStates) +
1022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                          (size -
1023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           1) *
1024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                          sizeof(xmlRelaxNGValidStatePtr));
1025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
1026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "allocating states\n");
1027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbState = 0;
1030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxState = size;
1031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->tabState = (xmlRelaxNGValidStatePtr *) xmlMalloc((size) *
1032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                          sizeof
1033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                          (xmlRelaxNGValidStatePtr));
1034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->tabState == NULL) {
1035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "allocating states\n");
1036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ret);
1037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddStateUniq:
1044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states:  the states container
1046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  the validation state
1047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a RelaxNG validation state to the container without checking
1049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * for unicity.
1050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return 1 in case of success and 0 if this is a duplicate and -1 on error
1052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddStatesUniq(xmlRelaxNGValidCtxtPtr ctxt,
1055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGStatesPtr states,
1056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGValidStatePtr state)
1057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
1059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
1060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (states->nbState >= states->maxState) {
1062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGValidStatePtr *tmp;
1063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int size;
1064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        size = states->maxState * 2;
1066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState,
1067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     (size) *
1068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     sizeof
1069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     (xmlRelaxNGValidStatePtr));
1070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
1071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "adding states\n");
1072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
1073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->tabState = tmp;
1075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->maxState = size;
1076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    states->tabState[states->nbState++] = state;
1078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
1079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddState:
1083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states:  the states container
1085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  the validation state
1086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Add a RelaxNG validation state to the container
1088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Return 1 in case of success and 0 if this is a duplicate and -1 on error
1090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddStates(xmlRelaxNGValidCtxtPtr ctxt,
1093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGStatesPtr states,
1094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGValidStatePtr state)
1095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
1099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
1100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (states->nbState >= states->maxState) {
1102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGValidStatePtr *tmp;
1103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int size;
1104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        size = states->maxState * 2;
1106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlRelaxNGValidStatePtr *) xmlRealloc(states->tabState,
1107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     (size) *
1108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     sizeof
1109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     (xmlRelaxNGValidStatePtr));
1110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
1111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "adding states\n");
1112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
1113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->tabState = tmp;
1115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->maxState = size;
1116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < states->nbState; i++) {
1118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlRelaxNGEqualValidState(ctxt, state, states->tabState[i])) {
1119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(ctxt, state);
1120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    states->tabState[states->nbState++] = state;
1124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
1125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeStates:
1129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @states:  teh container
1131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free a RelaxNG validation state container
1133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeStates(xmlRelaxNGValidCtxtPtr ctxt,
1136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlRelaxNGStatesPtr states)
1137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (states == NULL)
1139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
1140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->freeStates == NULL)) {
1141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStatesMax = 40;
1142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStatesNr = 0;
1143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStates = (xmlRelaxNGStatesPtr *)
1144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(ctxt->freeStatesMax * sizeof(xmlRelaxNGStatesPtr));
1145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->freeStates == NULL) {
1146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "storing states\n");
1147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((ctxt != NULL)
1149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               && (ctxt->freeStatesNr >= ctxt->freeStatesMax)) {
1150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGStatesPtr *tmp;
1151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = (xmlRelaxNGStatesPtr *) xmlRealloc(ctxt->freeStates,
1153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 2 * ctxt->freeStatesMax *
1154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 sizeof
1155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 (xmlRelaxNGStatesPtr));
1156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
1157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "storing states\n");
1158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(states->tabState);
1159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(states);
1160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return;
1161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStates = tmp;
1163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStatesMax *= 2;
1164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->freeStates == NULL)) {
1166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(states->tabState);
1167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(states);
1168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeStates[ctxt->freeStatesNr++] = states;
1170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewValidState:
1175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the current node or NULL for the document
1177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Allocate a new RelaxNG validation state
1179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
1181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGValidStatePtr
1183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewValidState(xmlRelaxNGValidCtxtPtr ctxt, xmlNodePtr node)
1184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr ret;
1186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attr;
1187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr attrs[MAX_ATTR];
1188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbAttrs = 0;
1189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root = NULL;
1190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL) {
1192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        root = xmlDocGetRootElement(ctxt->doc);
1193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (root == NULL)
1194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        attr = node->properties;
1197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (attr != NULL) {
1198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nbAttrs < MAX_ATTR)
1199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                attrs[nbAttrs++] = attr;
1200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
1201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nbAttrs++;
1202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            attr = attr->next;
1203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) {
1206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeState->nbState--;
1207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ctxt->freeState->tabState[ctxt->freeState->nbState];
1208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret =
1210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGValidStatePtr)
1211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(sizeof(xmlRelaxNGValidState));
1212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret == NULL) {
1213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "allocating states\n");
1214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memset(ret, 0, sizeof(xmlRelaxNGValidState));
1217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->value = NULL;
1219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->endvalue = NULL;
1220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL) {
1221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->node = (xmlNodePtr) ctxt->doc;
1222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->seq = root;
1223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->node = node;
1225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->seq = node->children;
1226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbAttrs = 0;
1228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nbAttrs > 0) {
1229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret->attrs == NULL) {
1230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nbAttrs < 4)
1231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->maxAttrs = 4;
1232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
1233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->maxAttrs = nbAttrs;
1234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs *
1235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  sizeof(xmlAttrPtr));
1236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret->attrs == NULL) {
1237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngVErrMemory(ctxt, "allocating states\n");
1238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
1239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ret->maxAttrs < nbAttrs) {
1241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlAttrPtr *tmp;
1242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, nbAttrs *
1244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            sizeof(xmlAttrPtr));
1245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == NULL) {
1246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngVErrMemory(ctxt, "allocating states\n");
1247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
1248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->attrs = tmp;
1250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->maxAttrs = nbAttrs;
1251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->nbAttrs = nbAttrs;
1253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nbAttrs < MAX_ATTR) {
1254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            memcpy(ret->attrs, attrs, sizeof(xmlAttrPtr) * nbAttrs);
1255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
1256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            attr = node->properties;
1257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nbAttrs = 0;
1258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (attr != NULL) {
1259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->attrs[nbAttrs++] = attr;
1260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                attr = attr->next;
1261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->nbAttrLeft = ret->nbAttrs;
1265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCopyValidState:
1270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  a validation state
1272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Copy the validation state
1274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the newly allocated structure or NULL in case or error
1276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGValidStatePtr
1278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCopyValidState(xmlRelaxNGValidCtxtPtr ctxt,
1279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidStatePtr state)
1280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr ret;
1282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    unsigned int maxAttrs;
1283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr *attrs;
1284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL)
1286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->freeState != NULL) && (ctxt->freeState->nbState > 0)) {
1288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeState->nbState--;
1289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ctxt->freeState->tabState[ctxt->freeState->nbState];
1290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret =
1292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGValidStatePtr)
1293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(sizeof(xmlRelaxNGValidState));
1294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret == NULL) {
1295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "allocating states\n");
1296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memset(ret, 0, sizeof(xmlRelaxNGValidState));
1299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    attrs = ret->attrs;
1301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    maxAttrs = ret->maxAttrs;
1302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memcpy(ret, state, sizeof(xmlRelaxNGValidState));
1303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->attrs = attrs;
1304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->maxAttrs = maxAttrs;
1305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->nbAttrs > 0) {
1306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret->attrs == NULL) {
1307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->maxAttrs = state->maxAttrs;
1308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->attrs = (xmlAttrPtr *) xmlMalloc(ret->maxAttrs *
1309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  sizeof(xmlAttrPtr));
1310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret->attrs == NULL) {
1311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngVErrMemory(ctxt, "allocating states\n");
1312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->nbAttrs = 0;
1313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
1314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ret->maxAttrs < state->nbAttrs) {
1316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlAttrPtr *tmp;
1317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = (xmlAttrPtr *) xmlRealloc(ret->attrs, state->maxAttrs *
1319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            sizeof(xmlAttrPtr));
1320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == NULL) {
1321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngVErrMemory(ctxt, "allocating states\n");
1322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->nbAttrs = 0;
1323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
1324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->maxAttrs = state->maxAttrs;
1326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->attrs = tmp;
1327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memcpy(ret->attrs, state->attrs,
1329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               state->nbAttrs * sizeof(xmlAttrPtr));
1330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGEqualValidState:
1336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
1337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state1:  a validation state
1338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state2:  a validation state
1339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the validation states for equality
1341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equald, 0 otherwise
1343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGEqualValidState(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED,
1346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidStatePtr state1,
1347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidStatePtr state2)
1348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((state1 == NULL) || (state2 == NULL))
1352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1 == state2)
1354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
1355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->node != state2->node)
1356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->seq != state2->seq)
1358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->nbAttrLeft != state2->nbAttrLeft)
1360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->nbAttrs != state2->nbAttrs)
1362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state1->endvalue != state2->endvalue)
1364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((state1->value != state2->value) &&
1366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (!xmlStrEqual(state1->value, state2->value)))
1367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
1368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < state1->nbAttrs; i++) {
1369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state1->attrs[i] != state2->attrs[i])
1370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
1373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeValidState:
1377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @state:  a validation state structure
1378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Deallocate a RelaxNG validation state structure.
1380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeValidState(xmlRelaxNGValidCtxtPtr ctxt,
1383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidStatePtr state)
1384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL)
1386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
1387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt != NULL) && (ctxt->freeState == NULL)) {
1389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->freeState = xmlRelaxNGNewStates(ctxt, 40);
1390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->freeState == NULL)) {
1392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state->attrs != NULL)
1393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(state->attrs);
1394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(state);
1395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGAddStatesUniq(ctxt, ctxt->freeState, state);
1397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
140194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
140294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Semi internal functions				*
140394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
1404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxParserSetFlag:
1408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: a RelaxNG parser context
1409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags: a set of flags values
1410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Semi private function used to pass informations to a parser context
1412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * which are a combination of xmlRelaxNGParserFlag .
1413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error
1415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
1417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxParserSetFlag(xmlRelaxNGParserCtxtPtr ctxt, int flags)
1418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) return(-1);
1420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flags & XML_RELAXNGP_FREE_DOC) {
1421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->crng |= XML_RELAXNGP_FREE_DOC;
1422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	flags -= XML_RELAXNGP_FREE_DOC;
1423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flags & XML_RELAXNGP_CRNG) {
1425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->crng |= XML_RELAXNGP_CRNG;
1426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	flags -= XML_RELAXNGP_CRNG;
1427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (flags != 0) return(-1);
1429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return(0);
1430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
143394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
143494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Document functions				*
143594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
1436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
1437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlDocPtr xmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt,
1438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      xmlDocPtr doc);
1439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIncludePush:
1442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
1443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the element doc
1444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new include on top of the include stack
1446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise
1448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIncludePush(xmlRelaxNGParserCtxtPtr ctxt,
1451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlRelaxNGIncludePtr value)
1452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incTab == NULL) {
1454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incMax = 4;
1455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incNr = 0;
1456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incTab =
1457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGIncludePtr *) xmlMalloc(ctxt->incMax *
1458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               sizeof(ctxt->incTab[0]));
1459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->incTab == NULL) {
1460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "allocating include\n");
1461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incNr >= ctxt->incMax) {
1465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incMax *= 2;
1466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->incTab =
1467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGIncludePtr *) xmlRealloc(ctxt->incTab,
1468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                ctxt->incMax *
1469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                sizeof(ctxt->incTab[0]));
1470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->incTab == NULL) {
1471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "allocating include\n");
1472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->incTab[ctxt->incNr] = value;
1476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->inc = value;
1477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt->incNr++);
1478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIncludePop:
1482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top include from the include stack
1485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the include just removed
1487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGIncludePtr
1489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIncludePop(xmlRelaxNGParserCtxtPtr ctxt)
1490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr ret;
1492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incNr <= 0)
1494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->incNr--;
1496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incNr > 0)
1497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->inc = ctxt->incTab[ctxt->incNr - 1];
1498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->inc = NULL;
1500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ctxt->incTab[ctxt->incNr];
1501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->incTab[ctxt->incNr] = NULL;
1502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGRemoveRedefine:
1507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the normalized URL
1509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @target:  the included target
1510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the define name to eliminate
1511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the elimination algorithm of 4.7
1513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, 1 in case of success.
1515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGRemoveRedefine(xmlRelaxNGParserCtxtPtr ctxt,
1518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * URL ATTRIBUTE_UNUSED,
1519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlNodePtr target, const xmlChar * name)
1520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int found = 0;
1522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr tmp, tmp2;
1523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name2;
1524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL)
1527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
1528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Elimination of <include> start from %s\n", URL);
1529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
1531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Elimination of <include> define %s from %s\n",
1532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        name, URL);
1533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = target;
1535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (tmp != NULL) {
1536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp2 = tmp->next;
1537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((name == NULL) && (IS_RELAXNG(tmp, "start"))) {
1538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            found = 1;
1539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlUnlinkNode(tmp);
1540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFreeNode(tmp);
1541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((name != NULL) && (IS_RELAXNG(tmp, "define"))) {
1542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            name2 = xmlGetProp(tmp, BAD_CAST "name");
1543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGNormExtSpace(name2);
1544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (name2 != NULL) {
1545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual(name, name2)) {
1546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    found = 1;
1547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlUnlinkNode(tmp);
1548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFreeNode(tmp);
1549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
1550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(name2);
1551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_RELAXNG(tmp, "include")) {
1553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlChar *href = NULL;
1554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDocumentPtr inc = tmp->psvi;
1555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((inc != NULL) && (inc->doc != NULL) &&
1557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (inc->doc->children != NULL)) {
1558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual
1560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (inc->doc->children->name, BAD_CAST "grammar")) {
1561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    href = xmlGetProp(tmp, BAD_CAST "href");
1563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (xmlRelaxNGRemoveRedefine(ctxt, href,
1565df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 xmlDocGetRootElement(inc->doc)->children,
1566df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 name) == 1) {
1567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        found = 1;
1568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
1569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href != NULL)
1571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(href);
1572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
1574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = tmp2;
1577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (found);
1579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLoadInclude:
1583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the normalized URL
1585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node: the include node.
1586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the namespace passed from the context.
1587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First lookup if the document is already loaded into the parser context,
1589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion. If not found the resource is loaded and
1590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content is preprocessed before being returned back to the caller.
1591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGIncludePtr or NULL in case of error
1593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGIncludePtr
1595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLoadInclude(xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * URL,
1596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlNodePtr node, const xmlChar * ns)
1597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr ret = NULL;
1599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
1600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root, cur;
1602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
1605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlRelaxNGLoadInclude(%s)\n", URL);
1606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * check against recursion in the stack
1610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->incNr; i++) {
1612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlStrEqual(ctxt->incTab[i]->href, URL)) {
1613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, NULL, XML_RNGP_INCLUDE_RECURSE,
1614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Detected an Include recursion for %s\n", URL,
1615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
1616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * load the document
1622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlReadFile((const char *) URL,NULL,0);
1624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
1625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_PARSE_ERROR,
1626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: could not load %s\n", URL, NULL);
1627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Parsed %s Okay\n", URL);
1631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Allocate the document structures and register it first.
1635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGIncludePtr) xmlMalloc(sizeof(xmlRelaxNGInclude));
1637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
1638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "allocating include\n");
1639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(doc);
1640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGInclude));
1643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
1644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->href = xmlStrdup(URL);
1645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = ctxt->includes;
1646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->includes = ret;
1647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * transmit the ns if needed
1650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
1652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        root = xmlDocGetRootElement(doc);
1653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (root != NULL) {
1654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlHasProp(root, BAD_CAST "ns") == NULL) {
1655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlSetProp(root, BAD_CAST "ns", ns);
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    /*
1661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * push it on the stack
1662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePush(ctxt, ret);
1664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Some preprocessing of the document content, this include recursing
1667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * in the include stack.
1668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "cleanup of %s\n", URL);
1671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlRelaxNGCleanupDoc(ctxt, doc);
1674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
1675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->inc = NULL;
1676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Pop up the include from the stack
1681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePop(ctxt);
1683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INCLUDE
1685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Checking of %s\n", URL);
1686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check that the top element is a grammar
1689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = xmlDocGetRootElement(doc);
1691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root == NULL) {
1692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EMPTY,
1693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: included document is empty %s\n", URL,
1694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
1695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!IS_RELAXNG(root, "grammar")) {
1698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING,
1699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: included document %s root is not a grammar\n",
1700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   URL, NULL);
1701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Elimination of redefined rules in the include.
1706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = node->children;
1708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
1709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_RELAXNG(cur, "start")) {
1710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int found = 0;
1711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            found =
1713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGRemoveRedefine(ctxt, URL, root->children, NULL);
1714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (!found) {
1715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_START_MISSING,
1716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "xmlRelaxNG: include %s has a start but not the included grammar\n",
1717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           URL, NULL);
1718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_RELAXNG(cur, "define")) {
1720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlChar *name;
1721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            name = xmlGetProp(cur, BAD_CAST "name");
1723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (name == NULL) {
1724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_NAME_MISSING,
1725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "xmlRelaxNG: include %s has define without name\n",
1726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           URL, NULL);
1727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
1728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int found;
1729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGNormExtSpace(name);
1731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                found = xmlRelaxNGRemoveRedefine(ctxt, URL,
1732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 root->children, name);
1733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (!found) {
1734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_MISSING,
1735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "xmlRelaxNG: include %s has a define %s but not the included grammar\n",
1736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               URL, name);
1737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
1738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(name);
1739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
1740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
1742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidErrorPush:
1750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
1751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error code
1752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first string argument
1753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second string argument
1754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dup:  arg need to be duplicated
1755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new error on top of the error stack
1757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise
1759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidErrorPush(xmlRelaxNGValidCtxtPtr ctxt,
1762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidErr err, const xmlChar * arg1,
1763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * arg2, int dup)
1764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr cur;
1766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
1768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
1769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Pushing error %d at %d on stack\n", err, ctxt->errNr);
1770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
1771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errTab == NULL) {
1772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errMax = 8;
1773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errNr = 0;
1774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errTab =
1775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGValidErrorPtr) xmlMalloc(ctxt->errMax *
1776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                sizeof
1777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                (xmlRelaxNGValidError));
1778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errTab == NULL) {
1779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "pushing error\n");
1780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = NULL;
1783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNr >= ctxt->errMax) {
1785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errMax *= 2;
1786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errTab =
1787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGValidErrorPtr) xmlRealloc(ctxt->errTab,
1788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->errMax *
1789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 sizeof
1790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 (xmlRelaxNGValidError));
1791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errTab == NULL) {
1792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "pushing error\n");
1793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = &ctxt->errTab[ctxt->errNr - 1];
1796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->err != NULL) && (ctxt->state != NULL) &&
1798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->err->node == ctxt->state->node) && (ctxt->err->err == err))
1799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ctxt->errNr);
1800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = &ctxt->errTab[ctxt->errNr];
1801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->err = err;
1802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (dup) {
1803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg1 = xmlStrdup(arg1);
1804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg2 = xmlStrdup(arg2);
1805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->flags = ERROR_IS_DUP;
1806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg1 = arg1;
1808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg2 = arg2;
1809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->flags = 0;
1810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL) {
1812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->node = ctxt->state->node;
1813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->seq = ctxt->state->seq;
1814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
1815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->node = NULL;
1816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->seq = NULL;
1817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->err = cur;
1819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt->errNr++);
1820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidErrorPop:
1824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the validation context
1825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top error from the error stack
1827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
1829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidErrorPop(xmlRelaxNGValidCtxtPtr ctxt)
1830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr cur;
1832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNr <= 0) {
1834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = NULL;
1835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
1836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNr--;
1838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNr > 0)
1839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = &ctxt->errTab[ctxt->errNr - 1];
1840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = NULL;
1842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = &ctxt->errTab[ctxt->errNr];
1843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur->flags & ERROR_IS_DUP) {
1844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->arg1 != NULL)
1845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree((xmlChar *) cur->arg1);
1846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg1 = NULL;
1847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->arg2 != NULL)
1848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree((xmlChar *) cur->arg2);
1849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->arg2 = NULL;
1850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->flags = 0;
1851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocumentPush:
1856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the parser context
1857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the element doc
1858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pushes a new doc on top of the doc stack
1860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of error, the index in the stack otherwise
1862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
1864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDocumentPush(xmlRelaxNGParserCtxtPtr ctxt,
1865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlRelaxNGDocumentPtr value)
1866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docTab == NULL) {
1868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docMax = 4;
1869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docNr = 0;
1870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docTab =
1871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGDocumentPtr *) xmlMalloc(ctxt->docMax *
1872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                sizeof(ctxt->docTab[0]));
1873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->docTab == NULL) {
1874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "adding document\n");
1875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docNr >= ctxt->docMax) {
1879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docMax *= 2;
1880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->docTab =
1881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlRelaxNGDocumentPtr *) xmlRealloc(ctxt->docTab,
1882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->docMax *
1883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 sizeof(ctxt->docTab[0]));
1884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->docTab == NULL) {
1885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErrMemory(ctxt, "adding document\n");
1886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
1887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->docTab[ctxt->docNr] = value;
1890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->doc = value;
1891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ctxt->docNr++);
1892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDocumentPop:
1896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pops the top doc from the doc stack
1899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the doc just removed
1901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDocumentPtr
1903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDocumentPop(xmlRelaxNGParserCtxtPtr ctxt)
1904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr ret;
1906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docNr <= 0)
1908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->docNr--;
1910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docNr > 0)
1911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->doc = ctxt->docTab[ctxt->docNr - 1];
1912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
1913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->doc = NULL;
1914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ctxt->docTab[ctxt->docNr];
1915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->docTab[ctxt->docNr] = NULL;
1916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
1917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
1918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
1920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLoadExternalRef:
1921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
1922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the normalized URL
1923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the inherited ns if any
1924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * First lookup if the document is already loaded into the parser context,
1926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check against recursion. If not found the resource is loaded and
1927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the content is preprocessed before being returned back to the caller.
1928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
1929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGDocumentPtr or NULL in case of error
1930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
1931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDocumentPtr
1932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLoadExternalRef(xmlRelaxNGParserCtxtPtr ctxt,
1933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * URL, const xmlChar * ns)
1934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
1935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr ret = NULL;
1936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
1937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root;
1938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
1939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * check against recursion in the stack
1942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->docNr; i++) {
1944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlStrEqual(ctxt->docTab[i]->href, URL)) {
1945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, NULL, XML_RNGP_EXTERNALREF_RECURSE,
1946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Detected an externalRef recursion for %s\n", URL,
1947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
1948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
1949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
1950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * load the document
1954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlReadFile((const char *) URL,NULL,0);
1956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
1957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR,
1958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: could not load %s\n", URL, NULL);
1959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Allocate the document structures and register it first.
1964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGDocumentPtr) xmlMalloc(sizeof(xmlRelaxNGDocument));
1966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
1967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_ERR_NO_MEMORY,
1968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNG: allocate memory for doc %s\n", URL, NULL);
1969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(doc);
1970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
1971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
1972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGDocument));
1973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
1974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->href = xmlStrdup(URL);
1975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->next = ctxt->documents;
1976df143a5041f03a22808b59c76698770b74692815Selim Gurun    ret->externalRef = 1;
1977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->documents = ret;
1978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * transmit the ns if needed
1981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ns != NULL) {
1983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        root = xmlDocGetRootElement(doc);
1984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (root != NULL) {
1985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlHasProp(root, BAD_CAST "ns") == NULL) {
1986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlSetProp(root, BAD_CAST "ns", ns);
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    /*
1992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * push it on the stack and register it in the hash table
1993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPush(ctxt, ret);
1995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
1996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
1997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Some preprocessing of the document content
1998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
1999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlRelaxNGCleanupDoc(ctxt, doc);
2000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
2001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->doc = NULL;
2002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
2003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPop(ctxt);
2006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
2008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
201194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
201294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Error functions					*
201394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR(a) xmlRelaxNGAddValidError(ctxt, a, NULL, NULL, 0);
2017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR2(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 0);
2018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR3(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 0);
2019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR2P(a, b) xmlRelaxNGAddValidError(ctxt, a, b, NULL, 1);
2020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define VALID_ERR3P(a, b, c) xmlRelaxNGAddValidError(ctxt, a, b, c, 1);
2021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const char *
2023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefName(xmlRelaxNGDefinePtr def)
2024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL)
2026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return ("none");
2027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (def->type) {
2028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
2029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("empty");
2030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
2031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("notAllowed");
2032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
2033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("except");
2034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
2035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("text");
2036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
2037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("element");
2038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
2039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("datatype");
2040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
2041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("value");
2042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
2043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("list");
2044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
2045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("attribute");
2046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
2047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("def");
2048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
2049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("ref");
2050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
2051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("externalRef");
2052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
2053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("parentRef");
2054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:
2055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("optional");
2056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:
2057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("zeroOrMore");
2058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
2059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("oneOrMore");
2060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:
2061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("choice");
2062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
2063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("group");
2064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
2065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("interleave");
2066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
2067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("start");
2068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
2069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("noop");
2070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
2071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return ("param");
2072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return ("unknown");
2074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetErrorString:
2078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error code
2079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first string argument
2080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second string argument
2081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * computes a formatted error string for the given error code and args
2083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the error string, it must be deallocated by the caller
2085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
2087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetErrorString(xmlRelaxNGValidErr err, const xmlChar * arg1,
2088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * arg2)
2089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    char msg[1000];
2091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg1 == NULL)
2093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        arg1 = BAD_CAST "";
2094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (arg2 == NULL)
2095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        arg2 = BAD_CAST "";
2096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg[0] = 0;
2098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (err) {
2099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OK:
2100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
2101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_MEMORY:
2102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("out of memory\n"));
2103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_TYPE:
2104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "failed to validate type %s\n", arg1);
2105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_TYPEVAL:
2107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Type %s doesn't allow value '%s'\n", arg1,
2108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg2);
2109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_DUPID:
2111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "ID %s redefined\n", arg1);
2112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_TYPECMP:
2114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "failed to compare type %s\n", arg1);
2115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NOSTATE:
2117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Internal error: no state\n"));
2118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NODEFINE:
2119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Internal error: no define\n"));
2120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INTERNAL:
2121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Internal error: %s\n", arg1);
2122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_LISTEXTRA:
2124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Extra data in list: %s\n", arg1);
2125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INTERNODATA:
2127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup
2128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ("Internal: interleave block has no data\n"));
2129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INTERSEQ:
2130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Invalid sequence in interleave\n"));
2131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INTEREXTRA:
2132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Extra element %s in interleave\n", arg1);
2133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMNAME:
2135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting element %s, got %s\n", arg1,
2136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg2);
2137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMNONS:
2139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting a namespace for element %s\n",
2140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMWRONGNS:
2143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000,
2144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     "Element %s has wrong namespace: expecting %s\n", arg1,
2145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg2);
2146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMWRONG:
2148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Did not expect element %s there\n", arg1);
2149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_TEXTWRONG:
2151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000,
2152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     "Did not expect text in element %s content\n", arg1);
2153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMEXTRANS:
2155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting no namespace for element %s\n",
2156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ELEMNOTEMPTY:
2159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting element %s to be empty\n", arg1);
2160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NOELEM:
2162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Expecting an element %s, got nothing\n",
2163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NOTELEM:
2166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Expecting an element got text\n"));
2167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_ATTRVALID:
2168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Element %s failed to validate attributes\n",
2169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_CONTENTVALID:
2172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Element %s failed to validate content\n",
2173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_EXTRACONTENT:
2176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Element %s has extra content: %s\n",
2177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1, arg2);
2178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_INVALIDATTR:
2180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Invalid attribute %s for element %s\n",
2181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1, arg2);
2182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_LACKDATA:
2184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Datatype element %s contains no data\n",
2185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_DATAELEM:
2188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Datatype element %s has child elements\n",
2189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_VALELEM:
2192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Value element %s has child elements\n",
2193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_LISTELEM:
2196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "List element %s has child elements\n",
2197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     arg1);
2198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_DATATYPE:
2200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Error validating datatype %s\n", arg1);
2201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_VALUE:
2203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(msg, 1000, "Error validating value %s\n", arg1);
2204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_LIST:
2206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Error validating list\n"));
2207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_NOGRAMMAR:
2208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("No top grammar defined\n"));
2209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ERR_EXTRADATA:
2210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Extra data in the document\n"));
2211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
2212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (xmlCharStrdup("Unknown error !\n"));
2213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (msg[0] == 0) {
2215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        snprintf(msg, 1000, "Unknown error code %d\n", err);
2216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg[1000 - 1] = 0;
2218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (xmlStrdup((xmlChar *) msg));
2219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGShowValidError:
2223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
2224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error number
2225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
2226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @child:  the node child generating the problem.
2227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first argument
2228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second argument
2229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Show a validation error.
2231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGShowValidError(xmlRelaxNGValidCtxtPtr ctxt,
2234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidErr err, xmlNodePtr node,
2235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlNodePtr child, const xmlChar * arg1,
2236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * arg2)
2237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *msg;
2239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->flags & FLAGS_NOERROR)
2241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
2244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Show error %d\n", err);
2245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    msg = xmlRelaxNGGetErrorString(err, arg1, arg2);
2247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (msg == NULL)
2248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNo == XML_RELAXNG_OK)
2251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->errNo = err;
2252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRngVErr(ctxt, (child == NULL ? node : child), err,
2253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (const char *) msg, arg1, arg2);
2254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(msg);
2255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGPopErrors:
2259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
2260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @level:  the error level in the stack
2261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * pop and discard all errors until the given level is reached
2263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGPopErrors(xmlRelaxNGValidCtxtPtr ctxt, int level)
2266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
2268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr err;
2269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
2271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
2272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Pop errors till level %d\n", level);
2273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = level; i < ctxt->errNr; i++) {
2275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        err = &ctxt->errTab[i];
2276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (err->flags & ERROR_IS_DUP) {
2277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (err->arg1 != NULL)
2278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree((xmlChar *) err->arg1);
2279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->arg1 = NULL;
2280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (err->arg2 != NULL)
2281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree((xmlChar *) err->arg2);
2282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->arg2 = NULL;
2283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->flags = 0;
2284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNr = level;
2287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errNr <= 0)
2288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->err = NULL;
2289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpValidError:
2293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
2294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Show all validation error over a given index.
2296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpValidError(xmlRelaxNGValidCtxtPtr ctxt)
2299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, k;
2301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidErrorPtr err, dup;
2302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
2304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
2305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Dumping error stack %d errors\n", ctxt->errNr);
2306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0, k = 0; i < ctxt->errNr; i++) {
2308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        err = &ctxt->errTab[i];
2309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (k < MAX_ERROR) {
2310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (j = 0; j < i; j++) {
2311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                dup = &ctxt->errTab[j];
2312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((err->err == dup->err) && (err->node == dup->node) &&
2313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlStrEqual(err->arg1, dup->arg1)) &&
2314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlStrEqual(err->arg2, dup->arg2))) {
2315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto skip;
2316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGShowValidError(ctxt, err->err, err->node, err->seq,
2319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     err->arg1, err->arg2);
2320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            k++;
2321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      skip:
2323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (err->flags & ERROR_IS_DUP) {
2324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (err->arg1 != NULL)
2325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree((xmlChar *) err->arg1);
2326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->arg1 = NULL;
2327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (err->arg2 != NULL)
2328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree((xmlChar *) err->arg2);
2329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->arg2 = NULL;
2330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            err->flags = 0;
2331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNr = 0;
2334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAddValidError:
2338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
2339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error number
2340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg1:  the first argument
2341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @arg2:  the second argument
2342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dup:  need to dup the args
2343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a validation error, either generating it if it's sure
2345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or stacking it for later handling if unsure.
2346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAddValidError(xmlRelaxNGValidCtxtPtr ctxt,
2349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGValidErr err, const xmlChar * arg1,
2350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        const xmlChar * arg2, int dup)
2351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
2353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->flags & FLAGS_NOERROR)
2355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_ERROR
2358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Adding error %d\n", err);
2359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * generate the error directly
2362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (((ctxt->flags & FLAGS_IGNORABLE) == 0) ||
236494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun	 (ctxt->flags & FLAGS_NEGATIVE)) {
2365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr node, seq;
2366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
2368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Flush first any stacked error which might be the
2369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * real cause of the problem.
2370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
2371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errNr != 0)
2372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpValidError(ctxt);
2373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->state != NULL) {
2374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = ctxt->state->node;
2375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            seq = ctxt->state->seq;
2376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
2377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = seq = NULL;
2378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
2379df143a5041f03a22808b59c76698770b74692815Selim Gurun        if ((node == NULL) && (seq == NULL)) {
2380df143a5041f03a22808b59c76698770b74692815Selim Gurun            node = ctxt->pnode;
2381df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
2382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGShowValidError(ctxt, err, node, seq, arg1, arg2);
2383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
2385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Stack the error for later processing if needed
2386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
2387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else {
2388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGValidErrorPush(ctxt, err, arg1, arg2, dup);
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/************************************************************************
239494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
239594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Type library hooks				*
239694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *xmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt,
2399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    const xmlChar * str);
2400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeHave:
2403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type is provided by
2407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the W3C XMLSchema Datatype library.
2408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeHave(void *data ATTRIBUTE_UNUSED, const xmlChar * type)
2413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typ;
2415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
2417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    typ = xmlSchemaGetPredefinedType(type,
2419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     BAD_CAST
2420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     "http://www.w3.org/2001/XMLSchema");
2421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typ == NULL)
2422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
2423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
2424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeCheck:
2428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
2431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
2432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type and value are validated by
2434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the W3C XMLSchema Datatype library.
2435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeCheck(void *data ATTRIBUTE_UNUSED,
2440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * type,
2441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * value,
2442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          void **result, xmlNodePtr node)
2443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typ;
2445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == NULL) || (value == NULL))
2448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    typ = xmlSchemaGetPredefinedType(type,
2450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     BAD_CAST
2451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     "http://www.w3.org/2001/XMLSchema");
2452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typ == NULL)
2453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValPredefTypeNode(typ, value,
2455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     (xmlSchemaValPtr *) result, node);
2456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 2)               /* special ID error code */
2457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (2);
2458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
2459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret > 0)
2461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
2462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (-1);
2463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaFacetCheck:
2467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @facet:  the facet name
2470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @val:  the facet value
2471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @strval:  the string value
2472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
2473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to check a value facet
2475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaFacetCheck(void *data ATTRIBUTE_UNUSED,
2480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * type, const xmlChar * facetname,
2481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * val, const xmlChar * strval,
2482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           void *value)
2483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFacetPtr facet;
2485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typ;
2486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == NULL) || (strval == NULL))
2489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    typ = xmlSchemaGetPredefinedType(type,
2491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     BAD_CAST
2492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     "http://www.w3.org/2001/XMLSchema");
2493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typ == NULL)
2494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet = xmlSchemaNewFacet();
2497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (facet == NULL)
2498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(facetname, BAD_CAST "minInclusive")) {
2501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MININCLUSIVE;
2502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "minExclusive")) {
2503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MINEXCLUSIVE;
2504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "maxInclusive")) {
2505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXINCLUSIVE;
2506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "maxExclusive")) {
2507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXEXCLUSIVE;
2508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "totalDigits")) {
2509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_TOTALDIGITS;
2510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "fractionDigits")) {
2511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_FRACTIONDIGITS;
2512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "pattern")) {
2513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_PATTERN;
2514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "enumeration")) {
2515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_ENUMERATION;
2516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "whiteSpace")) {
2517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_WHITESPACE;
2518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "length")) {
2519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_LENGTH;
2520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "maxLength")) {
2521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MAXLENGTH;
2522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(facetname, BAD_CAST "minLength")) {
2523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        facet->type = XML_SCHEMA_FACET_MINLENGTH;
2524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeFacet(facet);
2526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    facet->value = val;
2529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCheckFacet(facet, typ, NULL, type);
2530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
2531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeFacet(facet);
2532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValidateFacet(typ, facet, strval, value);
2535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeFacet(facet);
2536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
2537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaFreeValue:
2543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to free
2545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Function provided by a type library to free a Schemas value
2547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaFreeValue(void *data ATTRIBUTE_UNUSED, void *value)
2552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeValue(value);
2554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSchemaTypeCompare:
2558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1:  the first value
2561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2:  the second value
2562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two values for equality accordingly a type from the W3C XMLSchema
2564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Datatype library.
2565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if equal, 0 if no and -1 in case of error.
2567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSchemaTypeCompare(void *data ATTRIBUTE_UNUSED,
2570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            const xmlChar * type,
2571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            const xmlChar * value1,
2572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlNodePtr ctxt1,
2573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            void *comp1,
2574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            const xmlChar * value2, xmlNodePtr ctxt2)
2575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaTypePtr typ;
2578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaValPtr res1 = NULL, res2 = NULL;
2579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((type == NULL) || (value1 == NULL) || (value2 == NULL))
2581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    typ = xmlSchemaGetPredefinedType(type,
2583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     BAD_CAST
2584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     "http://www.w3.org/2001/XMLSchema");
2585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (typ == NULL)
2586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (comp1 == NULL) {
2588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlSchemaValPredefTypeNode(typ, value1, &res1, ctxt1);
2589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0)
2590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
2591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (res1 == NULL)
2592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
2593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
2594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        res1 = (xmlSchemaValPtr) comp1;
2595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaValPredefTypeNode(typ, value2, &res2, ctxt2);
2597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
2598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	if ((comp1 == NULL) && (res1 != NULL))
2599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlSchemaFreeValue(res1);
2600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res1 == NULL) {
2603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlSchemaCompareValues(res1, res2);
2606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res1 != (xmlSchemaValPtr) comp1)
2607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlSchemaFreeValue(res1);
2608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaFreeValue(res2);
2609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -2)
2610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
2612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeHave:
2618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type is provided by
2622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the default datatype library.
2623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeHave(void *data ATTRIBUTE_UNUSED,
2628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * type)
2629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL)
2631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "string"))
2633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "token"))
2635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeCheck:
2641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the value to check
2644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
2645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the given type and value are validated by
2647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * the default datatype library.
2648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeCheck(void *data ATTRIBUTE_UNUSED,
2653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * type ATTRIBUTE_UNUSED,
2654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * value ATTRIBUTE_UNUSED,
2655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           void **result ATTRIBUTE_UNUSED,
2656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlNodePtr node ATTRIBUTE_UNUSED)
2657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
2659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "string"))
2661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "token")) {
2663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDefaultTypeCompare:
2671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data needed for the library
2672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the type name
2673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value1:  the first value
2674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value2:  the second value
2675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare two values accordingly a type from the default
2677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * datatype library.
2678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
2680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDefaultTypeCompare(void *data ATTRIBUTE_UNUSED,
2683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             const xmlChar * type,
2684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             const xmlChar * value1,
2685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlNodePtr ctxt1 ATTRIBUTE_UNUSED,
2686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             void *comp1 ATTRIBUTE_UNUSED,
2687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             const xmlChar * value2,
2688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlNodePtr ctxt2 ATTRIBUTE_UNUSED)
2689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = -1;
2691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlStrEqual(type, BAD_CAST "string")) {
2693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlStrEqual(value1, value2);
2694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (xmlStrEqual(type, BAD_CAST "token")) {
2695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlStrEqual(value1, value2)) {
2696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlChar *nval, *nvalue;
2697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
2699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * TODO: trivial optimizations are possible by
2700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * computing at compile-time
2701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
2702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nval = xmlRelaxNGNormalize(NULL, value1);
2703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nvalue = xmlRelaxNGNormalize(NULL, value2);
2704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((nval == NULL) || (nvalue == NULL))
2706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
2707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (xmlStrEqual(nval, nvalue))
2708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 1;
2709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
2710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
2711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nval != NULL)
2712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(nval);
2713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nvalue != NULL)
2714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(nvalue);
2715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else
2716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
2717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
2719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGTypeInitialized = 0;
2722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlHashTablePtr xmlRelaxNGRegisteredTypes = NULL;
2723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeTypeLibrary:
2726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @lib:  the type library structure
2727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the URI bound to the library
2728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the structure associated to the type library
2730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
2732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeTypeLibrary(xmlRelaxNGTypeLibraryPtr lib,
2733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          const xmlChar * namespace ATTRIBUTE_UNUSED)
2734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib == NULL)
2736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib->namespace != NULL)
2738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree((xmlChar *) lib->namespace);
2739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(lib);
2740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGRegisterTypeLibrary:
2744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @namespace:  the URI bound to the library
2745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  data associated to the library
2746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @have:  the provide function
2747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @check:  the checking function
2748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @comp:  the comparison function
2749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Register a new type library
2751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error.
2753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGRegisterTypeLibrary(const xmlChar * namespace, void *data,
2756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGTypeHave have,
2757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGTypeCheck check,
2758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGTypeCompare comp,
2759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGFacetCheck facet,
2760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGTypeFree freef)
2761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeLibraryPtr lib;
2763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
2764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((xmlRelaxNGRegisteredTypes == NULL) || (namespace == NULL) ||
2766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (check == NULL) || (comp == NULL))
2767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlHashLookup(xmlRelaxNGRegisteredTypes, namespace) != NULL) {
2769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
2770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Relax-NG types library '%s' already registered\n",
2771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        namespace);
2772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib =
2775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (xmlRelaxNGTypeLibraryPtr)
2776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlMalloc(sizeof(xmlRelaxNGTypeLibrary));
2777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib == NULL) {
2778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(NULL, "adding types library\n");
2779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(lib, 0, sizeof(xmlRelaxNGTypeLibrary));
2782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->namespace = xmlStrdup(namespace);
2783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->data = data;
2784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->have = have;
2785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->comp = comp;
2786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->check = check;
2787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->facet = facet;
2788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib->freef = freef;
2789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlHashAddEntry(xmlRelaxNGRegisteredTypes, namespace, lib);
2790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
2791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
2792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Relax-NG types library failed to register '%s'\n",
2793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        namespace);
2794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeTypeLibrary(lib, namespace);
2795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGInitTypes:
2802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Initilize the default type libraries.
2804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error.
2806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
2808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGInitTypes(void)
2809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlRelaxNGTypeInitialized != 0)
2811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
2812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGRegisteredTypes = xmlHashCreate(10);
2813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlRelaxNGRegisteredTypes == NULL) {
2814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
2815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Failed to allocate sh table for Relax-NG types\n");
2816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGRegisterTypeLibrary(BAD_CAST
2819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  "http://www.w3.org/2001/XMLSchema-datatypes",
2820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  NULL, xmlRelaxNGSchemaTypeHave,
2821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGSchemaTypeCheck,
2822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGSchemaTypeCompare,
2823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGSchemaFacetCheck,
2824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGSchemaFreeValue);
2825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGRegisterTypeLibrary(xmlRelaxNGNs, NULL,
2826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGDefaultTypeHave,
2827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGDefaultTypeCheck,
2828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGDefaultTypeCompare, NULL,
2829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  NULL);
2830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeInitialized = 1;
2831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
2832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupTypes:
2836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the default Schemas type library associated to RelaxNG
2838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
2840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupTypes(void)
2841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlSchemaCleanupTypes();
2843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlRelaxNGTypeInitialized == 0)
2844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
2845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashFree(xmlRelaxNGRegisteredTypes, (xmlHashDeallocator)
2846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeTypeLibrary);
2847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeInitialized = 0;
2848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
2849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
285194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
285294442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Compiling element content into regexp			*
285394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Sometime the element content can be compiled into a pure regexp,	*
2855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This allows a faster execution and streamability at that level	*
285694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
2857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
2858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2859df143a5041f03a22808b59c76698770b74692815Selim Gurun/* from automata.c but not exported */
2860df143a5041f03a22808b59c76698770b74692815Selim Gurunvoid xmlAutomataSetFlags(xmlAutomataPtr am, int flags);
2861df143a5041f03a22808b59c76698770b74692815Selim Gurun
2862df143a5041f03a22808b59c76698770b74692815Selim Gurun
2863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt,
2864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGDefinePtr def);
2865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
2867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsCompileable:
2868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to check
2869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a definition is nullable.
2871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
2872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error
2873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
2874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
2875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsCompileable(xmlRelaxNGDefinePtr def)
2876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
2877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = -1;
2878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL) {
2880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
2881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def->type != XML_RELAXNG_ELEMENT) &&
2883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def->dflags & IS_COMPILABLE))
2884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
2885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def->type != XML_RELAXNG_ELEMENT) &&
2886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def->dflags & IS_NOT_COMPILABLE))
2887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
2888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (def->type) {
2889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
2890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGIsCompileable(def->content);
2891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
2893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
2894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
2895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
2897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
2898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Check if the element content is compileable
2899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
2900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (((def->dflags & IS_NOT_COMPILABLE) == 0) &&
2901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ((def->dflags & IS_COMPILABLE) == 0)) {
2902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
2903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
2905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
2906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsCompileable(list);
2907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 1)
2908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
2909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
2910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		/*
2912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * Because the routine is recursive, we must guard against
2913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 * discovering both COMPILABLE and NOT_COMPILABLE
2914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		 */
2915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 0) {
2916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    def->dflags &= ~IS_COMPILABLE;
2917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->dflags |= IS_NOT_COMPILABLE;
2918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
2919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ret == 1) && !(def->dflags &= IS_NOT_COMPILABLE))
2920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->dflags |= IS_COMPILABLE;
2921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE
2922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 1) {
2923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
2924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "element content for %s is compilable\n",
2925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    def->name);
2926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (ret == 0) {
2927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
2928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "element content for %s is not compilable\n",
2929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    def->name);
2930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
2931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
2932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "Problem in RelaxNGIsCompileable for element %s\n",
2933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    def->name);
2934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
2936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
2938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * All elements return a compileable status unless they
2939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * are generic like anyName
2940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
2941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((def->nameClass != NULL) || (def->name == NULL))
2942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
2943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
2944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 1;
2945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (ret);
2946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
2947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
2948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
2949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def->depth == -20) {
2950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
2951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
2952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
2953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->depth = -20;
2955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
2956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
2957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsCompileable(list);
2958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 1)
2959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
2960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
2961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
2965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:
2966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:
2967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
2968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:
2969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
2970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:{
2971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
2972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
2973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
2974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
2975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsCompileable(list);
2976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 1)
2977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
2978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
2979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
2980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
2981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
2982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
2983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
2984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
2985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
2986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
2987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
2988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
2989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
2990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
2991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
2992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
2993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
2994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_NOT_COMPILABLE;
2995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 1)
2996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_COMPILABLE;
2997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE
2998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 1) {
2999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
3000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "RelaxNGIsCompileable %s : true\n",
3001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefName(def));
3002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret == 0) {
3003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
3004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "RelaxNGIsCompileable %s : false\n",
3005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefName(def));
3006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
3008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Problem in RelaxNGIsCompileable %s\n",
3009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefName(def));
3010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompile:
3017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt:  the RelaxNG parser context
3018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition tree to compile
3019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compile the set of definitions, it works recursively, till the
3021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element boundaries, where it tries to compile the content if possible
3022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error
3024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def)
3027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
3029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr list;
3030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (def == NULL))
3032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
3033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (def->type) {
3035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
3036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((xmlRelaxNGIsCompileable(def) == 1) && (def->depth != -25)) {
3037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataPtr oldam = ctxt->am;
3038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate = ctxt->state;
3039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->depth = -25;
3041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = xmlNewAutomata();
3044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->am == NULL)
3045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (-1);
3046df143a5041f03a22808b59c76698770b74692815Selim Gurun
3047df143a5041f03a22808b59c76698770b74692815Selim Gurun                /*
3048df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * assume identical strings but not same pointer are different
3049df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * atoms, needed for non-determinism detection
3050df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * That way if 2 elements with the same name are in a choice
3051df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * branch the automata is found non-deterministic and
3052df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * we fallback to the normal validation which does the right
3053df143a5041f03a22808b59c76698770b74692815Selim Gurun                 * thing of exploring both choices.
3054df143a5041f03a22808b59c76698770b74692815Selim Gurun                 */
3055df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataSetFlags(ctxt->am, 1);
3056df143a5041f03a22808b59c76698770b74692815Selim Gurun
3057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = xmlAutomataGetInitState(ctxt->am);
3058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataSetFinalState(ctxt->am, ctxt->state);
306394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                if (xmlAutomataIsDeterminist(ctxt->am))
306494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun                    def->contModel = xmlAutomataCompile(ctxt->am);
3065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFreeAutomata(ctxt->am);
3067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = oldstate;
3068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = oldam;
3069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
3072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->am != NULL) && (def->name != NULL)) {
3073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = xmlAutomataNewTransition2(ctxt->am,
3074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        ctxt->state, NULL,
3075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        def->name, def->ns,
3076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        def);
3077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
3079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataPtr oldam = ctxt->am;
3080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate = ctxt->state;
3081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->depth = -25;
3083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = xmlNewAutomata();
3086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->am == NULL)
3087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (-1);
3088df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlAutomataSetFlags(ctxt->am, 1);
3089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = xmlAutomataGetInitState(ctxt->am);
3090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataSetFinalState(ctxt->am, ctxt->state);
3095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->contModel = xmlAutomataCompile(ctxt->am);
3096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (!xmlRegexpIsDeterminist(def->contModel)) {
3097df143a5041f03a22808b59c76698770b74692815Selim Gurun#ifdef DEBUG_COMPILE
3098df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlGenericError(xmlGenericErrorContext,
3099df143a5041f03a22808b59c76698770b74692815Selim Gurun                        "Content model not determinist %s\n",
3100df143a5041f03a22808b59c76698770b74692815Selim Gurun                                    def->name);
3101df143a5041f03a22808b59c76698770b74692815Selim Gurun#endif
3102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
3103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * we can only use the automata if it is determinist
3104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
3105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRegFreeRegexp(def->contModel);
3106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->contModel = NULL;
3107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFreeAutomata(ctxt->am);
3109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = oldstate;
3110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = oldam;
3111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataPtr oldam = ctxt->am;
3113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
3115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * we can't build the content model for this element content
3116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * but it still might be possible to build it for some of its
3117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * children, recurse.
3118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
3119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGTryCompile(ctxt, def);
3120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->am = oldam;
3121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
3124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompile(ctxt, def->content);
3125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:{
3127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate = ctxt->state;
3128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3129df143a5041f03a22808b59c76698770b74692815Selim Gurun                list = def->content;
3130df143a5041f03a22808b59c76698770b74692815Selim Gurun                while (list != NULL) {
3131df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlRelaxNGCompile(ctxt, list);
3132df143a5041f03a22808b59c76698770b74692815Selim Gurun                    list = list->next;
3133df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
3134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewEpsilon(ctxt->am, oldstate, ctxt->state);
3135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:{
3138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate;
3139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
3142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate = ctxt->state;
3143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate);
3149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL);
3151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:{
3154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate;
3155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate = ctxt->state;
3162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGCompile(ctxt, list);
3165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewEpsilon(ctxt->am, ctxt->state, oldstate);
3168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL);
3170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:{
3173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr target = NULL;
3174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate = ctxt->state;
3175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = def->content;
3177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = oldstate;
3179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGCompile(ctxt, list);
3180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0)
3181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
3182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (target == NULL)
3183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        target = ctxt->state;
3184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else {
3185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlAutomataNewEpsilon(ctxt->am, ctxt->state,
3186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                              target);
3187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
3188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = target;
3191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
3195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
3196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
3197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
3198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
3199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = def->content;
3200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (list != NULL) {
3201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCompile(ctxt, list);
3202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0)
3203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
3204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = list->next;
3205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:{
3208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataStatePtr oldstate;
3209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
3212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate = ctxt->state;
3213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCompile(ctxt, def->content);
3214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewTransition(ctxt->am, ctxt->state,
3215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         ctxt->state, BAD_CAST "#text",
3216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         NULL);
3217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state =
3218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlAutomataNewEpsilon(ctxt->am, oldstate, NULL);
3219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
3222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state =
3223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlAutomataNewEpsilon(ctxt->am, ctxt->state, NULL);
3224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
3226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
3227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
3228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
3229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
3230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
3231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
3232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
3233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* This should not happen and generate an internal error */
3234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(stderr, "RNG internal error trying to compile %s\n",
3235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDefName(def));
3236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTryCompile:
3243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * ctxt:  the RelaxNG parser context
3244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition tree to compile
3245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to compile the set of definitions, it works recursively,
3247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * possibly ignoring parts which cannot be compiled.
3248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if success and -1 in case of error
3250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGTryCompile(xmlRelaxNGParserCtxtPtr ctxt, xmlRelaxNGDefinePtr def)
3253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
3255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr list;
3256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (def == NULL))
3258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
3259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def->type == XML_RELAXNG_START) ||
3261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def->type == XML_RELAXNG_ELEMENT)) {
3262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGIsCompileable(def);
3263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((def->dflags & IS_COMPILABLE) && (def->depth != -25)) {
3264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->am = NULL;
3265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompile(ctxt, def);
3266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
3267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
3268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (def->type == XML_RELAXNG_START)
3269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
3270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "compiled the start\n");
3271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else
3272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
3273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "compiled element %s\n", def->name);
3274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (def->type == XML_RELAXNG_START)
3276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
3277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "failed to compile the start\n");
3278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else
3279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlGenericError(xmlGenericErrorContext,
3280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    "failed to compile element %s\n",
3281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    def->name);
3282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
3284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (ret);
3285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (def->type) {
3288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
3289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGTryCompile(ctxt, def->content);
3290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
3292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
3293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
3294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
3295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
3296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
3297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
3298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
3299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:
3301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:
3302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
3303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:
3304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
3305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
3306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
3307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
3308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
3309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
3310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = def->content;
3311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (list != NULL) {
3312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGTryCompile(ctxt, list);
3313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0)
3314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
3315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = list->next;
3316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
3319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
3320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
3321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
3322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
3323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
332994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
333094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Parsing functions				*
333194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
3332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
3333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr
3335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    ctxt, xmlNodePtr node);
3336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr
3337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  ctxt, xmlNodePtr node);
3338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr
3339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   ctxt, xmlNodePtr nodes,
3340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   int group);
3341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr
3342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  ctxt, xmlNodePtr node);
3343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr xmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt,
3344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             xmlNodePtr node);
3345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt,
3346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         xmlNodePtr nodes);
3347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr xmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr
3348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    ctxt, xmlNodePtr node,
3349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    xmlRelaxNGDefinePtr
3350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    def);
3351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr xmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr
3352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   ctxt, xmlNodePtr nodes);
3353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
3354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRelaxNGDefinePtr define,
3355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlNodePtr elem);
3356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define IS_BLANK_NODE(n) (xmlRelaxNGIsBlank((n)->content))
3359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsNullable:
3362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
3363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a definition is nullable.
3365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error
3367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsNullable(xmlRelaxNGDefinePtr define)
3370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
3372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL)
3374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
3375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->dflags & IS_NULLABLE)
3377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->dflags & IS_NOT_NULLABLE)
3379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
3380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (define->type) {
3381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
3382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
3383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
3384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
3386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
3387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
3388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
3389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
3390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
3391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGIsNullable(define->content);
3392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
3394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
3395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
3396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
3397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
3398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
3399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
3400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
3401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
3402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:{
3404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = define->content;
3405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsNullable(list);
3408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0)
3409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto done;
3410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
3413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
3416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
3417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:{
3418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = define->content;
3419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
3421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGIsNullable(list);
3422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 1)
3423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto done;
3424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
3425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
3427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
3429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
3430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  done:
3432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
3433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        define->dflags |= IS_NOT_NULLABLE;
3434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 1)
3435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        define->dflags |= IS_NULLABLE;
3436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGIsBlank:
3441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  a string
3442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a string is ignorable c.f. 4.2. Whitespace
3444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the string is NULL or made of blanks chars, 0 otherwise
3446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGIsBlank(xmlChar * str)
3449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL)
3451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*str != 0) {
3453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!(IS_BLANK_CH(*str)))
3454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
3455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
3456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
3458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetDataTypeLibrary:
3462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the current data or value element
3464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies algorithm from 4.3. datatypeLibrary attribute
3466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the datatypeLibary value or NULL if not found
3468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
3470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetDataTypeLibrary(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
3471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlNodePtr node)
3472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret, *escape;
3474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3475df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (node == NULL)
3476df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(NULL);
3477df143a5041f03a22808b59c76698770b74692815Selim Gurun
3478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((IS_RELAXNG(node, "data")) || (IS_RELAXNG(node, "value"))) {
3479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlGetProp(node, BAD_CAST "datatypeLibrary");
3480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != NULL) {
3481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret[0] == 0) {
3482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(ret);
3483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (NULL);
3484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?");
3486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (escape == NULL) {
3487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
3488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(ret);
3490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (escape);
3491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    node = node->parent;
3494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((node != NULL) && (node->type == XML_ELEMENT_NODE)) {
3495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlGetProp(node, BAD_CAST "datatypeLibrary");
3496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != NULL) {
3497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret[0] == 0) {
3498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(ret);
3499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (NULL);
3500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            escape = xmlURIEscapeStr(ret, BAD_CAST ":/#?");
3502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (escape == NULL) {
3503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
3504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(ret);
3506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (escape);
3507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = node->parent;
3509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (NULL);
3511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseValue:
3515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the data node.
3517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG value node.
3519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error
3521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
3523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseValue(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
3524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL;
3526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeLibraryPtr lib = NULL;
3527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *type;
3528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *library;
3529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int success = 0;
3530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def = xmlRelaxNGNewDefine(ctxt, node);
3532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL)
3533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->type = XML_RELAXNG_VALUE;
3535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = xmlGetProp(node, BAD_CAST "type");
3537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type != NULL) {
3538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGNormExtSpace(type);
3539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlValidateNCName(type, 0)) {
3540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE,
3541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "value type '%s' is not an NCName\n", type, NULL);
3542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        library = xmlRelaxNGGetDataTypeLibrary(ctxt, node);
3544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (library == NULL)
3545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            library =
3546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0");
3547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->name = type;
3549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->ns = library;
3550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        lib = (xmlRelaxNGTypeLibraryPtr)
3552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlHashLookup(xmlRelaxNGRegisteredTypes, library);
3553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lib == NULL) {
3554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB,
3555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Use of unregistered type library '%s'\n", library,
3556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
3557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->data = NULL;
3558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->data = lib;
3560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (lib->have == NULL) {
3561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB,
3562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Internal error with type library '%s': no 'have'\n",
3563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           library, NULL);
3564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                success = lib->have(lib->data, def->name);
3566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (success != 1) {
3567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND,
3568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Error type '%s' is not exported by type library '%s'\n",
3569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               def->name, library);
3570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->children == NULL) {
3575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->value = xmlStrdup(BAD_CAST "");
3576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (((node->children->type != XML_TEXT_NODE) &&
3577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (node->children->type != XML_CDATA_SECTION_NODE)) ||
3578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (node->children->next != NULL)) {
3579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_TEXT_EXPECTED,
3580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Expecting a single text value for <value>content\n",
3581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
3582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (def != NULL) {
3583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->value = xmlNodeGetContent(node);
3584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def->value == NULL) {
3585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_VALUE_NO_CONTENT,
3586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element <value> has no content\n", NULL, NULL);
3587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((lib != NULL) && (lib->check != NULL) && (success == 1)) {
3588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            void *val = NULL;
3589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            success =
3591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                lib->check(lib->data, def->name, def->value, &val, node);
3592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (success != 1) {
3593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_INVALID_VALUE,
3594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Value '%s' is not acceptable for type '%s'\n",
3595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           def->value, def->name);
3596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL)
3598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->attrs = val;
3599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
3603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseData:
3607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the data node.
3609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG data node.
3611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error
3613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
3615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseData(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
3616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL, except;
3618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr param, lastparam = NULL;
3619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeLibraryPtr lib;
3620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *type;
3621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *library;
3622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr content;
3623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int tmp;
3624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    type = xmlGetProp(node, BAD_CAST "type");
3626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (type == NULL) {
3627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_TYPE_MISSING, "data has no type\n", NULL,
3628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
3629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGNormExtSpace(type);
3632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (xmlValidateNCName(type, 0)) {
3633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_TYPE_VALUE,
3634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "data type '%s' is not an NCName\n", type, NULL);
3635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    library = xmlRelaxNGGetDataTypeLibrary(ctxt, node);
3637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (library == NULL)
3638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        library =
3639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlStrdup(BAD_CAST "http://relaxng.org/ns/structure/1.0");
3640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def = xmlRelaxNGNewDefine(ctxt, node);
3642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL) {
3643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(type);
3644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->type = XML_RELAXNG_DATATYPE;
3647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->name = type;
3648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->ns = library;
3649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib = (xmlRelaxNGTypeLibraryPtr)
3651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashLookup(xmlRelaxNGRegisteredTypes, library);
3652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib == NULL) {
3653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_TYPE_LIB,
3654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Use of unregistered type library '%s'\n", library,
3655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
3656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->data = NULL;
3657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->data = lib;
3659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lib->have == NULL) {
3660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_ERROR_TYPE_LIB,
3661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Internal error with type library '%s': no 'have'\n",
3662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       library, NULL);
3663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = lib->have(lib->data, def->name);
3665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != 1) {
3666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_TYPE_NOT_FOUND,
3667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Error type '%s' is not exported by type library '%s'\n",
3668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           def->name, library);
3669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else
3670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((xmlStrEqual
3671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (library,
3672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      BAD_CAST
3673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      "http://www.w3.org/2001/XMLSchema-datatypes"))
3674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    && ((xmlStrEqual(def->name, BAD_CAST "IDREF"))
3675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        || (xmlStrEqual(def->name, BAD_CAST "IDREFS")))) {
3676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->idref = 1;
3677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    content = node->children;
3681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Handle optional params
3684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (content != NULL) {
3686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlStrEqual(content->name, BAD_CAST "param"))
3687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlStrEqual(library,
3689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        BAD_CAST "http://relaxng.org/ns/structure/1.0")) {
3690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARAM_FORBIDDEN,
3691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Type library '%s' does not allow type parameters\n",
3692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       library, NULL);
3693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            content = content->next;
3694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((content != NULL) &&
3695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (xmlStrEqual(content->name, BAD_CAST "param")))
3696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                content = content->next;
3697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            param = xmlRelaxNGNewDefine(ctxt, node);
3699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (param != NULL) {
3700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                param->type = XML_RELAXNG_PARAM;
3701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                param->name = xmlGetProp(content, BAD_CAST "name");
3702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (param->name == NULL) {
3703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_PARAM_NAME_MISSING,
3704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "param has no name\n", NULL, NULL);
3705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                param->value = xmlNodeGetContent(content);
3707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (lastparam == NULL) {
3708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->attrs = lastparam = param;
3709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
3710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    lastparam->next = param;
3711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    lastparam = param;
3712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (lib != NULL) {
3714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            content = content->next;
3717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Handle optional except
3721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((content != NULL)
3723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        && (xmlStrEqual(content->name, BAD_CAST "except"))) {
3724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr child;
3725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr tmp2, last = NULL;
3726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        except = xmlRelaxNGNewDefine(ctxt, node);
3728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (except == NULL) {
3729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (def);
3730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        except->type = XML_RELAXNG_EXCEPT;
3732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = content->children;
3733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	def->content = except;
3734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (child == NULL) {
3735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, content, XML_RNGP_EXCEPT_NO_CONTENT,
3736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "except has no content\n", NULL, NULL);
3737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (child != NULL) {
3739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp2 = xmlRelaxNGParsePattern(ctxt, child);
3740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp2 != NULL) {
3741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (last == NULL) {
3742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    except->content = last = tmp2;
3743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
3744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    last->next = tmp2;
3745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    last = tmp2;
3746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = child->next;
3749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        content = content->next;
3751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check there is no unhandled data
3754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (content != NULL) {
3756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, content, XML_RNGP_DATA_CONTENT,
3757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Element data has unexpected content %s\n",
3758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   content->name, NULL);
3759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
3762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic const xmlChar *invalidName = BAD_CAST "\1";
3765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompareNameClasses:
3768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs1:  the first element/attribute defs
3769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs2:  the second element/attribute defs
3770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the restriction on the name
3771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ns:  the restriction on the namespace
3772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the 2 lists of element definitions. The comparison is
3774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * that if both lists do not accept the same QNames, it returns 1
3775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the 2 lists can accept the same QName the comparison returns 0
3776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 disttinct, 0 if equal
3778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompareNameClasses(xmlRelaxNGDefinePtr def1,
3781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGDefinePtr def2)
3782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
3784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNode node;
3785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNs ns;
3786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidCtxt ctxt;
3787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(&ctxt, 0, sizeof(xmlRelaxNGValidCtxt));
3789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt.flags = FLAGS_IGNORABLE | FLAGS_NOERROR;
3791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def1->type == XML_RELAXNG_ELEMENT) ||
3793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def1->type == XML_RELAXNG_ATTRIBUTE)) {
3794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def2->type == XML_RELAXNG_TEXT)
3795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (1);
3796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def1->name != NULL) {
3797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.name = def1->name;
3798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.name = invalidName;
3800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def1->ns != NULL) {
3802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def1->ns[0] == 0) {
3803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node.ns = NULL;
3804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        node.ns = &ns;
3806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ns.href = def1->ns;
3807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.ns = NULL;
3810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlRelaxNGElementMatch(&ctxt, def2, &node)) {
3812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def1->nameClass != NULL) {
3813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCompareNameClasses(def1->nameClass, def2);
3814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
3816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
3819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (def1->type == XML_RELAXNG_TEXT) {
3821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def2->type == XML_RELAXNG_TEXT)
3822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
3823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (def1->type == XML_RELAXNG_EXCEPT) {
3825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO ret = 0;
3826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO ret = 0;
3828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
3830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
3831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def2->type == XML_RELAXNG_ELEMENT) ||
3832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (def2->type == XML_RELAXNG_ATTRIBUTE)) {
3833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def2->name != NULL) {
3834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.name = def2->name;
3835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node.name = invalidName;
3837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node.ns = &ns;
3839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def2->ns != NULL) {
3840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def2->ns[0] == 0) {
3841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node.ns = NULL;
3842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ns.href = def2->ns;
3844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ns.href = invalidName;
3847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlRelaxNGElementMatch(&ctxt, def1, &node)) {
3849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def2->nameClass != NULL) {
3850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCompareNameClasses(def2->nameClass, def1);
3851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
3852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
3853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
3855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
3856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
3858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO ret = 0;
3859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
3862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCompareElemDefLists:
3866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs1:  the first list of element/attribute defs
3868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defs2:  the second list of element/attribute defs
3869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compare the 2 lists of element or attribute definitions. The comparison
3871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is that if both lists do not accept the same QNames, it returns 1
3872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * If the 2 lists can accept the same QName the comparison returns 0
3873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 disttinct, 0 if equal
3875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCompareElemDefLists(xmlRelaxNGParserCtxtPtr ctxt
3878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              ATTRIBUTE_UNUSED, xmlRelaxNGDefinePtr * def1,
3879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlRelaxNGDefinePtr * def2)
3880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *basedef2 = def2;
3882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def1 == NULL) || (def2 == NULL))
3884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((*def1 == NULL) || (*def2 == NULL))
3886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
3887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*def1 != NULL) {
3888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while ((*def2) != NULL) {
3889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlRelaxNGCompareNameClasses(*def1, *def2) == 0)
3890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
3891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def2++;
3892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def2 = basedef2;
3894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def1++;
3895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
3897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGenerateAttributes:
3901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the definition definition
3903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the definition can only generate attributes
3905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if yes, 0 if no and -1 in case of error.
3907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
3909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGenerateAttributes(xmlRelaxNGParserCtxtPtr ctxt,
3910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGDefinePtr def)
3911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr parent, cur, tmp;
3913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
3916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
3917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
3919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
3920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    parent = NULL;
3922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def;
3923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
3924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_ELEMENT) ||
3925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_TEXT) ||
3926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_DATATYPE) ||
3927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARAM) ||
3928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_LIST) ||
3929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_VALUE) ||
3930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_EMPTY))
3931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
3932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_CHOICE) ||
3933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_INTERLEAVE) ||
3934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_GROUP) ||
3935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_ONEORMORE) ||
3936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_ZEROORMORE) ||
3937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_OPTIONAL) ||
3938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARENTREF) ||
3939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_EXTERNALREF) ||
3940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_REF) ||
3941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_DEF)) {
3942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->content != NULL) {
3943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent = cur;
3944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->content;
3945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = cur;
3946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (tmp != NULL) {
3947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp->parent = parent;
3948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = tmp->next;
3949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
3950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
3951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == def)
3954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
3955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
3956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->next;
3957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
3958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
3959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
3960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->parent;
3961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
3962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == def)
3964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
3965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->next != NULL) {
3966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->next;
3967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
3968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
3969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
3970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
3971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
3972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
3973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
3975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetElements:
3976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
3977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the definition definition
3978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @eora:  gather elements (0) or attributes (1)
3979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute the list of top elements a definition can generate
3981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
3982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns a list of elements or NULL if none was found.
3983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
3984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr *
3985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetElements(xmlRelaxNGParserCtxtPtr ctxt,
3986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlRelaxNGDefinePtr def, int eora)
3987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
3988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr *ret = NULL, parent, cur, tmp;
3989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len = 0;
3990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int max = 0;
3991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
3993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
3994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
3995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
3996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
3997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
3998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
3999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    parent = NULL;
4000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def;
4001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (((eora == 0) && ((cur->type == XML_RELAXNG_ELEMENT) ||
4003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             (cur->type == XML_RELAXNG_TEXT))) ||
4004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ((eora == 1) && (cur->type == XML_RELAXNG_ATTRIBUTE))) {
4005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == NULL) {
4006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                max = 10;
4007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = (xmlRelaxNGDefinePtr *)
4008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlMalloc((max + 1) * sizeof(xmlRelaxNGDefinePtr));
4009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == NULL) {
4010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErrMemory(ctxt, "getting element list\n");
4011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (NULL);
4012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (max <= len) {
4014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	        xmlRelaxNGDefinePtr *temp;
4015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                max *= 2;
4017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                temp = xmlRealloc(ret,
4018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (max + 1) * sizeof(xmlRelaxNGDefinePtr));
4019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (temp == NULL) {
4020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErrMemory(ctxt, "getting element list\n");
4021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFree(ret);
4022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (NULL);
4023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		ret = temp;
4025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret[len++] = cur;
4027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret[len] = NULL;
4028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((cur->type == XML_RELAXNG_CHOICE) ||
4029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_INTERLEAVE) ||
4030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_GROUP) ||
4031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_ONEORMORE) ||
4032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_ZEROORMORE) ||
4033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_OPTIONAL) ||
4034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_PARENTREF) ||
4035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_REF) ||
4036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_DEF) ||
4037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		   (cur->type == XML_RELAXNG_EXTERNALREF)) {
4038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Don't go within elements or attributes or string values.
4040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Just gather the element top list
4041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->content != NULL) {
4043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent = cur;
4044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->content;
4045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = cur;
4046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (tmp != NULL) {
4047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp->parent = parent;
4048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = tmp->next;
4049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
4051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == def)
4054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
4055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
4056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->next;
4057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
4058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
4060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->parent;
4061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
4062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
4063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == def)
4064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
4065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->next != NULL) {
4066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->next;
4067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
4068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
4070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckChoiceDeterminism:
4076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the choice definition
4078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Also used to find indeterministic pattern in choice
4080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckChoiceDeterminism(xmlRelaxNGParserCtxtPtr ctxt,
4083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlRelaxNGDefinePtr def)
4084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr **list;
4086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
4087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchild = 0, i, j, ret;
4088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_nullable = 0;
4089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_indeterminist = 0;
4090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlHashTablePtr triage = NULL;
4091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_triable = 1;
4092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def == NULL) || (def->type != XML_RELAXNG_CHOICE))
4094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def->dflags & IS_PROCESSED)
4097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
4101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
4102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
4104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    is_nullable = xmlRelaxNGIsNullable(def);
4107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbchild++;
4111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild *
4115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                              sizeof(xmlRelaxNGDefinePtr
4116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     *));
4117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL) {
4118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "building choice\n");
4119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = 0;
4122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * a bit strong but safe
4124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_nullable == 0) {
4126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        triage = xmlHashCreate(10);
4127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        is_triable = 0;
4129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list[i] = xmlRelaxNGGetElements(ctxt, cur, 0);
4133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((list[i] == NULL) || (list[i][0] == NULL)) {
4134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            is_triable = 0;
4135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (is_triable == 1) {
4136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDefinePtr *tmp;
4137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int res;
4138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = list[i];
4140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((*tmp != NULL) && (is_triable == 1)) {
4141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((*tmp)->type == XML_RELAXNG_TEXT) {
4142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    res = xmlHashAddEntry2(triage,
4143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           BAD_CAST "#text", NULL,
4144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           (void *) cur);
4145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_triable = -1;
4147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
4148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           ((*tmp)->name != NULL)) {
4149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
4150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(triage,
4151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (*tmp)->name, NULL,
4152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) cur);
4153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(triage,
4155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (*tmp)->name, (*tmp)->ns,
4156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) cur);
4157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_triable = -1;
4159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) {
4160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
4161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(triage,
4162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "#any", NULL,
4163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) cur);
4164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(triage,
4166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "#any", (*tmp)->ns,
4167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) cur);
4168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_triable = -1;
4170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
4171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    is_triable = -1;
4172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp++;
4174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i++;
4177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbchild; i++) {
4181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (list[i] == NULL)
4182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
4183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = 0; j < i; j++) {
4184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (list[j] == NULL)
4185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
4186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]);
4187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
4188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                is_indeterminist = 1;
4189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbchild; i++) {
4193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (list[i] != NULL)
4194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(list[i]);
4195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
4198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_indeterminist) {
4199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_INDETERMINIST;
4200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_triable == 1) {
4202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_TRIABLE;
4203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->data = triage;
4204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (triage != NULL) {
4205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(triage, NULL);
4206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->dflags |= IS_PROCESSED;
4208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckGroupAttrs:
4212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the group definition
4214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Detects violations of rule 7.3
4216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckGroupAttrs(xmlRelaxNGParserCtxtPtr ctxt,
4219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGDefinePtr def)
4220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr **list;
4222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
4223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchild = 0, i, j, ret;
4224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((def == NULL) ||
4226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ((def->type != XML_RELAXNG_GROUP) &&
4227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         (def->type != XML_RELAXNG_ELEMENT)))
4228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def->dflags & IS_PROCESSED)
4231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
4235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
4236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
4238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->attrs;
4241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbchild++;
4243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbchild++;
4248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = (xmlRelaxNGDefinePtr **) xmlMalloc(nbchild *
4252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                              sizeof(xmlRelaxNGDefinePtr
4253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     *));
4254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL) {
4255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "building group\n");
4256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    i = 0;
4259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->attrs;
4260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list[i] = xmlRelaxNGGetElements(ctxt, cur, 1);
4262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i++;
4263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list[i] = xmlRelaxNGGetElements(ctxt, cur, 1);
4268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        i++;
4269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbchild; i++) {
4273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (list[i] == NULL)
4274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
4275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = 0; j < i; j++) {
4276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (list[j] == NULL)
4277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
4278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompareElemDefLists(ctxt, list[i], list[j]);
4279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
4280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, def->node, XML_RNGP_GROUP_ATTR_CONFLICT,
4281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Attributes conflicts in group\n", NULL, NULL);
4282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbchild; i++) {
4286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (list[i] != NULL)
4287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(list[i]);
4288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
4291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->dflags |= IS_PROCESSED;
4292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGComputeInterleaves:
4296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the interleave definition
4297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the definition name
4299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * A lot of work for preprocessing interleave definitions
4301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * is potentially needed to get a decent execution speed at runtime
4302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - trying to get a total order on the element nodes generated
4303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     by the interleaves, order the list of interleave definitions
4304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     following that order.
4305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *   - if <text/> is used to handle mixed content, it is better to
4306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     flag this in the define and simplify the runtime checking
4307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     algorithm
4308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
4310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGComputeInterleaves(xmlRelaxNGDefinePtr def,
4311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGParserCtxtPtr ctxt,
4312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlChar * name ATTRIBUTE_UNUSED)
4313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur, *tmp;
4315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPartitionPtr partitions = NULL;
4317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr *groups = NULL;
4318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr group;
4319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, ret, res;
4320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbgroups = 0;
4321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int nbchild = 0;
4322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_mixed = 0;
4323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int is_determinist = 1;
4324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Don't run that check in case of error. Infinite recursion
4327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * becomes possible.
4328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors != 0)
4330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
4331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE
4333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
4334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlRelaxNGComputeInterleaves(%s)\n", name);
4335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbchild++;
4339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE
4343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "  %d child\n", nbchild);
4344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    groups = (xmlRelaxNGInterleaveGroupPtr *)
4346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlMalloc(nbchild * sizeof(xmlRelaxNGInterleaveGroupPtr));
4347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (groups == NULL)
4348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
4349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = def->content;
4350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
4351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        groups[nbgroups] = (xmlRelaxNGInterleaveGroupPtr)
4352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlMalloc(sizeof(xmlRelaxNGInterleaveGroup));
4353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (groups[nbgroups] == NULL)
4354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto error;
4355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type == XML_RELAXNG_TEXT)
4356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            is_mixed++;
4357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        groups[nbgroups]->rule = cur;
4358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        groups[nbgroups]->defs = xmlRelaxNGGetElements(ctxt, cur, 0);
4359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        groups[nbgroups]->attrs = xmlRelaxNGGetElements(ctxt, cur, 1);
4360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbgroups++;
4361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
4362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_INTERLEAVE
4364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "  %d groups\n", nbgroups);
4365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Let's check that all rules makes a partitions according to 7.4
4369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    partitions = (xmlRelaxNGPartitionPtr)
4371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlMalloc(sizeof(xmlRelaxNGPartition));
4372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (partitions == NULL)
4373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto error;
4374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(partitions, 0, sizeof(xmlRelaxNGPartition));
4375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    partitions->nbgroups = nbgroups;
4376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    partitions->triage = xmlHashCreate(nbgroups);
4377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbgroups; i++) {
4378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        group = groups[i];
4379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (j = i + 1; j < nbgroups; j++) {
4380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (groups[j] == NULL)
4381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
4382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompareElemDefLists(ctxt, group->defs,
4384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                groups[j]->defs);
4385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
4386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, def->node, XML_RNGP_ELEM_TEXT_CONFLICT,
4387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Element or text conflicts in interleave\n",
4388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
4389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCompareElemDefLists(ctxt, group->attrs,
4391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                groups[j]->attrs);
4392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
4393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, def->node, XML_RNGP_ATTR_CONFLICT,
4394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Attributes conflicts in interleave\n", NULL,
4395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
4396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = group->defs;
4399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((tmp != NULL) && (*tmp != NULL)) {
4400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (*tmp != NULL) {
4401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((*tmp)->type == XML_RELAXNG_TEXT) {
4402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    res = xmlHashAddEntry2(partitions->triage,
4403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           BAD_CAST "#text", NULL,
4404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           (void *) (long) (i + 1));
4405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_determinist = -1;
4407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (((*tmp)->type == XML_RELAXNG_ELEMENT) &&
4408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           ((*tmp)->name != NULL)) {
4409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
4410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(partitions->triage,
4411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (*tmp)->name, NULL,
4412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) (long) (i + 1));
4413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(partitions->triage,
4415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (*tmp)->name, (*tmp)->ns,
4416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) (long) (i + 1));
4417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_determinist = -1;
4419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((*tmp)->type == XML_RELAXNG_ELEMENT) {
4420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (((*tmp)->ns == NULL) || ((*tmp)->ns[0] == 0))
4421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(partitions->triage,
4422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "#any", NULL,
4423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) (long) (i + 1));
4424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    else
4425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        res = xmlHashAddEntry2(partitions->triage,
4426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "#any", (*tmp)->ns,
4427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (void *) (long) (i + 1));
4428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((*tmp)->nameClass != NULL)
4429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_determinist = 2;
4430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (res != 0)
4431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        is_determinist = -1;
4432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
4433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    is_determinist = -1;
4434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp++;
4436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            is_determinist = 0;
4439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    partitions->groups = groups;
4442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * and save the partition list back in the def
4445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->data = partitions;
4447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_mixed != 0)
4448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->dflags |= IS_MIXED;
4449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_determinist == 1)
4450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        partitions->flags = IS_DETERMINIST;
4451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (is_determinist == 2)
4452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        partitions->flags = IS_DETERMINIST | IS_NEEDCHECK;
4453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return;
4454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  error:
4456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRngPErrMemory(ctxt, "in interleave computation\n");
4457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (groups != NULL) {
4458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < nbgroups; i++)
4459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (groups[i] != NULL) {
4460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (groups[i]->defs != NULL)
4461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(groups[i]->defs);
4462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(groups[i]);
4463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(groups);
4465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGFreePartition(partitions);
4467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseInterleave:
4471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the data node.
4473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG interleave node.
4475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error
4477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
4479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseInterleave(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL;
4482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr last = NULL, cur;
4483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
4484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def = xmlRelaxNGNewDefine(ctxt, node);
4486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (def == NULL) {
4487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    def->type = XML_RELAXNG_INTERLEAVE;
4490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->interleaves == NULL)
4492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->interleaves = xmlHashCreate(10);
4493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->interleaves == NULL) {
4494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(ctxt, "create interleaves\n");
4495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        char name[32];
4497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        snprintf(name, 32, "interleave%d", ctxt->nbInterleaves++);
4499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST name, def) < 0) {
4500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_ADD,
4501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Failed to add %s to hash table\n",
4502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		       (const xmlChar *) name, NULL);
4503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
4506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
4507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_INTERLEAVE_NO_CONTENT,
4508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Element interleave is empty\n", NULL, NULL);
4509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
4511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_RELAXNG(child, "element")) {
4512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGParseElement(ctxt, child);
4513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGParsePattern(ctxt, child);
4515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur != NULL) {
4517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = def;
4518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (last == NULL) {
4519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->content = last = cur;
4520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
4521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last->next = cur;
4522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last = cur;
4523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
4526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
4529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseInclude:
4533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the include node
4535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Integrate the content of an include node in the current grammar
4537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success or -1 in case of error
4539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseInclude(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGIncludePtr incl;
4544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root;
4545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, tmp;
4546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    incl = node->psvi;
4548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (incl == NULL) {
4549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_INCLUDE_EMPTY,
4550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Include node has no data\n", NULL, NULL);
4551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
4552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = xmlDocGetRootElement(incl->doc);
4554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root == NULL) {
4555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EMPTY, "Include document is empty\n",
4556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
4557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
4558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!xmlStrEqual(root->name, BAD_CAST "grammar")) {
4560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_GRAMMAR_MISSING,
4561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Include document root is not a grammar\n", NULL, NULL);
4562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
4563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
4566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Merge the definition from both the include and the internal list
4567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
4568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root->children != NULL) {
4569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = xmlRelaxNGParseGrammarContent(ctxt, root->children);
4570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0)
4571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
4572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->children != NULL) {
4574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = xmlRelaxNGParseGrammarContent(ctxt, node->children);
4575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0)
4576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
4577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseDefine:
4583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the define node
4585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG define element node.
4587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success or -1 in case of error
4589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
4591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseDefine(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *name;
4594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, tmp;
4595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def;
4596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *olddefine;
4597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    name = xmlGetProp(node, BAD_CAST "name");
4599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (name == NULL) {
4600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_NAME_MISSING,
4601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "define has no name\n", NULL, NULL);
4602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGNormExtSpace(name);
4604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlValidateNCName(name, 0)) {
4605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_INVALID_DEFINE_NAME,
4606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "define name '%s' is not an NCName\n", name, NULL);
4607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL) {
4610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(name);
4611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
4612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_DEF;
4614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->name = name;
4615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_EMPTY,
4617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "define has no children\n", NULL, NULL);
4618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            olddefine = ctxt->define;
4620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->define = name;
4621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 0);
4623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->define = olddefine;
4624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar->defs == NULL)
4626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar->defs = xmlHashCreate(10);
4627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar->defs == NULL) {
4628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED,
4629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Could not create definition hash\n", NULL, NULL);
4630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
4631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlHashAddEntry(ctxt->grammar->defs, name, def);
4633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp < 0) {
4634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr prev;
4635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = xmlHashLookup(ctxt->grammar->defs, name);
4637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (prev == NULL) {
4638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_DEFINE_CREATE_FAILED,
4639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Internal error on define aggregation of %s\n",
4640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               name, NULL);
4641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
4642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
4643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (prev->nextHash != NULL)
4644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        prev = prev->nextHash;
4645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev->nextHash = def;
4646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
4651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4654df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGParseImportRef:
4655df143a5041f03a22808b59c76698770b74692815Selim Gurun * @payload: the parser context
4656df143a5041f03a22808b59c76698770b74692815Selim Gurun * @data: the current grammar
4657df143a5041f03a22808b59c76698770b74692815Selim Gurun * @name: the reference name
4658df143a5041f03a22808b59c76698770b74692815Selim Gurun *
4659df143a5041f03a22808b59c76698770b74692815Selim Gurun * Import import one references into the current grammar
4660df143a5041f03a22808b59c76698770b74692815Selim Gurun */
4661df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
4662df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGParseImportRef(void *payload, void *data, xmlChar *name) {
4663df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRelaxNGParserCtxtPtr ctxt = (xmlRelaxNGParserCtxtPtr) data;
4664df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRelaxNGDefinePtr def = (xmlRelaxNGDefinePtr) payload;
4665df143a5041f03a22808b59c76698770b74692815Selim Gurun    int tmp;
4666df143a5041f03a22808b59c76698770b74692815Selim Gurun
4667df143a5041f03a22808b59c76698770b74692815Selim Gurun    def->dflags |= IS_EXTERNAL_REF;
4668df143a5041f03a22808b59c76698770b74692815Selim Gurun
4669df143a5041f03a22808b59c76698770b74692815Selim Gurun    tmp = xmlHashAddEntry(ctxt->grammar->refs, name, def);
4670df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (tmp < 0) {
4671df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlRelaxNGDefinePtr prev;
4672df143a5041f03a22808b59c76698770b74692815Selim Gurun
4673df143a5041f03a22808b59c76698770b74692815Selim Gurun        prev = (xmlRelaxNGDefinePtr)
4674df143a5041f03a22808b59c76698770b74692815Selim Gurun            xmlHashLookup(ctxt->grammar->refs, def->name);
4675df143a5041f03a22808b59c76698770b74692815Selim Gurun        if (prev == NULL) {
4676df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (def->name != NULL) {
4677df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED,
4678df143a5041f03a22808b59c76698770b74692815Selim Gurun                           "Error refs definitions '%s'\n",
4679df143a5041f03a22808b59c76698770b74692815Selim Gurun                           def->name, NULL);
4680df143a5041f03a22808b59c76698770b74692815Selim Gurun            } else {
4681df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED,
4682df143a5041f03a22808b59c76698770b74692815Selim Gurun                           "Error refs definitions\n",
4683df143a5041f03a22808b59c76698770b74692815Selim Gurun                           NULL, NULL);
4684df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
4685df143a5041f03a22808b59c76698770b74692815Selim Gurun        } else {
4686df143a5041f03a22808b59c76698770b74692815Selim Gurun            def->nextHash = prev->nextHash;
4687df143a5041f03a22808b59c76698770b74692815Selim Gurun            prev->nextHash = def;
4688df143a5041f03a22808b59c76698770b74692815Selim Gurun        }
4689df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
4690df143a5041f03a22808b59c76698770b74692815Selim Gurun}
4691df143a5041f03a22808b59c76698770b74692815Selim Gurun
4692df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
4693df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGParseImportRefs:
4694df143a5041f03a22808b59c76698770b74692815Selim Gurun * @ctxt: the parser context
4695df143a5041f03a22808b59c76698770b74692815Selim Gurun * @grammar: the sub grammar
4696df143a5041f03a22808b59c76698770b74692815Selim Gurun *
4697df143a5041f03a22808b59c76698770b74692815Selim Gurun * Import references from the subgrammar into the current grammar
4698df143a5041f03a22808b59c76698770b74692815Selim Gurun *
4699df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns 0 in case of success, -1 in case of failure
4700df143a5041f03a22808b59c76698770b74692815Selim Gurun */
4701df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic int
4702df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGParseImportRefs(xmlRelaxNGParserCtxtPtr ctxt,
4703df143a5041f03a22808b59c76698770b74692815Selim Gurun                          xmlRelaxNGGrammarPtr grammar) {
4704df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((ctxt == NULL) || (grammar == NULL) || (ctxt->grammar == NULL))
4705df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(-1);
4706df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (grammar->refs == NULL)
4707df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(0);
4708df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt->grammar->refs == NULL)
4709df143a5041f03a22808b59c76698770b74692815Selim Gurun        ctxt->grammar->refs = xmlHashCreate(10);
4710df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ctxt->grammar->refs == NULL) {
4711df143a5041f03a22808b59c76698770b74692815Selim Gurun        xmlRngPErr(ctxt, NULL, XML_RNGP_REF_CREATE_FAILED,
4712df143a5041f03a22808b59c76698770b74692815Selim Gurun                   "Could not create references hash\n", NULL, NULL);
4713df143a5041f03a22808b59c76698770b74692815Selim Gurun        return(-1);
4714df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
4715df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlHashScan(grammar->refs, xmlRelaxNGParseImportRef, ctxt);
4716df143a5041f03a22808b59c76698770b74692815Selim Gurun    return(0);
4717df143a5041f03a22808b59c76698770b74692815Selim Gurun}
4718df143a5041f03a22808b59c76698770b74692815Selim Gurun
4719df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
4720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGProcessExternalRef:
4721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt: the parser context
4722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the externlRef node
4723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Process and compile an externlRef node
4725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the xmlRelaxNGDefinePtr or NULL in case of error
4727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
4729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGProcessExternalRef(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDocumentPtr docu;
4732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root, tmp;
4733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ns;
4734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int newNs = 0, oldflags;
4735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def;
4736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    docu = node->psvi;
4738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (docu != NULL) {
4739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_EXTERNALREF;
4743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (docu->content == NULL) {
4745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Then do the parsing for good
4747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            root = xmlDocGetRootElement(docu->doc);
4749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (root == NULL) {
4750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_EXTERNALREF_EMTPY,
4751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "xmlRelaxNGParse: %s is empty\n", ctxt->URL,
4752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
4753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (NULL);
4754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * ns transmission rules
4757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ns = xmlGetProp(root, BAD_CAST "ns");
4759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ns == NULL) {
4760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = node;
4761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((tmp != NULL) && (tmp->type == XML_ELEMENT_NODE)) {
4762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ns = xmlGetProp(tmp, BAD_CAST "ns");
4763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns != NULL) {
4764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
4765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
4766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = tmp->parent;
4767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ns != NULL) {
4769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlSetProp(root, BAD_CAST "ns", ns);
4770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    newNs = 1;
4771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(ns);
4772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
4774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(ns);
4775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Parsing to get a precompiled schemas.
4779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldflags = ctxt->flags;
4781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags |= XML_RELAXNG_IN_EXTERNALREF;
4782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            docu->schema = xmlRelaxNGParseDocument(ctxt, root);
4783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
4784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((docu->schema != NULL) &&
4785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (docu->schema->topgrammar != NULL)) {
4786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                docu->content = docu->schema->topgrammar->start;
4787df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (docu->schema->topgrammar->refs)
4788df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlRelaxNGParseImportRefs(ctxt, docu->schema->topgrammar);
4789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
4792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * the externalRef may be reused in a different ns context
4793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
4794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (newNs == 1) {
4795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlUnsetProp(root, BAD_CAST "ns");
4796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->content = docu->content;
4799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
4800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = NULL;
4801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
4803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
4804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
4806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParsePattern:
4807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
4808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the pattern node.
4809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG pattern node.
4811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
4812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error or if no
4813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     pattern is generated.
4814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
4815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
4816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParsePattern(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
4817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
4818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL;
4819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node == NULL) {
4821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
4822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
4823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_RELAXNG(node, "element")) {
4824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseElement(ctxt, node);
4825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "attribute")) {
4826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseAttribute(ctxt, node);
4827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "empty")) {
4828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_EMPTY;
4832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
4833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_NOT_EMPTY,
4834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "empty: had a child node\n", NULL, NULL);
4835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "text")) {
4837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_TEXT;
4841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
4842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_TEXT_HAS_CHILD,
4843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "text: had a child node\n", NULL, NULL);
4844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "zeroOrMore")) {
4846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_ZEROORMORE;
4850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 1);
4856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "oneOrMore")) {
4858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_ONEORMORE;
4862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 1);
4868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "optional")) {
4870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_OPTIONAL;
4874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 1);
4880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "choice")) {
4882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_CHOICE;
4886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 0);
4892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "group")) {
4894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_GROUP;
4898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 0);
4904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "ref")) {
4906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_REF;
4910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->name = xmlGetProp(node, BAD_CAST "name");
4911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def->name == NULL) {
4912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_REF_NO_NAME, "ref has no name\n",
4913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL, NULL);
4914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGNormExtSpace(def->name);
4916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlValidateNCName(def->name, 0)) {
4917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_REF_NAME_INVALID,
4918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "ref name '%s' is not an NCName\n", def->name,
4919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
4920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
4923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_REF_NOT_EMPTY, "ref is not empty\n",
4924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL, NULL);
4925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar->refs == NULL)
4927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar->refs = xmlHashCreate(10);
4928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar->refs == NULL) {
4929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED,
4930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Could not create references hash\n", NULL, NULL);
4931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = NULL;
4932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int tmp;
4934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlHashAddEntry(ctxt->grammar->refs, def->name, def);
4936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp < 0) {
4937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr prev;
4938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = (xmlRelaxNGDefinePtr)
4940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlHashLookup(ctxt->grammar->refs, def->name);
4941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (prev == NULL) {
4942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (def->name != NULL) {
4943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED,
4944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   "Error refs definitions '%s'\n",
4945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   def->name, NULL);
4946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
4947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlRngPErr(ctxt, node, XML_RNGP_REF_CREATE_FAILED,
4948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   "Error refs definitions\n",
4949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				   NULL, NULL);
4950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
4951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def = NULL;
4952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
4953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->nextHash = prev->nextHash;
4954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev->nextHash = def;
4955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
4956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
4957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "data")) {
4959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseData(ctxt, node);
4960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "value")) {
4961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseValue(ctxt, node);
4962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "list")) {
4963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_LIST;
4967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
4968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT,
4969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element %s is empty\n", node->name, NULL);
4970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
4971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->content =
4972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParsePatterns(ctxt, node->children, 0);
4973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "interleave")) {
4975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParseInterleave(ctxt, node);
4976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "externalRef")) {
4977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGProcessExternalRef(ctxt, node);
4978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "notAllowed")) {
4979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
4980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
4981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
4982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_NOT_ALLOWED;
4983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
4984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_NOTALLOWED_NOT_EMPTY,
4985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "xmlRelaxNGParse: notAllowed element is not empty\n",
4986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL, NULL);
4987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
4988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "grammar")) {
4989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGGrammarPtr grammar, old;
4990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGGrammarPtr oldparent;
4991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GRAMMAR
4993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
4994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Found <grammar> pattern\n");
4995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
4996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
4997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldparent = ctxt->parentgrammar;
4998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        old = ctxt->grammar;
4999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->parentgrammar = old;
5000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        grammar = xmlRelaxNGParseGrammar(ctxt, node->children);
5001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old != NULL) {
5002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar = old;
5003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->parentgrammar = oldparent;
5004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
5005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (grammar != NULL) {
5006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                grammar->next = old->next;
5007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                old->next = grammar;
5008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (grammar != NULL)
5012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = grammar->start;
5013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
5014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = NULL;
5015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "parentRef")) {
5016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->parentgrammar == NULL) {
5017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_PARENT,
5018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Use of parentRef without a parent grammar\n", NULL,
5019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
5021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, node);
5023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
5024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
5025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_PARENTREF;
5026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->name = xmlGetProp(node, BAD_CAST "name");
5027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def->name == NULL) {
5028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NO_NAME,
5029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "parentRef has no name\n", NULL, NULL);
5030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGNormExtSpace(def->name);
5032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlValidateNCName(def->name, 0)) {
5033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NAME_INVALID,
5034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "parentRef name '%s' is not an NCName\n",
5035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           def->name, NULL);
5036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
5039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_NOT_EMPTY,
5040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "parentRef is not empty\n", NULL, NULL);
5041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->parentgrammar->refs == NULL)
5043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->parentgrammar->refs = xmlHashCreate(10);
5044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->parentgrammar->refs == NULL) {
5045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED,
5046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Could not create references hash\n", NULL, NULL);
5047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = NULL;
5048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (def->name != NULL) {
5049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int tmp;
5050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp =
5052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlHashAddEntry(ctxt->parentgrammar->refs, def->name, def);
5053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp < 0) {
5054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr prev;
5055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = (xmlRelaxNGDefinePtr)
5057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlHashLookup(ctxt->parentgrammar->refs, def->name);
5058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (prev == NULL) {
5059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_PARENTREF_CREATE_FAILED,
5060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Internal error parentRef definitions '%s'\n",
5061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               def->name, NULL);
5062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def = NULL;
5063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
5064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->nextHash = prev->nextHash;
5065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev->nextHash = def;
5066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "mixed")) {
5070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
5071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_EMPTY_CONSTRUCT, "Mixed is empty\n",
5072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL, NULL);
5073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = NULL;
5074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = xmlRelaxNGParseInterleave(ctxt, node);
5076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def != NULL) {
5077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr tmp;
5078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((def->content != NULL) && (def->content->next != NULL)) {
5080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = xmlRelaxNGNewDefine(ctxt, node);
5081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp != NULL) {
5082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp->type = XML_RELAXNG_GROUP;
5083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp->content = def->content;
5084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        def->content = tmp;
5085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
5086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGNewDefine(ctxt, node);
5089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp == NULL)
5090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (def);
5091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp->type = XML_RELAXNG_TEXT;
5092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp->next = def->content;
5093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->content = tmp;
5094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_CONSTRUCT,
5098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Unexpected node %s is not a pattern\n", node->name,
5099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
5100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = NULL;
5101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
5103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseAttribute:
5107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the element node
5109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG attribute node.
5111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseAttribute(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
5116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret, cur;
5118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
5119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int old_flags;
5120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGNewDefine(ctxt, node);
5122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
5123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_RELAXNG_ATTRIBUTE;
5125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->parent = ctxt->def;
5126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
5127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
5128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_EMPTY,
5129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNGParseattribute: attribute has no children\n",
5130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
5132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    old_flags = ctxt->flags;
5134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags |= XML_RELAXNG_IN_ATTRIBUTE;
5135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGParseNameClass(ctxt, child, ret);
5136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur != NULL)
5137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
5140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = xmlRelaxNGParsePattern(ctxt, child);
5141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur != NULL) {
5142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            switch (cur->type) {
5143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EMPTY:
5144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_NOT_ALLOWED:
5145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_TEXT:
5146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ELEMENT:
5147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_DATATYPE:
5148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_VALUE:
5149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_LIST:
5150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_REF:
5151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_PARENTREF:
5152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EXTERNALREF:
5153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_DEF:
5154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ONEORMORE:
5155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ZEROORMORE:
5156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_OPTIONAL:
5157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_CHOICE:
5158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_GROUP:
5159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_INTERLEAVE:
5160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ATTRIBUTE:
5161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret->content = cur;
5162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->parent = ret;
5163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_START:
5165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_PARAM:
5166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EXCEPT:
5167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CONTENT,
5168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "attribute has invalid content\n", NULL,
5169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL);
5170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_NOOP:
5172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_NOOP,
5173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, noop found in attribute\n",
5174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child != NULL) {
5181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_ATTRIBUTE_CHILDREN,
5182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "attribute has multiple children\n", NULL, NULL);
5183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags = old_flags;
5185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseExceptNameClass:
5190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the except node
5192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @attr:  1 if within an attribute, 0 if within an element
5193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG nameClass node.
5195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseExceptNameClass(xmlRelaxNGParserCtxtPtr ctxt,
5200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               xmlNodePtr node, int attr)
5201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret, cur, last = NULL;
5203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
5204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!IS_RELAXNG(node, "except")) {
5206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MISSING,
5207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Expecting an except node\n", NULL, NULL);
5208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->next != NULL) {
5211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_MULTIPLE,
5212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "exceptNameClass allows only a single except node\n",
5213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->children == NULL) {
5216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_EXCEPT_EMPTY, "except has no content\n",
5217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGNewDefine(ctxt, node);
5222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
5223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_RELAXNG_EXCEPT;
5225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
5226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
5227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = xmlRelaxNGNewDefine(ctxt, child);
5228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur == NULL)
5229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
5230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (attr)
5231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->type = XML_RELAXNG_ATTRIBUTE;
5232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
5233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->type = XML_RELAXNG_ELEMENT;
5234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlRelaxNGParseNameClass(ctxt, child, cur) != NULL) {
5236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (last == NULL) {
5237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->content = cur;
5238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last->next = cur;
5240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            last = cur;
5242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseNameClass:
5251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the nameClass node
5253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @def:  the current definition
5254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG nameClass node.
5256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseNameClass(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node,
5261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGDefinePtr def)
5262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret, tmp;
5264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *val;
5265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = def;
5267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((IS_RELAXNG(node, "name")) || (IS_RELAXNG(node, "anyName")) ||
5268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (IS_RELAXNG(node, "nsName"))) {
5269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((def->type != XML_RELAXNG_ELEMENT) &&
5270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (def->type != XML_RELAXNG_ATTRIBUTE)) {
5271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGNewDefine(ctxt, node);
5272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == NULL)
5273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (NULL);
5274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->parent = def;
5275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE)
5276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->type = XML_RELAXNG_ATTRIBUTE;
5277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
5278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->type = XML_RELAXNG_ELEMENT;
5279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_RELAXNG(node, "name")) {
5282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        val = xmlNodeGetContent(node);
5283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGNormExtSpace(val);
5284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlValidateNCName(val, 0)) {
5285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    if (node->parent != NULL)
5286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME,
5287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   "Element %s name '%s' is not an NCName\n",
5288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   node->parent->name, val);
5289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    else
5290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NAME,
5291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   "name '%s' is not an NCName\n",
5292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   val, NULL);
5293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->name = val;
5295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        val = xmlGetProp(node, BAD_CAST "ns");
5296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->ns = val;
5297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (val != NULL) &&
5299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlStrEqual(val, BAD_CAST "http://www.w3.org/2000/xmlns"))) {
5300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRngPErr(ctxt, node, XML_RNGP_XML_NS,
5301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Attribute with namespace '%s' is not allowed\n",
5302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        val, NULL);
5303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (val != NULL) &&
5306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (val[0] == 0) && (xmlStrEqual(ret->name, BAD_CAST "xmlns"))) {
5307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    xmlRngPErr(ctxt, node, XML_RNGP_XMLNS_NAME,
5308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Attribute with QName 'xmlns' is not allowed\n",
5309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       val, NULL);
5310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "anyName")) {
5312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->name = NULL;
5313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->ns = NULL;
5314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
5315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->nameClass =
5316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParseExceptNameClass(ctxt, node->children,
5317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (def->type ==
5318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                XML_RELAXNG_ATTRIBUTE));
5319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "nsName")) {
5321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->name = NULL;
5322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->ns = xmlGetProp(node, BAD_CAST "ns");
5323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret->ns == NULL) {
5324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_NSNAME_NO_NS,
5325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "nsName has no ns attribute\n", NULL, NULL);
5326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & XML_RELAXNG_IN_ATTRIBUTE) &&
5328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (ret->ns != NULL) &&
5329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlStrEqual
5330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             (ret->ns, BAD_CAST "http://www.w3.org/2000/xmlns"))) {
5331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_XML_NS,
5332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Attribute with namespace '%s' is not allowed\n",
5333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       ret->ns, NULL);
5334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children != NULL) {
5336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret->nameClass =
5337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGParseExceptNameClass(ctxt, node->children,
5338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               (def->type ==
5339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                XML_RELAXNG_ATTRIBUTE));
5340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(node, "choice")) {
5342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlNodePtr child;
5343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr last = NULL;
5344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGNewDefine(ctxt, node);
5346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret == NULL)
5347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
5348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->parent = def;
5349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->type = XML_RELAXNG_CHOICE;
5350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node->children == NULL) {
5352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_EMPTY,
5353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Element choice is empty\n", NULL, NULL);
5354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            child = node->children;
5357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (child != NULL) {
5358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGParseNameClass(ctxt, child, ret);
5359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp != NULL) {
5360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (last == NULL) {
5361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last = ret->nameClass = tmp;
5362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
5363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last->next = tmp;
5364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last = tmp;
5365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
5366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                child = child->next;
5368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_CHOICE_CONTENT,
5372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "expecting name, anyName, nsName or choice : got %s\n",
5373df143a5041f03a22808b59c76698770b74692815Selim Gurun                   (node == NULL ? (const xmlChar *) "nothing" : node->name),
5374df143a5041f03a22808b59c76698770b74692815Selim Gurun		   NULL);
5375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != def) {
5378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def->nameClass == NULL) {
5379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def->nameClass = ret;
5380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = def->nameClass;
5382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (tmp->next != NULL) {
5383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = tmp->next;
5384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp->next = ret;
5386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseElement:
5393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the element node
5395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG element node.
5397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseElement(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
5402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr ret, cur, last;
5404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr child;
5405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *olddefine;
5406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGNewDefine(ctxt, node);
5408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
5409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
5410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->type = XML_RELAXNG_ELEMENT;
5411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->parent = ctxt->def;
5412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    child = node->children;
5413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
5414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_EMPTY,
5415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNGParseElement: element has no children\n",
5416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
5418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGParseNameClass(ctxt, child, ret);
5420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur != NULL)
5421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (child == NULL) {
5424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_NO_CONTENT,
5425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNGParseElement: element has no content\n",
5426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
5428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    olddefine = ctxt->define;
5430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->define = NULL;
5431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    last = NULL;
5432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (child != NULL) {
5433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = xmlRelaxNGParsePattern(ctxt, child);
5434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur != NULL) {
5435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = ret;
5436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            switch (cur->type) {
5437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EMPTY:
5438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_NOT_ALLOWED:
5439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_TEXT:
5440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ELEMENT:
5441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_DATATYPE:
5442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_VALUE:
5443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_LIST:
5444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_REF:
5445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_PARENTREF:
5446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EXTERNALREF:
5447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_DEF:
5448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ZEROORMORE:
5449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ONEORMORE:
5450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_OPTIONAL:
5451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_CHOICE:
5452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_GROUP:
5453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_INTERLEAVE:
5454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (last == NULL) {
5455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret->content = last = cur;
5456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
5457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((last->type == XML_RELAXNG_ELEMENT) &&
5458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (ret->content == last)) {
5459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret->content = xmlRelaxNGNewDefine(ctxt, node);
5460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ret->content != NULL) {
5461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ret->content->type = XML_RELAXNG_GROUP;
5462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ret->content->content = last;
5463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
5464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ret->content = last;
5465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
5466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
5467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last->next = cur;
5468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        last = cur;
5469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
5470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_ATTRIBUTE:
5472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->next = ret->attrs;
5473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret->attrs = cur;
5474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_START:
5476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT,
5477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, start found in element\n",
5478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_PARAM:
5481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT,
5482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, param found in element\n",
5483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_EXCEPT:
5486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT,
5487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, except found in element\n",
5488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                case XML_RELAXNG_NOOP:
5491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_ELEMENT_CONTENT,
5492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "RNG Internal error, noop found in element\n",
5493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        child = child->next;
5498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->define = olddefine;
5500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParsePatterns:
5505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  list of nodes
5507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @group:  use an implicit <group> for elements
5508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG start node.
5510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the definition pointer or NULL in case of error.
5512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParsePatterns(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes,
5515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        int group)
5516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL, last = NULL, cur, parent;
5518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    parent = ctxt->def;
5520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (nodes != NULL) {
5521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_RELAXNG(nodes, "element")) {
5522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGParseElement(ctxt, nodes);
5523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def == NULL) {
5524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def = last = cur;
5525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((group == 1) && (def->type == XML_RELAXNG_ELEMENT) &&
5527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (def == last)) {
5528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def = xmlRelaxNGNewDefine(ctxt, nodes);
5529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->type = XML_RELAXNG_GROUP;
5530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def->content = last;
5531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last->next = cur;
5533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last = cur;
5534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = parent;
5536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGParsePattern(ctxt, nodes);
5538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur != NULL) {
5539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (def == NULL) {
5540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    def = last = cur;
5541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
5542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    last->next = cur;
5543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    last = cur;
5544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nodes = nodes->next;
5548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (def);
5550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseStart:
5554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  start children nodes
5556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG start node.
5558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
5560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseStart(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
5563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def = NULL, last;
5566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nodes == NULL) {
5568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY, "start has no children\n",
5569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL, NULL);
5570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
5571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_RELAXNG(nodes, "empty")) {
5573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, nodes);
5574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
5575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
5576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_EMPTY;
5577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nodes->children != NULL) {
5578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, nodes, XML_RNGP_EMPTY_CONTENT,
5579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "element empty is not empty\n", NULL, NULL);
5580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (IS_RELAXNG(nodes, "notAllowed")) {
5582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGNewDefine(ctxt, nodes);
5583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def == NULL)
5584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
5585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def->type = XML_RELAXNG_NOT_ALLOWED;
5586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nodes->children != NULL) {
5587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, nodes, XML_RNGP_NOTALLOWED_NOT_EMPTY,
5588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "element notAllowed is not empty\n", NULL, NULL);
5589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlRelaxNGParsePatterns(ctxt, nodes, 1);
5592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->grammar->start != NULL) {
5594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        last = ctxt->grammar->start;
5595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (last->next != NULL)
5596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            last = last->next;
5597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        last->next = def;
5598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->grammar->start = def;
5600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    nodes = nodes->next;
5602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nodes != NULL) {
5603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_START_CONTENT,
5604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "start more than one children\n", NULL, NULL);
5605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
5606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseGrammarContent:
5612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  grammar children nodes
5614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse the content of a RelaxNG grammar node.
5616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error
5618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseGrammarContent(xmlRelaxNGParserCtxtPtr ctxt,
5621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlNodePtr nodes)
5622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, tmp;
5624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (nodes == NULL) {
5626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_EMPTY,
5627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "grammar has no children\n", NULL, NULL);
5628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
5629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (nodes != NULL) {
5631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_RELAXNG(nodes, "start")) {
5632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (nodes->children == NULL) {
5633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, nodes, XML_RNGP_START_EMPTY,
5634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "start has no children\n", NULL, NULL);
5635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGParseStart(ctxt, nodes->children);
5637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp != 0)
5638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
5639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_RELAXNG(nodes, "define")) {
5641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlRelaxNGParseDefine(ctxt, nodes);
5642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != 0)
5643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
5644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (IS_RELAXNG(nodes, "include")) {
5645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlRelaxNGParseInclude(ctxt, nodes);
5646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != 0)
5647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
5648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT,
5650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "grammar has unexpected child %s\n", nodes->name,
5651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
5653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nodes = nodes->next;
5655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckReference:
5661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ref:  the ref
5662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name associated to the defines
5664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine attribute rule for all the define
5666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar using the same name.
5667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckReference(xmlRelaxNGDefinePtr ref,
5670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGParserCtxtPtr ctxt,
5671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         const xmlChar * name)
5672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr grammar;
5674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr def, cur;
5675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5676df143a5041f03a22808b59c76698770b74692815Selim Gurun    /*
5677df143a5041f03a22808b59c76698770b74692815Selim Gurun     * Those rules don't apply to imported ref from xmlRelaxNGParseImportRef
5678df143a5041f03a22808b59c76698770b74692815Selim Gurun     */
5679df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (ref->dflags & IS_EXTERNAL_REF)
5680df143a5041f03a22808b59c76698770b74692815Selim Gurun        return;
5681df143a5041f03a22808b59c76698770b74692815Selim Gurun
5682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    grammar = ctxt->grammar;
5683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar == NULL) {
5684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR,
5685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Internal error: no grammar in CheckReference %s\n",
5686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   name, NULL);
5687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ref->content != NULL) {
5690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, ref->node, XML_ERR_INTERNAL_ERROR,
5691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Internal error: reference has content in CheckReference %s\n",
5692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   name, NULL);
5693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->defs != NULL) {
5696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        def = xmlHashLookup(grammar->defs, name);
5697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (def != NULL) {
5698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = ref;
5699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (cur != NULL) {
5700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->content = def;
5701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->nextHash;
5702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF,
5705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Reference %s has no matching definition\n", name,
5706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, ref->node, XML_RNGP_REF_NO_DEF,
5710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Reference %s has no matching definition\n", name,
5711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   NULL);
5712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckCombine:
5717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the define(s) list
5718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @name:  the name associated to the defines
5720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine attribute rule for all the define
5722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar using the same name.
5723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckCombine(xmlRelaxNGDefinePtr define,
5726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlRelaxNGParserCtxtPtr ctxt, const xmlChar * name)
5727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *combine;
5729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int choiceOrInterleave = -1;
5730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int missing = 0;
5731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur, last, tmp, tmp2;
5732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->nextHash == NULL)
5734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = define;
5736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
5737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        combine = xmlGetProp(cur->node, BAD_CAST "combine");
5738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (combine != NULL) {
5739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlStrEqual(combine, BAD_CAST "choice")) {
5740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (choiceOrInterleave == -1)
5741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave = 1;
5742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (choiceOrInterleave == 0) {
5743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE,
5744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Defines for %s use both 'choice' and 'interleave'\n",
5745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               name, NULL);
5746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(combine, BAD_CAST "interleave")) {
5748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (choiceOrInterleave == -1)
5749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave = 0;
5750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (choiceOrInterleave == 1) {
5751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, define->node, XML_RNGP_DEF_CHOICE_AND_INTERLEAVE,
5752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Defines for %s use both 'choice' and 'interleave'\n",
5753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               name, NULL);
5754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, define->node, XML_RNGP_UNKNOWN_COMBINE,
5757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Defines for %s use unknown combine value '%s''\n",
5758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           name, combine);
5759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(combine);
5761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (missing == 0)
5763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                missing = 1;
5764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else {
5765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, define->node, XML_RNGP_NEED_COMBINE,
5766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Some defines for %s needs the combine attribute\n",
5767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           name, NULL);
5768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->nextHash;
5772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
5774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
5775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlRelaxNGCheckCombine(): merging %s defines: %d\n",
5776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    name, choiceOrInterleave);
5777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == -1)
5779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        choiceOrInterleave = 0;
5780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGNewDefine(ctxt, define->node);
5781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
5782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == 0)
5784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->type = XML_RELAXNG_INTERLEAVE;
5785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->type = XML_RELAXNG_CHOICE;
5787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = define;
5788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    last = NULL;
5789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (tmp != NULL) {
5790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp->content != NULL) {
5791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp->content->next != NULL) {
5792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
5793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * we need first to create a wrapper.
5794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
5795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp2 = xmlRelaxNGNewDefine(ctxt, tmp->content->node);
5796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp2 == NULL)
5797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
5798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp2->type = XML_RELAXNG_GROUP;
5799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp2->content = tmp->content;
5800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp2 = tmp->content;
5802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (last == NULL) {
5804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->content = tmp2;
5805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                last->next = tmp2;
5807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            last = tmp2;
5809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp->content = cur;
5811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = tmp->nextHash;
5812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    define->content = cur;
5814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == 0) {
5815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->interleaves == NULL)
5816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->interleaves = xmlHashCreate(10);
5817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->interleaves == NULL) {
5818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
5819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Failed to create interleaves hash table\n", NULL,
5820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            char tmpname[32];
5823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++);
5825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) <
5826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                0) {
5827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, define->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
5828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Failed to add %s to hash table\n",
5829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   (const xmlChar *) tmpname, NULL);
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/**
5836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCombineStart:
5837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar:  the grammar
5839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Applies the 4.17. combine rule for all the start
5841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * element of a given grammar.
5842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
5844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCombineStart(xmlRelaxNGParserCtxtPtr ctxt,
5845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlRelaxNGGrammarPtr grammar)
5846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr starts;
5848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *combine;
5849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int choiceOrInterleave = -1;
5850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int missing = 0;
5851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
5852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    starts = grammar->start;
5854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((starts == NULL) || (starts->next == NULL))
5855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = starts;
5857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
5858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->node == NULL) || (cur->node->parent == NULL) ||
5859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (!xmlStrEqual(cur->node->parent->name, BAD_CAST "start"))) {
5860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            combine = NULL;
5861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, cur->node, XML_RNGP_START_MISSING,
5862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Internal error: start element not found\n", NULL,
5863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            combine = xmlGetProp(cur->node->parent, BAD_CAST "combine");
5866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (combine != NULL) {
5869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlStrEqual(combine, BAD_CAST "choice")) {
5870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (choiceOrInterleave == -1)
5871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave = 1;
5872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (choiceOrInterleave == 0) {
5873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE,
5874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "<start> use both 'choice' and 'interleave'\n",
5875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(combine, BAD_CAST "interleave")) {
5878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (choiceOrInterleave == -1)
5879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave = 0;
5880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (choiceOrInterleave == 1) {
5881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur->node, XML_RNGP_START_CHOICE_AND_INTERLEAVE,
5882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "<start> use both 'choice' and 'interleave'\n",
5883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
5884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
5885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
5886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_UNKNOWN_COMBINE,
5887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "<start> uses unknown combine value '%s''\n",
5888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           combine, NULL);
5889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFree(combine);
5891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (missing == 0)
5893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                missing = 1;
5894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else {
5895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_NEED_COMBINE,
5896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Some <start> element miss the combine attribute\n",
5897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
5898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
5902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
5904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
5905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "xmlRelaxNGCombineStart(): merging <start>: %d\n",
5906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    choiceOrInterleave);
5907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
5908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == -1)
5909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        choiceOrInterleave = 0;
5910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGNewDefine(ctxt, starts->node);
5911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == NULL)
5912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
5913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == 0)
5914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->type = XML_RELAXNG_INTERLEAVE;
5915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
5916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->type = XML_RELAXNG_CHOICE;
5917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur->content = grammar->start;
5918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    grammar->start = cur;
5919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (choiceOrInterleave == 0) {
5920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->interleaves == NULL)
5921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->interleaves = xmlHashCreate(10);
5922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->interleaves == NULL) {
5923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
5924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "Failed to create interleaves hash table\n", NULL,
5925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
5926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            char tmpname[32];
5928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            snprintf(tmpname, 32, "interleave%d", ctxt->nbInterleaves++);
5930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlHashAddEntry(ctxt->interleaves, BAD_CAST tmpname, cur) <
5931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                0) {
5932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_INTERLEAVE_CREATE_FAILED,
5933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Failed to add %s to hash table\n",
5934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			   (const xmlChar *) tmpname, NULL);
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/**
5941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckCycles:
5942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  grammar children nodes
5944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @depth:  the counter
5945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for cycles.
5947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if check passed, and -1 in case of error
5949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
5951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckCycles(xmlRelaxNGParserCtxtPtr ctxt,
5952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlRelaxNGDefinePtr cur, int depth)
5953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
5955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((ret == 0) && (cur != NULL)) {
5957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_REF) ||
5958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARENTREF)) {
5959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->depth == -1) {
5960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = depth;
5961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth);
5962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = -2;
5963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (depth == cur->depth) {
5964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_CYCLE,
5965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Detected a cycle in %s references\n",
5966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           cur->name, NULL);
5967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (-1);
5968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
5969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_ELEMENT) {
5970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth + 1);
5971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
5972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGCheckCycles(ctxt, cur->content, depth);
5973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
5974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
5975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
5976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
5977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
5978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
5979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
5980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGTryUnlink:
5981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
5982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the definition to unlink
5983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @parent:  the parent definition
5984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prev:  the previous sibling definition
5985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to unlink a definition. If not possble make it a NOOP
5987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
5988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new prev definition
5989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
5990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGDefinePtr
5991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGTryUnlink(xmlRelaxNGParserCtxtPtr ctxt ATTRIBUTE_UNUSED,
5992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDefinePtr cur,
5993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDefinePtr parent, xmlRelaxNGDefinePtr prev)
5994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
5995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (prev != NULL) {
5996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        prev->next = cur->next;
5997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
5998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (parent != NULL) {
5999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (parent->content == cur)
6000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->content = cur->next;
6001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (parent->attrs == cur)
6002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->attrs = cur->next;
6003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (parent->nameClass == cur)
6004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->nameClass = cur->next;
6005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->type = XML_RELAXNG_NOOP;
6007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            prev = cur;
6008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (prev);
6011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSimplify:
6015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  grammar children nodes
6017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for simplification of empty and notAllowed
6019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
6021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSimplify(xmlRelaxNGParserCtxtPtr ctxt,
6022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   xmlRelaxNGDefinePtr cur, xmlRelaxNGDefinePtr parent)
6023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr prev = NULL;
6025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
6027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_REF) ||
6028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARENTREF)) {
6029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->depth != -3) {
6030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = -3;
6031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGSimplify(ctxt, cur->content, cur);
6032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) {
6034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = parent;
6035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((parent != NULL) &&
6036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ((parent->type == XML_RELAXNG_ATTRIBUTE) ||
6037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_LIST) ||
6038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_GROUP) ||
6039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_INTERLEAVE) ||
6040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_ONEORMORE) ||
6041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_ZEROORMORE))) {
6042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->type = XML_RELAXNG_NOT_ALLOWED;
6043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
6044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((parent != NULL) && (parent->type == XML_RELAXNG_CHOICE)) {
6046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else
6048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = cur;
6049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_EMPTY) {
6050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = parent;
6051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((parent != NULL) &&
6052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ((parent->type == XML_RELAXNG_ONEORMORE) ||
6053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_ZEROORMORE))) {
6054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                parent->type = XML_RELAXNG_EMPTY;
6055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
6056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((parent != NULL) &&
6058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ((parent->type == XML_RELAXNG_GROUP) ||
6059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (parent->type == XML_RELAXNG_INTERLEAVE))) {
6060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else
6062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = cur;
6063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur->parent = parent;
6065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->content != NULL)
6066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGSimplify(ctxt, cur->content, cur);
6067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->type != XML_RELAXNG_VALUE) && (cur->attrs != NULL))
6068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGSimplify(ctxt, cur->attrs, cur);
6069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->nameClass != NULL)
6070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGSimplify(ctxt, cur->nameClass, cur);
6071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * On Elements, try to move attribute only generating rules on
6073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * the attrs rules.
6074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->type == XML_RELAXNG_ELEMENT) {
6076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int attronly;
6077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr tmp, pre;
6078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (cur->content != NULL) {
6080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    attronly =
6081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGGenerateAttributes(ctxt, cur->content);
6082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (attronly == 1) {
6083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
6084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * migrate cur->content to attrs
6085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
6086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = cur->content;
6087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->content = tmp->next;
6088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp->next = cur->attrs;
6089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->attrs = tmp;
6090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
6091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
6092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * cur->content can generate elements or text
6093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
6094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
6095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
6096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                pre = cur->content;
6098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((pre != NULL) && (pre->next != NULL)) {
6099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = pre->next;
6100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    attronly = xmlRelaxNGGenerateAttributes(ctxt, tmp);
6101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (attronly == 1) {
6102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
6103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * migrate tmp to attrs
6104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
6105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pre->next = tmp->next;
6106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp->next = cur->attrs;
6107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->attrs = tmp;
6108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
6109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        pre = tmp;
6110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
6111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * This may result in a simplification
6115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->type == XML_RELAXNG_GROUP) ||
6117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->type == XML_RELAXNG_INTERLEAVE)) {
6118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->content == NULL)
6119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->type = XML_RELAXNG_EMPTY;
6120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                else if (cur->content->next == NULL) {
6121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((parent == NULL) && (prev == NULL)) {
6122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->type = XML_RELAXNG_NOOP;
6123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if (prev == NULL) {
6124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        parent->content = cur->content;
6125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->content->next = cur->next;
6126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur = cur->content;
6127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
6128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur->content->next = cur->next;
6129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        prev->next = cur->content;
6130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur = cur->content;
6131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
6132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * the current node may have been transformed back
6136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->type == XML_RELAXNG_EXCEPT) &&
6138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->content != NULL) &&
6139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->content->type == XML_RELAXNG_NOT_ALLOWED)) {
6140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (cur->type == XML_RELAXNG_NOT_ALLOWED) {
6142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((parent != NULL) &&
6143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((parent->type == XML_RELAXNG_ATTRIBUTE) ||
6144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_LIST) ||
6145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_GROUP) ||
6146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_INTERLEAVE) ||
6147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_ONEORMORE) ||
6148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_ZEROORMORE))) {
6149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    parent->type = XML_RELAXNG_NOT_ALLOWED;
6150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
6151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((parent != NULL) &&
6153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (parent->type == XML_RELAXNG_CHOICE)) {
6154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
6156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev = cur;
6157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (cur->type == XML_RELAXNG_EMPTY) {
6158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((parent != NULL) &&
6159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((parent->type == XML_RELAXNG_ONEORMORE) ||
6160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_ZEROORMORE))) {
6161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    parent->type = XML_RELAXNG_EMPTY;
6162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
6163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((parent != NULL) &&
6165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((parent->type == XML_RELAXNG_GROUP) ||
6166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_INTERLEAVE) ||
6167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (parent->type == XML_RELAXNG_CHOICE))) {
6168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev = xmlRelaxNGTryUnlink(ctxt, cur, parent, prev);
6169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
6170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prev = cur;
6171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
6172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prev = cur;
6173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
6176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGroupContentType:
6181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct1:  the first content type
6182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct2:  the second content type
6183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Try to group 2 content types
6185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type
6187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType
6189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGroupContentType(xmlRelaxNGContentType ct1,
6190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlRelaxNGContentType ct2)
6191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_ERROR) ||
6193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_ERROR))
6194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_ERROR);
6195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ct1 == XML_RELAXNG_CONTENT_EMPTY)
6196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ct2);
6197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ct2 == XML_RELAXNG_CONTENT_EMPTY)
6198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ct1);
6199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) &&
6200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_COMPLEX))
6201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_COMPLEX);
6202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (XML_RELAXNG_CONTENT_ERROR);
6203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGMaxContentType:
6207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct1:  the first content type
6208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ct2:  the second content type
6209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Compute the max content-type
6211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type
6213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType
6215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGMaxContentType(xmlRelaxNGContentType ct1,
6216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGContentType ct2)
6217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_ERROR) ||
6219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_ERROR))
6220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_ERROR);
6221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_SIMPLE) ||
6222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_SIMPLE))
6223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_SIMPLE);
6224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ct1 == XML_RELAXNG_CONTENT_COMPLEX) ||
6225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ct2 == XML_RELAXNG_CONTENT_COMPLEX))
6226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (XML_RELAXNG_CONTENT_COMPLEX);
6227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (XML_RELAXNG_CONTENT_EMPTY);
6228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCheckRules:
6232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @cur:  the current definition
6234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @flags:  some accumulated flags
6235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ptype:  the parent type
6236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check for rules in section 7.1 and 7.2
6238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the content type of @cur
6240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGContentType
6242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCheckRules(xmlRelaxNGParserCtxtPtr ctxt,
6243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlRelaxNGDefinePtr cur, int flags,
6244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     xmlRelaxNGType ptype)
6245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6246df143a5041f03a22808b59c76698770b74692815Selim Gurun    int nflags;
6247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGContentType ret, tmp, val = XML_RELAXNG_CONTENT_EMPTY;
6248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
6250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = XML_RELAXNG_CONTENT_EMPTY;
6251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->type == XML_RELAXNG_REF) ||
6252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_PARENTREF)) {
6253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           /*
6254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            * This should actually be caught by list//element(ref) at the
6255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            * element boundaries, c.f. Bug #159968 local refs are dropped
6256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            * in step 4.19.
6257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            */
6258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
6259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_REF,
6261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//ref\n", NULL,
6262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_REF,
6267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//ref\n",
6268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6270df143a5041f03a22808b59c76698770b74692815Selim Gurun            if (cur->content == NULL) {
6271df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (cur->type == XML_RELAXNG_PARENTREF)
6272df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF,
6273df143a5041f03a22808b59c76698770b74692815Selim Gurun                               "Internal found no define for parent refs\n",
6274df143a5041f03a22808b59c76698770b74692815Selim Gurun                               NULL, NULL);
6275df143a5041f03a22808b59c76698770b74692815Selim Gurun                else
6276df143a5041f03a22808b59c76698770b74692815Selim Gurun                    xmlRngPErr(ctxt, cur->node, XML_RNGP_REF_NO_DEF,
6277df143a5041f03a22808b59c76698770b74692815Selim Gurun                               "Internal found no define for ref %s\n",
6278df143a5041f03a22808b59c76698770b74692815Selim Gurun                               (cur->name ? cur->name: BAD_CAST "null"), NULL);
6279df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
6280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->depth > -4) {
6281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = -4;
6282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGCheckRules(ctxt, cur->content,
6283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           flags, cur->type);
6284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur->depth = ret - 15;
6285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (cur->depth == -4) {
6286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = XML_RELAXNG_CONTENT_COMPLEX;
6287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
6288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = (xmlRelaxNGContentType) (cur->depth + 15);
6289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_ELEMENT) {
6291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * The 7.3 Attribute derivation rule for groups is plugged there
6293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckGroupAttrs(ctxt, cur);
6295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ELEM,
6297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//element(ref)\n",
6298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ELEM,
6302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//element(ref)\n",
6303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
6306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM,
6307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern attribute//element(ref)\n",
6308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
6311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ELEM,
6312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern attribute//element(ref)\n",
6313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * reset since in the simple form elements are only child
6317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * of grammar/define
6318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nflags = 0;
6320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->attrs, nflags, cur->type);
6322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != XML_RELAXNG_CONTENT_EMPTY) {
6323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_EMPTY,
6324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Element %s attributes have a content type error\n",
6325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           cur->name, NULL);
6326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == XML_RELAXNG_CONTENT_ERROR) {
6331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_ELEM_CONTENT_ERROR,
6332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Element %s has a content type error\n",
6333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           cur->name, NULL);
6334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
6335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = XML_RELAXNG_CONTENT_COMPLEX;
6336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_ATTRIBUTE) {
6338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ATTRIBUTE) {
6339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ATTR_ATTR,
6340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern attribute//attribute\n",
6341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_ATTR,
6345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//attribute\n",
6346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_OOMGROUP) {
6349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_GROUP_ATTR,
6350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern oneOrMore//group//attribute\n",
6351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_OOMINTERLEAVE) {
6354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_ONEMORE_INTERLEAVE_ATTR,
6355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern oneOrMore//interleave//attribute\n",
6356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ATTR,
6360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//attribute\n",
6361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ATTR,
6365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//attribute\n",
6366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((!(flags & XML_RELAXNG_IN_ONEORMORE))
6369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                && (cur->name == NULL)) {
6370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->ns == NULL) {
6371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur->node, XML_RNGP_ANYNAME_ATTR_ANCESTOR,
6372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Found anyName attribute without oneOrMore ancestor\n",
6373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
6374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
6375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur->node, XML_RNGP_NSNAME_ATTR_ANCESTOR,
6376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Found nsName attribute without oneOrMore ancestor\n",
6377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               NULL, NULL);
6378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nflags = flags | XML_RELAXNG_IN_ATTRIBUTE;
6381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckRules(ctxt, cur->content, nflags, cur->type);
6382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_EMPTY;
6383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if ((cur->type == XML_RELAXNG_ONEORMORE) ||
6384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_ZEROORMORE)) {
6385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_ONEMORE,
6387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//oneOrMore\n",
6388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_ONEMORE,
6392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//oneOrMore\n",
6393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nflags = flags | XML_RELAXNG_IN_ONEORMORE;
6396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGGroupContentType(ret, ret);
6400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_LIST) {
6401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_LIST,
6403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//list\n", NULL,
6404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_LIST,
6408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//list\n",
6409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_LIST,
6413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//list\n", NULL,
6414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            nflags = flags | XML_RELAXNG_IN_LIST;
6417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_GROUP) {
6421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_GROUP,
6423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//group\n",
6424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_GROUP,
6428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//group\n", NULL,
6429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ONEORMORE)
6432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags | XML_RELAXNG_IN_OOMGROUP;
6433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
6434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags;
6435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
6439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * The 7.3 Attribute derivation rule for groups is plugged there
6440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
6441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckGroupAttrs(ctxt, cur);
6442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_INTERLEAVE) {
6443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_INTERLEAVE,
6445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//interleave\n",
6446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE,
6450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//interleave\n",
6451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_INTERLEAVE,
6455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//interleave\n",
6456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_ONEORMORE)
6459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags | XML_RELAXNG_IN_OOMINTERLEAVE;
6460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
6461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags;
6462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_EXCEPT) {
6466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->parent != NULL) &&
6467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->parent->type == XML_RELAXNG_DATATYPE))
6468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags | XML_RELAXNG_IN_DATAEXCEPT;
6469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
6470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nflags = flags;
6471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, nflags,
6473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     cur->type);
6474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_DATATYPE) {
6475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_DATA,
6477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//data\n", NULL,
6478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
6481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_SIMPLE;
6482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_VALUE) {
6483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_VALUE,
6485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//value\n", NULL,
6486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
6489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_SIMPLE;
6490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_TEXT) {
6491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_LIST) {
6492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_LIST_TEXT,
6493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern list//text\n", NULL,
6494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_TEXT,
6498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//text\n",
6499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_TEXT,
6503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//text\n", NULL,
6504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_COMPLEX;
6507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_EMPTY) {
6508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_DATAEXCEPT) {
6509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_DATA_EXCEPT_EMPTY,
6510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern data/except//empty\n",
6511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL, NULL);
6512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (flags & XML_RELAXNG_IN_START) {
6514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, cur->node, XML_RNGP_PAT_START_EMPTY,
6515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Found forbidden pattern start//empty\n", NULL,
6516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           NULL);
6517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = XML_RELAXNG_CONTENT_EMPTY;
6519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (cur->type == XML_RELAXNG_CHOICE) {
6520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckChoiceDeterminism(ctxt, cur);
6521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
6523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
6525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCheckRules(ctxt, cur->content, flags, cur->type);
6526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
6528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ptype == XML_RELAXNG_GROUP) {
6529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            val = xmlRelaxNGGroupContentType(val, ret);
6530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ptype == XML_RELAXNG_INTERLEAVE) {
6531df143a5041f03a22808b59c76698770b74692815Selim Gurun            /*
6532df143a5041f03a22808b59c76698770b74692815Selim Gurun             * TODO: scan complain that tmp is never used, seems on purpose
6533df143a5041f03a22808b59c76698770b74692815Selim Gurun             *       need double-checking
6534df143a5041f03a22808b59c76698770b74692815Selim Gurun             */
6535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlRelaxNGGroupContentType(val, ret);
6536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != XML_RELAXNG_CONTENT_ERROR)
6537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGMaxContentType(val, ret);
6538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ptype == XML_RELAXNG_CHOICE) {
6539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            val = xmlRelaxNGMaxContentType(val, ret);
6540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ptype == XML_RELAXNG_LIST) {
6541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            val = XML_RELAXNG_CONTENT_SIMPLE;
6542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ptype == XML_RELAXNG_EXCEPT) {
6543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == XML_RELAXNG_CONTENT_ERROR)
6544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                val = XML_RELAXNG_CONTENT_ERROR;
6545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
6546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                val = XML_RELAXNG_CONTENT_SIMPLE;
6547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            val = xmlRelaxNGGroupContentType(val, ret);
6549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (val);
6553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseGrammar:
6557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @nodes:  grammar children nodes
6559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a Relax-NG <grammar> node
6561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal xmlRelaxNGGrammarPtr built or
6563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
6564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGGrammarPtr
6566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseGrammar(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr nodes)
6567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr ret, tmp, old;
6569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_GRAMMAR
6571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "Parsing a new grammar\n");
6572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGNewGrammar(ctxt);
6575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL)
6576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Link the new grammar in the tree
6580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->parent = ctxt->grammar;
6582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->grammar != NULL) {
6583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp = ctxt->grammar->children;
6584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == NULL) {
6585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar->children = ret;
6586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
6587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (tmp->next != NULL)
6588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = tmp->next;
6589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp->next = ret;
6590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    old = ctxt->grammar;
6594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->grammar = ret;
6595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGParseGrammarContent(ctxt, nodes);
6596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->grammar = ret;
6597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->grammar == NULL) {
6598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_CONTENT,
6599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Failed to parse <grammar> content\n", NULL, NULL);
6600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->grammar->start == NULL) {
6601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, nodes, XML_RNGP_GRAMMAR_NO_START,
6602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "Element <grammar> has no <start>\n", NULL, NULL);
6603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Apply 4.17 mergingd rules to defines and starts
6607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGCombineStart(ctxt, ret);
6609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->defs != NULL) {
6610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashScan(ret->defs, (xmlHashScanner) xmlRelaxNGCheckCombine,
6611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt);
6612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
6615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * link together defines and refs in this grammar
6616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
6617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret->refs != NULL) {
6618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashScan(ret->refs, (xmlHashScanner) xmlRelaxNGCheckReference,
6619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt);
6620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6622df143a5041f03a22808b59c76698770b74692815Selim Gurun
662360a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott    /* @@@@ */
662460a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott
6625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->grammar = old;
6626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParseDocument:
6631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the root node of the RelaxNG schema
6633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a Relax-NG definition resource and build an internal
6635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNG struture which can be used to validate instances.
6636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML RelaxNG structure built or
6638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
6639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRelaxNGPtr
6641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParseDocument(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
6642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema = NULL;
6644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *olddefine;
6645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr old;
6646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (node == NULL))
6648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    schema = xmlRelaxNGNewRelaxNG(ctxt);
6651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
6652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    olddefine = ctxt->define;
6655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->define = NULL;
6656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (IS_RELAXNG(node, "grammar")) {
6657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        schema->topgrammar = xmlRelaxNGParseGrammar(ctxt, node->children);
6658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGGrammarPtr tmp, ret;
6660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        schema->topgrammar = ret = xmlRelaxNGNewGrammar(ctxt);
6662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (schema->topgrammar == NULL) {
6663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (schema);
6664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
6666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Link the new grammar in the tree
6667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
6668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->parent = ctxt->grammar;
6669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->grammar != NULL) {
6670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = ctxt->grammar->children;
6671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == NULL) {
6672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->grammar->children = ret;
6673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
6674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (tmp->next != NULL)
6675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = tmp->next;
6676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp->next = ret;
6677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        old = ctxt->grammar;
6680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->grammar = ret;
6681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGParseStart(ctxt, node);
6682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (old != NULL)
6683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->grammar = old;
6684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->define = olddefine;
6686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->topgrammar->start != NULL) {
6687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGCheckCycles(ctxt, schema->topgrammar->start, 0);
6688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & XML_RELAXNG_IN_EXTERNALREF) == 0) {
6689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGSimplify(ctxt, schema->topgrammar->start, NULL);
6690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((schema->topgrammar->start != NULL) &&
6691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (schema->topgrammar->start->type == XML_RELAXNG_NOOP) &&
6692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (schema->topgrammar->start->next != NULL))
6693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                schema->topgrammar->start =
6694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    schema->topgrammar->start->content;
6695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGCheckRules(ctxt, schema->topgrammar->start,
6696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 XML_RELAXNG_IN_START, XML_RELAXNG_NOOP);
6697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
6700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL)
6701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
6702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "xmlRelaxNGParseDocument() failed\n");
6703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
6704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (schema);
6706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
670994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
671094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Reading RelaxNGs				*
671194442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
6712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
6713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewParserCtxt:
6716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @URL:  the location of the schema
6717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parse context for that file/resource expected
6719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML RelaxNGs file.
6720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
6722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr
6724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewParserCtxt(const char *URL)
6725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGParserCtxtPtr ret;
6727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (URL == NULL)
6729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret =
6732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
6733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(NULL, "building parser\n");
6735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGParserCtxt));
6738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->URL = xmlStrdup((const xmlChar *) URL);
6739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->error = xmlGenericError;
6740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->userData = xmlGenericErrorContext;
6741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewMemParserCtxt:
6746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @buffer:  a pointer to a char array containing the schemas
6747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @size:  the size of the array
6748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parse context for that memory buffer expected
6750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * to contain an XML RelaxNGs file.
6751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
6753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr
6755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewMemParserCtxt(const char *buffer, int size)
6756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGParserCtxtPtr ret;
6758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((buffer == NULL) || (size <= 0))
6760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret =
6763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
6764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(NULL, "building parser\n");
6766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGParserCtxt));
6769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->buffer = buffer;
6770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->size = size;
6771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->error = xmlGenericError;
6772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->userData = xmlGenericErrorContext;
6773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewDocParserCtxt:
6778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a preparsed document tree
6779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs parser context for that document.
6781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Note: since the process of compiling a RelaxNG schemas modifies the
6782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *       document, the @doc parameter is duplicated internally.
6783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the parser context or NULL in case of error
6785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParserCtxtPtr
6787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewDocParserCtxt(xmlDocPtr doc)
6788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGParserCtxtPtr ret;
6790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr copy;
6791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL)
6793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    copy = xmlCopyDoc(doc, 1);
6795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (copy == NULL)
6796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret =
6799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (xmlRelaxNGParserCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGParserCtxt));
6800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
6801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErrMemory(NULL, "building parser\n");
6802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
6803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGParserCtxt));
6805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->document = copy;
6806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->freedoc = 1;
6807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->userData = xmlGenericErrorContext;
6808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
6809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeParserCtxt:
6813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema parser context
6814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema parser context
6816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
6818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeParserCtxt(xmlRelaxNGParserCtxtPtr ctxt)
6819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
6821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
6822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->URL != NULL)
6823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->URL);
6824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->doc != NULL)
6825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeDocument(ctxt->doc);
6826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->interleaves != NULL)
6827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashFree(ctxt->interleaves, NULL);
6828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->documents != NULL)
6829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeDocumentList(ctxt->documents);
6830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->includes != NULL)
6831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeIncludeList(ctxt->includes);
6832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->docTab != NULL)
6833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->docTab);
6834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->incTab != NULL)
6835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->incTab);
6836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->defTab != NULL) {
6837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
6838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->defNr; i++)
6840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeDefine(ctxt->defTab[i]);
6841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->defTab);
6842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->document != NULL) && (ctxt->freedoc))
6844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(ctxt->document);
6845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
6846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNormExtSpace:
6850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  a value
6851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Removes the leading and ending spaces of the value
6853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * The string is modified "in situ"
6854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
6856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNormExtSpace(xmlChar * value)
6857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *start = value;
6859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cur = value;
6860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (value == NULL)
6862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
6863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*cur))
6865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
6866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == start) {
6867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
6868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((*cur != 0) && (!IS_BLANK_CH(*cur)))
6869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur++;
6870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == 0)
6871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return;
6872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            start = cur;
6873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (IS_BLANK_CH(*cur))
6874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur++;
6875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == 0) {
6876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *start = 0;
6877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return;
6878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (1);
6880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
6881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
6882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((*cur != 0) && (!IS_BLANK_CH(*cur)))
6883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *start++ = *cur++;
6884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == 0) {
6885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *start = 0;
6886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return;
6887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* don't try to normalize the inner spaces */
6889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (IS_BLANK_CH(*cur))
6890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur++;
6891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*cur == 0) {
6892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                *start = 0;
6893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return;
6894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            *start++ = *cur++;
6896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (1);
6897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupAttributes:
6902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  a Relax-NG node
6904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check all the attributes on the given node
6906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
6908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupAttributes(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr node)
6909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr cur, next;
6911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = node->properties;
6913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
6914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        next = cur->next;
6915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur->ns == NULL) ||
6916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) {
6917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlStrEqual(cur->name, BAD_CAST "name")) {
6918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((!xmlStrEqual(node->name, BAD_CAST "element")) &&
6919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "attribute")) &&
6920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "ref")) &&
6921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "parentRef")) &&
6922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "param")) &&
6923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "define"))) {
6924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
6925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Attribute %s is not allowed on %s\n",
6926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->name, node->name);
6927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(cur->name, BAD_CAST "type")) {
6929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((!xmlStrEqual(node->name, BAD_CAST "value")) &&
6930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "data"))) {
6931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
6932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Attribute %s is not allowed on %s\n",
6933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->name, node->name);
6934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(cur->name, BAD_CAST "href")) {
6936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((!xmlStrEqual(node->name, BAD_CAST "externalRef")) &&
6937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "include"))) {
6938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
6939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Attribute %s is not allowed on %s\n",
6940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->name, node->name);
6941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(cur->name, BAD_CAST "combine")) {
6943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((!xmlStrEqual(node->name, BAD_CAST "start")) &&
6944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (!xmlStrEqual(node->name, BAD_CAST "define"))) {
6945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, node, XML_RNGP_FORBIDDEN_ATTRIBUTE,
6946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "Attribute %s is not allowed on %s\n",
6947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->name, node->name);
6948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (xmlStrEqual(cur->name, BAD_CAST "datatypeLibrary")) {
6950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *val;
6951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlURIPtr uri;
6952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                val = xmlNodeListGetString(node->doc, cur->children, 1);
6954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val != NULL) {
6955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (val[0] != 0) {
6956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        uri = xmlParseURI((const char *) val);
6957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (uri == NULL) {
6958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRngPErr(ctxt, node, XML_RNGP_INVALID_URI,
6959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       "Attribute %s contains invalid URI %s\n",
6960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       cur->name, val);
6961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
6962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (uri->scheme == NULL) {
6963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRngPErr(ctxt, node, XML_RNGP_URI_NOT_ABSOLUTE,
6964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           "Attribute %s URI %s is not absolute\n",
6965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           cur->name, val);
6966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
6967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (uri->fragment != NULL) {
6968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRngPErr(ctxt, node, XML_RNGP_URI_FRAGMENT,
6969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           "Attribute %s URI %s has a fragment ID\n",
6970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           cur->name, val);
6971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
6972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFreeURI(uri);
6973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
6974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
6975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(val);
6976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
6977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (!xmlStrEqual(cur->name, BAD_CAST "ns")) {
6978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRngPErr(ctxt, node, XML_RNGP_UNKNOWN_ATTRIBUTE,
6979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           "Unknown attribute %s on %s\n", cur->name,
6980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           node->name);
6981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
6982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
6983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = next;
6984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
6985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
6986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
6987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
6988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupTree:
6989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
6990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @root:  an xmlNodePtr subtree
6991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
6992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the subtree from unwanted nodes for parsing, resolve
6993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Include and externalRef lookups.
6994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
6995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
6996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupTree(xmlRelaxNGParserCtxtPtr ctxt, xmlNodePtr root)
6997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
6998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur, delete;
6999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    delete = NULL;
7001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = root;
7002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
7003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (delete != NULL) {
7004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlUnlinkNode(delete);
7005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlFreeNode(delete);
7006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            delete = NULL;
7007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type == XML_ELEMENT_NODE) {
7009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
7010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * Simplification 4.1. Annotations
7011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
7012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->ns == NULL) ||
7013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (!xmlStrEqual(cur->ns->href, xmlRelaxNGNs))) {
7014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((cur->parent != NULL) &&
7015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (cur->parent->type == XML_ELEMENT_NODE) &&
7016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((xmlStrEqual(cur->parent->name, BAD_CAST "name")) ||
7017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (xmlStrEqual(cur->parent->name, BAD_CAST "value")) ||
7018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (xmlStrEqual(cur->parent->name, BAD_CAST "param")))) {
7019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRngPErr(ctxt, cur, XML_RNGP_FOREIGN_ELEMENT,
7020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               "element %s doesn't allow foreign elements\n",
7021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->parent->name, NULL);
7022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                delete = cur;
7024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto skip_children;
7025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
7026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGCleanupAttributes(ctxt, cur);
7027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual(cur->name, BAD_CAST "externalRef")) {
7028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *href, *ns, *base, *URL;
7029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDocumentPtr docu;
7030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr tmp;
7031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlURIPtr uri;
7032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ns = xmlGetProp(cur, BAD_CAST "ns");
7034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns == NULL) {
7035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = cur->parent;
7036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while ((tmp != NULL) &&
7037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (tmp->type == XML_ELEMENT_NODE)) {
7038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ns = xmlGetProp(tmp, BAD_CAST "ns");
7039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ns != NULL)
7040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                break;
7041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            tmp = tmp->parent;
7042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    href = xmlGetProp(cur, BAD_CAST "href");
7045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href == NULL) {
7046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF,
7047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "xmlRelaxNGParse: externalRef has no href attribute\n",
7048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL, NULL);
7049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    uri = xmlParseURI((const char *) href);
7055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (uri == NULL) {
7056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR,
7057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Incorrect URI for externalRef %s\n",
7058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   href, NULL);
7059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (href != NULL)
7062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(href);
7063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (uri->fragment != NULL) {
7067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR,
7068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			       "Fragment forbidden in URI for externalRef %s\n",
7069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   href, NULL);
7070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        xmlFreeURI(uri);
7073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (href != NULL)
7074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(href);
7075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlFreeURI(uri);
7079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    base = xmlNodeGetBase(cur->doc, cur);
7080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    URL = xmlBuildURI(href, base);
7081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (URL == NULL) {
7082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR,
7083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Failed to compute URL for externalRef %s\n",
7084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   href, NULL);
7085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (href != NULL)
7088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(href);
7089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (base != NULL)
7090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(base);
7091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href != NULL)
7095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(href);
7096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (base != NULL)
7097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(base);
7098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    docu = xmlRelaxNGLoadExternalRef(ctxt, URL, ns);
7099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (docu == NULL) {
7100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_EXTERNAL_REF_FAILURE,
7101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Failed to load externalRef %s\n", URL,
7102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL);
7103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL)
7104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(URL);
7106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns != NULL)
7110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(ns);
7111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(URL);
7112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->psvi = docu;
7113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (xmlStrEqual(cur->name, BAD_CAST "include")) {
7114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *href, *ns, *base, *URL;
7115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGIncludePtr incl;
7116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr tmp;
7117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    href = xmlGetProp(cur, BAD_CAST "href");
7119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href == NULL) {
7120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_MISSING_HREF,
7121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "xmlRelaxNGParse: include has no href attribute\n",
7122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL, NULL);
7123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    base = xmlNodeGetBase(cur->doc, cur);
7127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    URL = xmlBuildURI(href, base);
7128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (URL == NULL) {
7129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_HREF_ERROR,
7130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Failed to compute URL for include %s\n",
7131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   href, NULL);
7132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (href != NULL)
7133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(href);
7134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (base != NULL)
7135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(base);
7136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (href != NULL)
7140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(href);
7141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (base != NULL)
7142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(base);
7143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ns = xmlGetProp(cur, BAD_CAST "ns");
7144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns == NULL) {
7145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = cur->parent;
7146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while ((tmp != NULL) &&
7147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (tmp->type == XML_ELEMENT_NODE)) {
7148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ns = xmlGetProp(tmp, BAD_CAST "ns");
7149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ns != NULL)
7150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                break;
7151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            tmp = tmp->parent;
7152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    incl = xmlRelaxNGLoadInclude(ctxt, URL, cur, ns);
7155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns != NULL)
7156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(ns);
7157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (incl == NULL) {
7158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur, XML_RNGP_INCLUDE_FAILURE,
7159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Failed to load include %s\n", URL,
7160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL);
7161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(URL);
7162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(URL);
7166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur->psvi = incl;
7167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((xmlStrEqual(cur->name, BAD_CAST "element")) ||
7168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (xmlStrEqual(cur->name, BAD_CAST "attribute")))
7169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                {
7170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *name, *ns;
7171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr text = NULL;
7172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Simplification 4.8. name attribute of element
7175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * and attribute elements
7176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    name = xmlGetProp(cur, BAD_CAST "name");
7178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (name != NULL) {
7179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (cur->children == NULL) {
7180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            text =
7181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlNewChild(cur, cur->ns, BAD_CAST "name",
7182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            name);
7183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
7184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlNodePtr node;
7185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            node = xmlNewDocNode(cur->doc, cur->ns,
7187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			                         BAD_CAST "name", NULL);
7188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (node != NULL) {
7189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlAddPrevSibling(cur->children, node);
7190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                text = xmlNewText(name);
7191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlAddChild(node, text);
7192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                text = node;
7193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (text == NULL) {
7196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRngPErr(ctxt, cur, XML_RNGP_CREATE_FAILURE,
7197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       "Failed to create a name %s element\n",
7198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       name, NULL);
7199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlUnsetProp(cur, BAD_CAST "name");
7201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(name);
7202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ns = xmlGetProp(cur, BAD_CAST "ns");
7203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL) {
7204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (text != NULL) {
7205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSetProp(text, BAD_CAST "ns", ns);
7206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                /* xmlUnsetProp(cur, BAD_CAST "ns"); */
7207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else if (xmlStrEqual(cur->name,
7210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               BAD_CAST "attribute")) {
7211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlSetProp(text, BAD_CAST "ns", BAD_CAST "");
7212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((xmlStrEqual(cur->name, BAD_CAST "name")) ||
7215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (xmlStrEqual(cur->name, BAD_CAST "nsName")) ||
7216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (xmlStrEqual(cur->name, BAD_CAST "value"))) {
7217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Simplification 4.8. name attribute of element
7219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * and attribute elements
7220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (xmlHasProp(cur, BAD_CAST "ns") == NULL) {
7222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlNodePtr node;
7223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlChar *ns = NULL;
7224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        node = cur->parent;
7226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while ((node != NULL) &&
7227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (node->type == XML_ELEMENT_NODE)) {
7228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ns = xmlGetProp(node, BAD_CAST "ns");
7229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ns != NULL) {
7230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                break;
7231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            node = node->parent;
7233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns == NULL) {
7235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlSetProp(cur, BAD_CAST "ns", BAD_CAST "");
7236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
7237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlSetProp(cur, BAD_CAST "ns", ns);
7238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(ns);
7239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (xmlStrEqual(cur->name, BAD_CAST "name")) {
7242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlChar *name, *local, *prefix;
7243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
7245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Simplification: 4.10. QNames
7246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
7247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        name = xmlNodeGetContent(cur);
7248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (name != NULL) {
7249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            local = xmlSplitQName2(name, &prefix);
7250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (local != NULL) {
7251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlNsPtr ns;
7252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ns = xmlSearchNs(cur->doc, cur, prefix);
7254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (ns == NULL) {
7255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlRngPErr(ctxt, cur,
7256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               XML_RNGP_PREFIX_UNDEFINED,
7257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               "xmlRelaxNGParse: no namespace for prefix %s\n",
7258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               prefix, NULL);
7259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                } else {
7260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlSetProp(cur, BAD_CAST "ns",
7261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               ns->href);
7262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlNodeSetContent(cur, local);
7263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
7264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlFree(local);
7265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlFree(prefix);
7266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(name);
7268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * 4.16
7272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (xmlStrEqual(cur->name, BAD_CAST "nsName")) {
7274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
7275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRngPErr(ctxt, cur,
7276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       XML_RNGP_PAT_NSNAME_EXCEPT_NSNAME,
7277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       "Found nsName/except//nsName forbidden construct\n",
7278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       NULL, NULL);
7279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((xmlStrEqual(cur->name, BAD_CAST "except")) &&
7282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (cur != root)) {
7283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int oldflags = ctxt->flags;
7284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * 4.16
7287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((cur->parent != NULL) &&
7289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (xmlStrEqual
7290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (cur->parent->name, BAD_CAST "anyName"))) {
7291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags |= XML_RELAXNG_IN_ANYEXCEPT;
7292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGCleanupTree(ctxt, cur);
7293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags = oldflags;
7294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if ((cur->parent != NULL) &&
7296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (xmlStrEqual
7297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                (cur->parent->name, BAD_CAST "nsName"))) {
7298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags |= XML_RELAXNG_IN_NSEXCEPT;
7299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGCleanupTree(ctxt, cur);
7300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags = oldflags;
7301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        goto skip_children;
7302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (xmlStrEqual(cur->name, BAD_CAST "anyName")) {
7304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * 4.16
7306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->flags & XML_RELAXNG_IN_ANYEXCEPT) {
7308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur,
7309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   XML_RNGP_PAT_ANYNAME_EXCEPT_ANYNAME,
7310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Found anyName/except//anyName forbidden construct\n",
7311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL, NULL);
7312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if (ctxt->flags & XML_RELAXNG_IN_NSEXCEPT) {
7313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngPErr(ctxt, cur,
7314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   XML_RNGP_PAT_NSNAME_EXCEPT_ANYNAME,
7315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   "Found nsName/except//anyName forbidden construct\n",
7316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   NULL, NULL);
7317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
7320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Thisd is not an else since "include" is transformed
7321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * into a div
7322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
7323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlStrEqual(cur->name, BAD_CAST "div")) {
7324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlChar *ns;
7325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlNodePtr child, ins, tmp;
7326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
7328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * implements rule 4.11
7329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
7330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ns = xmlGetProp(cur, BAD_CAST "ns");
7332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    child = cur->children;
7334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ins = cur;
7335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (child != NULL) {
7336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ns != NULL) {
7337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (!xmlHasProp(child, BAD_CAST "ns")) {
7338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlSetProp(child, BAD_CAST "ns", ns);
7339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
7340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
7341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = child->next;
7342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlUnlinkNode(child);
7343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ins = xmlAddNextSibling(ins, child);
7344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        child = tmp;
7345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
7346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ns != NULL)
7347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(ns);
7348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
7349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * Since we are about to delete cur, if it's nsDef is non-NULL we
7350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * need to preserve it (it contains the ns definitions for the
7351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * children we just moved).  We'll just stick it on to the end
7352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * of cur->parent's list, since it's never going to be re-serialized
7353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * (bug 143738).
7354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
7355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (cur->nsDef != NULL) {
7356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			xmlNsPtr parDef = (xmlNsPtr)&cur->parent->nsDef;
7357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			while (parDef->next != NULL)
7358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			    parDef = parDef->next;
7359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			parDef->next = cur->nsDef;
7360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			cur->nsDef = NULL;
7361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
7362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    delete = cur;
7363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto skip_children;
7364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
7368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Simplification 4.2 whitespaces
7369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
7370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if ((cur->type == XML_TEXT_NODE) ||
7371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 (cur->type == XML_CDATA_SECTION_NODE)) {
7372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (IS_BLANK_NODE(cur)) {
7373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->parent->type == XML_ELEMENT_NODE) {
7374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((!xmlStrEqual(cur->parent->name, BAD_CAST "value"))
7375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        &&
7376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (!xmlStrEqual
7377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (cur->parent->name, BAD_CAST "param")))
7378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        delete = cur;
7379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
7380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    delete = cur;
7381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    goto skip_children;
7382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
7385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            delete = cur;
7386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            goto skip_children;
7387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
7390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Skip to next node
7391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
7392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->children != NULL) {
7393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->children->type != XML_ENTITY_DECL) &&
7394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->children->type != XML_ENTITY_REF_NODE) &&
7395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->children->type != XML_ENTITY_NODE)) {
7396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->children;
7397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                continue;
7398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project      skip_children:
7401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL) {
7402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->next;
7403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
7404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        do {
7407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = cur->parent;
7408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == NULL)
7409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
7410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur == root) {
7411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = NULL;
7412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
7413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur->next != NULL) {
7415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = cur->next;
7416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
7417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } while (cur != NULL);
7419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (delete != NULL) {
7421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlUnlinkNode(delete);
7422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeNode(delete);
7423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        delete = NULL;
7424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGCleanupDoc:
7429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
7430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  an xmldocPtr document pointer
7431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Cleanup the document from unwanted nodes for parsing, resolve
7433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Include and externalRef lookups.
7434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the cleaned up document or NULL in case of error
7436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlDocPtr
7438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGCleanupDoc(xmlRelaxNGParserCtxtPtr ctxt, xmlDocPtr doc)
7439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root;
7441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Extract the root
7444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = xmlDocGetRootElement(doc);
7446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root == NULL) {
7447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, (xmlNodePtr) doc, XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n",
7448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   ctxt->URL, NULL);
7449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGCleanupTree(ctxt, root);
7452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (doc);
7453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGParse:
7457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
7458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * parse a schema definition resource and build an internal
7460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * XML Shema struture which can be used to validate instances.
7461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the internal XML RelaxNG structure built from the resource or
7463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         NULL in case of error
7464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGPtr
7466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGParse(xmlRelaxNGParserCtxtPtr ctxt)
7467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr ret = NULL;
7469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlDocPtr doc;
7470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr root;
7471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInitTypes();
7473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
7475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * First step is to parse the input document into an DOM/Infoset
7479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->URL != NULL) {
7481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        doc = xmlReadFile((const char *) ctxt->URL,NULL,0);
7482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (doc == NULL) {
7483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR,
7484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "xmlRelaxNGParse: could not load %s\n", ctxt->URL,
7485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
7486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
7487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->buffer != NULL) {
7489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        doc = xmlReadMemory(ctxt->buffer, ctxt->size,NULL,NULL,0);
7490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (doc == NULL) {
7491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngPErr(ctxt, NULL, XML_RNGP_PARSE_ERROR,
7492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       "xmlRelaxNGParse: could not parse schemas\n", NULL,
7493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       NULL);
7494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (NULL);
7495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        doc->URL = xmlStrdup(BAD_CAST "in_memory_buffer");
7497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->URL = xmlStrdup(BAD_CAST "in_memory_buffer");
7498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->document != NULL) {
7499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        doc = ctxt->document;
7500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, NULL, XML_RNGP_EMPTY,
7502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   "xmlRelaxNGParse: nothing to parse\n", NULL, NULL);
7503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->document = doc;
7506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Some preprocessing of the document content
7509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    doc = xmlRelaxNGCleanupDoc(ctxt, doc);
7511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (doc == NULL) {
7512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(ctxt->document);
7513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->document = NULL;
7514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Then do the parsing for good
7519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    root = xmlDocGetRootElement(doc);
7521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (root == NULL) {
7522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngPErr(ctxt, (xmlNodePtr) doc,
7523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	           XML_RNGP_EMPTY, "xmlRelaxNGParse: %s is empty\n",
7524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (ctxt->URL ? ctxt->URL : BAD_CAST "schemas"), NULL);
752594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun
7526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(ctxt->document);
7527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->document = NULL;
7528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGParseDocument(ctxt, root);
7531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
7532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(ctxt->document);
7533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->document = NULL;
7534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Check the ref/defines links
7539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * try to preprocess interleaves
7542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->interleaves != NULL) {
7544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlHashScan(ctxt->interleaves,
7545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (xmlHashScanner) xmlRelaxNGComputeInterleaves, ctxt);
7546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * if there was a parsing error return NULL
7550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->nbErrors > 0) {
7552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFree(ret);
7553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->document = NULL;
7554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFreeDoc(doc);
7555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
7556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * try to compile (parts of) the schemas
7560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret->topgrammar != NULL) && (ret->topgrammar->start != NULL)) {
7562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret->topgrammar->start->type != XML_RELAXNG_START) {
7563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDefinePtr def;
7564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            def = xmlRelaxNGNewDefine(ctxt, NULL);
7566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (def != NULL) {
7567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->type = XML_RELAXNG_START;
7568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                def->content = ret->topgrammar->start;
7569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret->topgrammar->start = def;
7570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
7572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGTryCompile(ctxt, ret->topgrammar->start);
7573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
7576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Transfer the pointer for cleanup at the schema level.
7577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
7578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->doc = doc;
7579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->document = NULL;
7580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->documents = ctxt->documents;
7581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->documents = NULL;
7582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->includes = ctxt->includes;
7584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->includes = NULL;
7585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->defNr = ctxt->defNr;
7586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->defTab = ctxt->defTab;
7587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->defTab = NULL;
7588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->idref == 1)
7589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret->idref = 1;
7590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
7592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetParserErrors:
7596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
7597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error callback
7598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn:  the warning callback
7599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  contextual data for the callbacks
7600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a validation context
7602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
7605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidityErrorFunc err,
7606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidityWarningFunc warn, void *ctx)
7607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
7609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = err;
7611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = warn;
7612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = NULL;
7613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->userData = ctx;
7614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetParserErrors:
7618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
7619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error callback result
7620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn:  the warning callback result
7621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  contextual data for the callbacks result
7622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the callback information used to handle errors for a validation context
7624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of failure, 0 otherwise.
7626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
7628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetParserErrors(xmlRelaxNGParserCtxtPtr ctxt,
7629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidityErrorFunc * err,
7630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                          xmlRelaxNGValidityWarningFunc * warn, void **ctx)
7631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
7633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
7634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (err != NULL)
7635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *err = ctxt->error;
7636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (warn != NULL)
7637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *warn = ctxt->warning;
7638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctx != NULL)
7639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *ctx = ctxt->userData;
7640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
7641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetParserStructuredErrors:
7645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG parser context
7646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror:  the error callback
7647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx:  contextual data for the callbacks
7648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the callback functions used to handle errors for a parsing context
7650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetParserStructuredErrors(xmlRelaxNGParserCtxtPtr ctxt,
7653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    xmlStructuredErrorFunc serror,
7654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    void *ctx)
7655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
7657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = serror;
7659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = NULL;
7660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = NULL;
7661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->userData = ctx;
7662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_OUTPUT_ENABLED
7665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
766794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
766894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Dump back a compiled form			*
766994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
7670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
7671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGDumpDefine(FILE * output,
7672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlRelaxNGDefinePtr define);
7673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpDefines:
7676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines:  a list of define structures
7678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back
7680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
7682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpDefines(FILE * output, xmlRelaxNGDefinePtr defines)
7683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (defines != NULL) {
7685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDumpDefine(output, defines);
7686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        defines = defines->next;
7687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpDefine:
7692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  a define structure
7694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back
7696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
7698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpDefine(FILE * output, xmlRelaxNGDefinePtr define)
7699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL)
7701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (define->type) {
7703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
7704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<empty/>\n");
7705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
7707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<notAllowed/>\n");
7708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
7710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<text/>\n");
7711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
7713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<element>\n");
7714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->name != NULL) {
7715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, "<name");
7716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (define->ns != NULL)
7717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    fprintf(output, " ns=\"%s\"", define->ns);
7718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, ">%s</name>\n", define->name);
7719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
7720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->attrs);
7721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</element>\n");
7723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:
7725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<list>\n");
7726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</list>\n");
7728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
7730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<oneOrMore>\n");
7731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</oneOrMore>\n");
7733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:
7735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<zeroOrMore>\n");
7736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</zeroOrMore>\n");
7738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:
7740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<choice>\n");
7741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</choice>\n");
7743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
7745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<group>\n");
7746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</group>\n");
7748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
7750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<interleave>\n");
7751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</interleave>\n");
7753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:
7755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<optional>\n");
7756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</optional>\n");
7758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
7760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<attribute>\n");
7761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</attribute>\n");
7763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
7765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<define");
7766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->name != NULL)
7767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, " name=\"%s\"", define->name);
7768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, ">\n");
7769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</define>\n");
7771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
7773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<ref");
7774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->name != NULL)
7775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, " name=\"%s\"", define->name);
7776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, ">\n");
7777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</ref>\n");
7779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
7781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<parentRef");
7782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->name != NULL)
7783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                fprintf(output, " name=\"%s\"", define->name);
7784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, ">\n");
7785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</parentRef>\n");
7787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
7789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "<externalRef>");
7790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, "</externalRef>\n");
7792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:
7794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:
7795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO break;
7796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
7797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
7798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
7799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO break;
7800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
7801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpDefines(output, define->content);
7802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpGrammar:
7808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @grammar:  a grammar structure
781094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @top:  is this a top grammar
7811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back
7813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
7815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpGrammar(FILE * output, xmlRelaxNGGrammarPtr grammar, int top)
7816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar == NULL)
7818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "<grammar");
7821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (top)
7822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, " xmlns=\"http://relaxng.org/ns/structure/1.0\"");
7823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (grammar->combine) {
7824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_COMBINE_UNDEFINED:
7825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_COMBINE_CHOICE:
7827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, " combine=\"choice\"");
7828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_COMBINE_INTERLEAVE:
7830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, " combine=\"interleave\"");
7831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
7832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
7833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            fprintf(output, " <!-- invalid combine value -->");
7834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, ">\n");
7836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar->start == NULL) {
7837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, " <!-- grammar had no start -->");
7838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "<start>\n");
7840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDumpDefine(output, grammar->start);
7841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "</start>\n");
7842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /* TODO ? Dump the defines ? */
7844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "</grammar>\n");
7845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDump:
7849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
7851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump a RelaxNG structure back
7853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDump(FILE * output, xmlRelaxNGPtr schema)
7856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL)
7858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL) {
7860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "RelaxNG empty or failed to compile\n");
7861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    fprintf(output, "RelaxNG: ");
7864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->doc == NULL) {
7865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "no document\n");
7866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (schema->doc->URL != NULL) {
7867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "%s\n", schema->doc->URL);
7868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "\n");
7870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->topgrammar == NULL) {
7872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "RelaxNG has no top grammar\n");
7873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDumpGrammar(output, schema->topgrammar, 1);
7876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGDumpTree:
7880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @output:  the file output
7881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a schema structure
7882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Dump the transformed RelaxNG tree.
7884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
7886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGDumpTree(FILE * output, xmlRelaxNGPtr schema)
7887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (output == NULL)
7889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema == NULL) {
7891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "RelaxNG empty or failed to compile\n");
7892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema->doc == NULL) {
7895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(output, "no document\n");
7896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
7897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlDocDump(output, schema->doc);
7898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_OUTPUT_ENABLED */
7901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
790394442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
790494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Validation of compiled content				*
790594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
7906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
7907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
7908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        xmlRelaxNGDefinePtr define);
7909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateCompiledCallback:
7912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec:  the regular expression instance
7913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token:  the token which matched
7914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @transdata:  callback data, the define for the subelement if available
7915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @ @inputdata:  callback data, the Relax NG validation context
7916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle the callback and if needed validate the element children.
7918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
7920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateCompiledCallback(xmlRegExecCtxtPtr exec ATTRIBUTE_UNUSED,
7921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   const xmlChar * token,
7922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   void *transdata, void *inputdata)
7923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata;
7925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata;
7926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
7927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE
7929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
7930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Compiled callback for: '%s'\n", token);
7931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
7932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) {
7933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing context\n", token);
7934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL) {
7937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (token[0] == '#')
7938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return;
7939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing define\n", token);
7940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
7941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
7942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (define == NULL)) {
7945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing info\n", token);
7946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
7947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
7948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (define->type != XML_RELAXNG_ELEMENT) {
7950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s define is not element\n", token);
7951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errNo == XML_RELAXNG_OK)
7952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
7953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
7954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
7955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGValidateDefinition(ctxt, define);
7956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
7957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->perr = ret;
7958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
7959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
7961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateCompiledContent:
7962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the RelaxNG validation context
7963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @regexp:  the regular expression as compiled
7964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @content:  list of children to test against the regexp
7965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the content model of an element or start using the regexp
7967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
7968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success, -1 in case of error.
7969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
7970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
7971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateCompiledContent(xmlRelaxNGValidCtxtPtr ctxt,
7972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  xmlRegexpPtr regexp, xmlNodePtr content)
7973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
7974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr exec;
7975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur;
7976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
7977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int oldperr;
7978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
7979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (regexp == NULL))
7980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
7981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldperr = ctxt->perr;
7982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec = xmlRegNewExecCtxt(regexp,
7983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGValidateCompiledCallback, ctxt);
7984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->perr = 0;
7985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = content;
7986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
7987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = cur;
7988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        switch (cur->type) {
7989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_TEXT_NODE:
7990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_CDATA_SECTION_NODE:
7991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlIsBlankNode(cur))
7992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
7993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRegExecPushString(exec, BAD_CAST "#text", ctxt);
7994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret < 0) {
7995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG,
7996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               cur->parent->name);
7997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
7998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
7999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            case XML_ELEMENT_NODE:
8000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->ns != NULL) {
8001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRegExecPushString2(exec, cur->name,
8002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                cur->ns->href, ctxt);
8003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
8004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRegExecPushString(exec, cur->name, ctxt);
8005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret < 0) {
8007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, cur->name);
8008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            default:
8011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret < 0)
8014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
8016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * Switch to next element
8017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
8018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
8019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegExecPushString(exec, NULL, NULL);
8021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 1) {
8022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
8023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = NULL;
8024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret == 0) {
8025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
8026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * TODO: get some of the names needed to exit the current state of exec
8027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
8028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST "");
8029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
8031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpValidError(ctxt);
8032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegFreeExecCtxt(exec);
8036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * There might be content model errors outside of the pure
8038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * regexp validation, e.g. for attribute values.
8039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (ctxt->perr != 0)) {
8041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = ctxt->perr;
8042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->perr = oldperr;
8044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
804894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
804994442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Progressive validation of when possible			*
805094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
8051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
8053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                           xmlRelaxNGDefinePtr defines);
8054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt,
8055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        int dolog);
8056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void xmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt);
8057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElemPush:
8060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
8061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec:  the regexp runtime for the new content model
8062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new regexp for the current node content model on the stack
8064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 in case of success and -1 in case of error.
8066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElemPush(xmlRelaxNGValidCtxtPtr ctxt, xmlRegExecCtxtPtr exec)
8069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemTab == NULL) {
8071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elemMax = 10;
8072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlMalloc(ctxt->elemMax *
8073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        sizeof
8074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        (xmlRegExecCtxtPtr));
8075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->elemTab == NULL) {
8076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "validating\n");
8077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemNr >= ctxt->elemMax) {
8081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elemMax *= 2;
8082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elemTab = (xmlRegExecCtxtPtr *) xmlRealloc(ctxt->elemTab,
8083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         ctxt->elemMax *
8084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         sizeof
8085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         (xmlRegExecCtxtPtr));
8086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->elemTab == NULL) {
8087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRngVErrMemory(ctxt, "validating\n");
8088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->elemTab[ctxt->elemNr++] = exec;
8092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->elem = exec;
8093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
8094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElemPop:
8098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
8099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the regexp of the current node content model from the stack
8101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the exec or NULL if empty
8103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlRegExecCtxtPtr
8105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElemPop(xmlRelaxNGValidCtxtPtr ctxt)
8106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr ret;
8108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemNr <= 0)
8110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->elemNr--;
8112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = ctxt->elemTab[ctxt->elemNr];
8113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->elemTab[ctxt->elemNr] = NULL;
8114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemNr > 0)
8115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elem = ctxt->elemTab[ctxt->elemNr - 1];
8116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->elem = NULL;
8118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateProgressiveCallback:
8123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @exec:  the regular expression instance
8124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @token:  the token which matched
8125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @transdata:  callback data, the define for the subelement if available
8126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project @ @inputdata:  callback data, the Relax NG validation context
8127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Handle the callback and if needed validate the element children.
8129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * some of the in/out informations are passed via the context in @inputdata.
8130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
8132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateProgressiveCallback(xmlRegExecCtxtPtr exec
8133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      ATTRIBUTE_UNUSED,
8134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      const xmlChar * token,
8135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                      void *transdata, void *inputdata)
8136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidCtxtPtr ctxt = (xmlRelaxNGValidCtxtPtr) inputdata;
8138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr define = (xmlRelaxNGDefinePtr) transdata;
8139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state, oldstate;
8140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
8141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, oldflags;
8142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
8145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Progressive callback for: '%s'\n", token);
8146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL) {
8148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing context\n", token);
8149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    node = ctxt->pnode;
8152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->pstate = 1;
8153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL) {
8154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (token[0] == '#')
8155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return;
8156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing define\n", token);
8157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
8158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (define == NULL)) {
8163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s missing info\n", token);
8164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt != NULL) && (ctxt->errNo == XML_RELAXNG_OK))
8165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (define->type != XML_RELAXNG_ELEMENT) {
8169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        fprintf(stderr, "callback on %s define is not element\n", token);
8170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errNo == XML_RELAXNG_OK)
8171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->errNo = XML_RELAXNG_ERR_INTERNAL;
8172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (node->type != XML_ELEMENT_NODE) {
8176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_NOTELEM);
8177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
8178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpValidError(ctxt);
8179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->contModel == NULL) {
8183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
8184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * this node cannot be validated in a streamable fashion
8185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
8186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
8188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "Element '%s' validation is not streamable\n",
8189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        token);
8190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = 0;
8192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pdef = define;
8193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec = xmlRegNewExecCtxt(define->contModel,
8196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGValidateProgressiveCallback, ctxt);
8197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (exec == NULL) {
8198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGElemPush(ctxt, exec);
8202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Validate the attributes part of the content.
8205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = xmlRelaxNGNewValidState(ctxt, node);
8207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
8208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->pstate = -1;
8209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
8210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldstate = ctxt->state;
8212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = state;
8213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->attrs != NULL) {
8214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateAttributeList(ctxt, define->attrs);
8215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0) {
8216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->pstate = -1;
8217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name);
8218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL) {
8221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = NULL;
8222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
8223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0) {
8224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->pstate = -1;
8225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
8227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->states != NULL) {
8228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int tmp = -1, i;
8229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldflags = ctxt->flags;
8231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->states->nbState; i++) {
8233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            state = ctxt->states->tabState[i];
8234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = state;
8235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = NULL;
8236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
8238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = 0;
8239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp != 0) {
8243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
8244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * validation error, log the message for the "best" one
8245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
8246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags |= FLAGS_IGNORABLE;
8247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGLogBestError(ctxt);
8248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->states->nbState; i++) {
8250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[i]);
8251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(ctxt, ctxt->states);
8253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->states = NULL;
8254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ret == 0) && (tmp == -1))
8255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->pstate = -1;
8256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->flags = oldflags;
8257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->pstate == -1) {
8259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
8260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGDumpValidError(ctxt);
8261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = oldstate;
8264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePushElement:
8268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
8269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a document instance
8270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element instance
8271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Push a new element start on the RelaxNG validation stack.
8273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 if validating the
8275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *         element requires a full node, and -1 in case of error.
8276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePushElement(xmlRelaxNGValidCtxtPtr ctxt,
8279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlDocPtr doc ATTRIBUTE_UNUSED,
8280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlNodePtr elem)
8281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
8283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (elem == NULL))
8285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "PushElem %s\n", elem->name);
8289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elem == 0) {
8291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGPtr schema;
8292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGGrammarPtr grammar;
8293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegExecCtxtPtr exec;
8294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr define;
8295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        schema = ctxt->schema;
8297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (schema == NULL) {
8298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
8299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        grammar = schema->topgrammar;
8302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((grammar == NULL) || (grammar->start == NULL)) {
8303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
8304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        define = grammar->start;
8307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (define->contModel == NULL) {
8308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->pdef = define;
8309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
8310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        exec = xmlRegNewExecCtxt(define->contModel,
8312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlRelaxNGValidateProgressiveCallback,
8313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 ctxt);
8314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (exec == NULL) {
8315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
8316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGElemPush(ctxt, exec);
8318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->pnode = elem;
8320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->pstate = 0;
8321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (elem->ns != NULL) {
8322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret =
8323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRegExecPushString2(ctxt->elem, elem->name, elem->ns->href,
8324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                  ctxt);
8325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRegExecPushString(ctxt->elem, elem->name, ctxt);
8327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
8329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, elem->name);
8330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->pstate == 0)
8332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
8333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else if (ctxt->pstate < 0)
8334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
8335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
8336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 1;
8337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
8340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "PushElem %s failed\n",
8341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        elem->name);
8342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePushCData:
8348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the RelaxNG validation context
8349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @data:  some character data read
835094442ad4107000e6d49f9b85a46a591495a57632Selim Gurun * @len:  the length of the data
8351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * check the CData parsed for validation in the current stack
8353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or -1 otherwise
8355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePushCData(xmlRelaxNGValidCtxtPtr ctxt,
8358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            const xmlChar * data, int len ATTRIBUTE_UNUSED)
8359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 1;
8361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->elem == NULL) || (data == NULL))
8363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "CDATA %s %d\n", data, len);
8367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*data != 0) {
8370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!IS_BLANK_CH(*data))
8371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        data++;
8373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (*data == 0)
8375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
8376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegExecPushString(ctxt->elem, BAD_CAST "#text", ctxt);
8378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
8379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_TEXTWRONG, BAD_CAST " TODO ");
8380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "CDATA failed\n");
8382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
8387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidatePopElement:
8391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the RelaxNG validation context
8392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a document instance
8393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element instance
8394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Pop the element end from the RelaxNG validation stack.
8396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or 0 otherwise
8398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidatePopElement(xmlRelaxNGValidCtxtPtr ctxt,
8401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlDocPtr doc ATTRIBUTE_UNUSED,
8402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlNodePtr elem)
8403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
8405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegExecCtxtPtr exec;
8406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->elem == NULL) || (elem == NULL))
8408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "PopElem %s\n", elem->name);
8411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * verify that we reached a terminal state of the content model.
8414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    exec = xmlRelaxNGElemPop(ctxt);
8416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRegExecPushString(exec, NULL, NULL);
8417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0) {
8418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
8419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * TODO: get some of the names needed to exit the current state of exec
8420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
8421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_NOELEM, BAD_CAST "");
8422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret < 0) {
8424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 1;
8427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRegFreeExecCtxt(exec);
8429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
8431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "PopElem %s failed\n",
8432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        elem->name);
8433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateFullElement:
8439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the validation context
8440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a document instance
8441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  an element instance
8442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a full subtree when xmlRelaxNGValidatePushElement() returned
8444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * 0 and the content of the node has been expanded.
8445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * returns 1 if no validation problem was found or -1 in case of error.
8447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
8449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateFullElement(xmlRelaxNGValidCtxtPtr ctxt,
8450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlDocPtr doc ATTRIBUTE_UNUSED,
8451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              xmlNodePtr elem)
8452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
8454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;
8455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->pdef == NULL) || (elem == NULL))
8457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext, "FullElem %s\n", elem->name);
8460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = xmlRelaxNGNewValidState(ctxt, elem->parent);
8462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state == NULL) {
8463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state->seq = elem;
8466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = state;
8467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNo = XML_RELAXNG_OK;
8468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGValidateDefinition(ctxt, ctxt->pdef);
8469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret != 0) || (ctxt->errNo != XML_RELAXNG_OK))
8470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 1;
8473df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRelaxNGFreeValidState(ctxt, ctxt->state);
8474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = NULL;
8475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_PROGRESSIVE
8476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0)
8477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "FullElem %s failed\n",
8478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        elem->name);
8479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
848494442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
848594442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *		Generic interpreted validation implementation		*
848694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
8487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
8488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int xmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
8489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   xmlRelaxNGDefinePtr define);
8490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSkipIgnored:
8493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the top node.
8495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip ignorable nodes in that context
8497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new sibling or NULL in case of error.
8499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlNodePtr
8501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSkipIgnored(xmlRelaxNGValidCtxtPtr ctxt ATTRIBUTE_UNUSED,
8502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                      xmlNodePtr node)
8503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
8505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * TODO complete and handle entities
8506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
8507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((node != NULL) &&
8508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project           ((node->type == XML_COMMENT_NODE) ||
8509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (node->type == XML_PI_NODE) ||
8510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (node->type == XML_XINCLUDE_START) ||
8511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    (node->type == XML_XINCLUDE_END) ||
8512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (((node->type == XML_TEXT_NODE) ||
8513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              (node->type == XML_CDATA_SECTION_NODE)) &&
8514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             ((ctxt->flags & FLAGS_MIXED_CONTENT) ||
8515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project              (IS_BLANK_NODE(node)))))) {
8516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = node->next;
8517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (node);
8519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNormalize:
8523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a schema validation context
8524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @str:  the string to normalize
8525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Implements the  normalizeWhiteSpace( s ) function from
8527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * section 6.2.9 of the spec
8528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the new string or NULL in case of error.
8530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic xmlChar *
8532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNormalize(xmlRelaxNGValidCtxtPtr ctxt, const xmlChar * str)
8533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *ret, *p;
8535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    const xmlChar *tmp;
8536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int len;
8537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (str == NULL)
8539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    tmp = str;
8541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*tmp != 0)
8542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        tmp++;
8543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    len = tmp - str;
8544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlChar *) xmlMallocAtomic((len + 1) * sizeof(xmlChar));
8546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
8547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "validating\n");
8548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
8549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    p = ret;
8551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (IS_BLANK_CH(*str))
8552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        str++;
8553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*str != 0) {
8554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (IS_BLANK_CH(*str)) {
8555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while (IS_BLANK_CH(*str))
8556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                str++;
8557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (*str == 0)
8558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            *p++ = ' ';
8560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else
8561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            *p++ = *str++;
8562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    *p = 0;
8564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDatatype:
8569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @value:  the string value
8571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @type:  the datatype definition
8572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
8573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given value against the dataype
8575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
8577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDatatype(xmlRelaxNGValidCtxtPtr ctxt,
8580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           const xmlChar * value,
8581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           xmlRelaxNGDefinePtr define, xmlNodePtr node)
8582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret, tmp;
8584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGTypeLibraryPtr lib;
8585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    void *result = NULL;
8586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
8587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define == NULL) || (define->data == NULL)) {
8589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lib = (xmlRelaxNGTypeLibraryPtr) define->data;
8592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lib->check != NULL) {
8593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((define->attrs != NULL) &&
8594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (define->attrs->type == XML_RELAXNG_PARAM)) {
8595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret =
8596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                lib->check(lib->data, define->name, value, &result, node);
8597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
8598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = lib->check(lib->data, define->name, value, NULL, node);
8599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else
8601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret < 0) {
8603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_TYPE, define->name);
8604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((result != NULL) && (lib != NULL) && (lib->freef != NULL))
8605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lib->freef(lib->data, result);
8606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
8607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret == 1) {
8608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
8609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ret == 2) {
8610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2P(XML_RELAXNG_ERR_DUPID, value);
8611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
8612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR3P(XML_RELAXNG_ERR_TYPEVAL, define->name, value);
8613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
8614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = define->attrs;
8616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((ret == 0) && (cur != NULL) && (cur->type == XML_RELAXNG_PARAM)) {
8617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lib->facet != NULL) {
8618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = lib->facet(lib->data, define->name, cur->name,
8619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             cur->value, value, result);
8620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp != 0)
8621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
8622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
8623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
8624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (define->content != NULL)) {
8626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        const xmlChar *oldvalue, *oldendvalue;
8627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldvalue = ctxt->state->value;
8629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        oldendvalue = ctxt->state->endvalue;
8630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = (xmlChar *) value;
8631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->endvalue = NULL;
8632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateValue(ctxt, define->content);
8633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = (xmlChar *) oldvalue;
8634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->endvalue = (xmlChar *) oldendvalue;
8635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((result != NULL) && (lib != NULL) && (lib->freef != NULL))
8637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        lib->freef(lib->data, result);
8638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNextValue:
8643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Skip to the next value when validating within a list
8646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the operation succeeded or an error code.
8648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNextValue(xmlRelaxNGValidCtxtPtr ctxt)
8651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *cur;
8653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->state->value;
8655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((cur == NULL) || (ctxt->state->endvalue == NULL)) {
8656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = NULL;
8657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->endvalue = NULL;
8658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
8659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (*cur != 0)
8661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
8662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while ((cur != ctxt->state->endvalue) && (*cur == 0))
8663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur++;
8664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (cur == ctxt->state->endvalue)
8665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = NULL;
8666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
8667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->value = cur;
8668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
8669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValueList:
8673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines:  the list of definitions to verify
8675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given set of definitions for the current value
8677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
8679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValueList(xmlRelaxNGValidCtxtPtr ctxt,
8682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGDefinePtr defines)
8683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
8685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (defines != NULL) {
8687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateValue(ctxt, defines);
8688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0)
8689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        defines = defines->next;
8691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValue:
8697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
8699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given definition for the current value
8701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
8703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValue(xmlRelaxNGValidCtxtPtr ctxt,
8706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefinePtr define)
8707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, oldflags;
8709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value;
8710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    value = ctxt->state->value;
8712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (define->type) {
8713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:{
8714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((value != NULL) && (value[0] != 0)) {
8715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    int idx = 0;
8716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while (IS_BLANK_CH(value[idx]))
8718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        idx++;
8719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (value[idx] != 0)
8720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
8721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
8725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:{
8727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (!xmlStrEqual(value, define->value)) {
8728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (define->name != NULL) {
8729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGTypeLibraryPtr lib;
8730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        lib = (xmlRelaxNGTypeLibraryPtr) define->data;
8732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((lib != NULL) && (lib->comp != NULL)) {
8733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = lib->comp(lib->data, define->name,
8734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            define->value, define->node,
8735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            (void *) define->attrs,
8736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            value, ctxt->state->node);
8737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else
8738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = -1;
8739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ret < 0) {
8740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            VALID_ERR2(XML_RELAXNG_ERR_TYPECMP,
8741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       define->name);
8742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            return (-1);
8743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else if (ret == 1) {
8744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = 0;
8745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
8746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = -1;
8747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
8748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
8749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlChar *nval, *nvalue;
8750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
8752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * TODO: trivial optimizations are possible by
8753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * computing at compile-time
8754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
8755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        nval = xmlRelaxNGNormalize(ctxt, define->value);
8756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        nvalue = xmlRelaxNGNormalize(ctxt, value);
8757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if ((nval == NULL) || (nvalue == NULL) ||
8759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            (!xmlStrEqual(nval, nvalue)))
8760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = -1;
8761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (nval != NULL)
8762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(nval);
8763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (nvalue != NULL)
8764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlFree(nvalue);
8765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
8766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 0)
8768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGNextValue(ctxt);
8769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:{
8772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateDatatype(ctxt, value, define,
8773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->state->seq);
8774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == 0)
8775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGNextValue(ctxt);
8776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:{
8780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = define->content;
8781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *oldvalue;
8782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
8784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
8785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldvalue = ctxt->state->value;
8787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
8788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateValue(ctxt, list);
8789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0) {
8790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
8792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->value = oldvalue;
8793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
8794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
8796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0) {
8797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
8798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDumpValidError(ctxt);
8799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
8800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->errNr > 0)
8801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGPopErrors(ctxt, 0);
8802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:{
8806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = define->content;
8807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *oldvalue, *oldend, *val, *cur;
8808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int nb_values = 0;
8811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldvalue = ctxt->state->value;
8814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldend = ctxt->state->endvalue;
8815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                val = xmlStrdup(oldvalue);
8817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val == NULL) {
8818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    val = xmlStrdup(BAD_CAST "");
8819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (val == NULL) {
8821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
8822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    return (-1);
8823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = val;
8825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (*cur != 0) {
8826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (IS_BLANK_CH(*cur)) {
8827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        *cur = 0;
8828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur++;
8829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        nb_values++;
8831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        while (IS_BLANK_CH(*cur))
8833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            *cur++ = 0;
8834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else
8835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        cur++;
8836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext,
8839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                "list value: '%s' found %d items\n",
8840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                oldvalue, nb_values);
8841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nb_values = 0;
8842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->endvalue = cur;
8844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = val;
8845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((*cur == 0) && (cur != ctxt->state->endvalue))
8846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur++;
8847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = cur;
8849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
8851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->state->value == ctxt->state->endvalue)
8852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state->value = NULL;
8853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateValue(ctxt, list);
8854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0) {
8855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlGenericError(xmlGenericErrorContext,
8857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        "Failed to validate value: '%s' with %d rule\n",
8858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        ctxt->state->value, nb_values);
8859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
8862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_LIST
8863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    nb_values++;
8864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
8865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
8866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ret == 0) && (ctxt->state->value != NULL) &&
8869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (ctxt->state->value != ctxt->state->endvalue)) {
8870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_LISTEXTRA,
8871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               ctxt->state->value);
8872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
8873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(val);
8875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = oldvalue;
8876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->endvalue = oldend;
8877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
8880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateValueList(ctxt, define->content);
8881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != 0) {
8882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* no break on purpose */
8885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:{
8886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *cur, *temp;
8887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8888df143a5041f03a22808b59c76698770b74692815Selim Gurun                if ((ctxt->state->value == NULL) ||
8889df143a5041f03a22808b59c76698770b74692815Selim Gurun                    (*ctxt->state->value == 0)) {
8890df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ret = 0;
8891df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
8892df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
8893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
8894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
8895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = ctxt->state->value;
8896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                temp = NULL;
8897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((cur != NULL) && (cur != ctxt->state->endvalue) &&
8898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       (temp != cur)) {
8899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    temp = cur;
8900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret =
8901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGValidateValueList(ctxt, define->content);
8902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0) {
8903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state->value = temp;
8904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 0;
8905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
8907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    cur = ctxt->state->value;
8908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
8910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (ctxt->errNr > 0)
8911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    xmlRelaxNGPopErrors(ctxt, 0);
8912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8914df143a5041f03a22808b59c76698770b74692815Selim Gurun        case XML_RELAXNG_OPTIONAL:{
8915df143a5041f03a22808b59c76698770b74692815Selim Gurun                xmlChar *temp;
8916df143a5041f03a22808b59c76698770b74692815Selim Gurun
8917df143a5041f03a22808b59c76698770b74692815Selim Gurun                if ((ctxt->state->value == NULL) ||
8918df143a5041f03a22808b59c76698770b74692815Selim Gurun                    (*ctxt->state->value == 0)) {
8919df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ret = 0;
8920df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
8921df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
8922df143a5041f03a22808b59c76698770b74692815Selim Gurun                oldflags = ctxt->flags;
8923df143a5041f03a22808b59c76698770b74692815Selim Gurun                ctxt->flags |= FLAGS_IGNORABLE;
8924df143a5041f03a22808b59c76698770b74692815Selim Gurun                temp = ctxt->state->value;
8925df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = xmlRelaxNGValidateValue(ctxt, define->content);
8926df143a5041f03a22808b59c76698770b74692815Selim Gurun                ctxt->flags = oldflags;
8927df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (ret != 0) {
8928df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ctxt->state->value = temp;
8929df143a5041f03a22808b59c76698770b74692815Selim Gurun                    if (ctxt->errNr > 0)
8930df143a5041f03a22808b59c76698770b74692815Selim Gurun                        xmlRelaxNGPopErrors(ctxt, 0);
8931df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ret = 0;
8932df143a5041f03a22808b59c76698770b74692815Selim Gurun                    break;
8933df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
8934df143a5041f03a22808b59c76698770b74692815Selim Gurun		if (ctxt->errNr > 0)
8935df143a5041f03a22808b59c76698770b74692815Selim Gurun		    xmlRelaxNGPopErrors(ctxt, 0);
8936df143a5041f03a22808b59c76698770b74692815Selim Gurun                break;
8937df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
8938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:{
8939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
8940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = define->content;
8942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
8943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateValue(ctxt, list);
8944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0) {
8945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
8946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else
8948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 0;
8949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
8950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
8954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:{
8955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list;
8956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = define->content;
8958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
8959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateValue(ctxt, list);
8960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret != 0) {
8961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
8962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
8963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else
8964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = 0;
8965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
8966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
8967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
8968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
8969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
8970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
897160a4c356ee9ce5e9ccb23347c0381f0436192691Patrick Scott	    if (define->content == NULL) {
8972df143a5041f03a22808b59c76698770b74692815Selim Gurun                VALID_ERR(XML_RELAXNG_ERR_NODEFINE);
8973df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = -1;
8974df143a5041f03a22808b59c76698770b74692815Selim Gurun	    } else {
8975df143a5041f03a22808b59c76698770b74692815Selim Gurun                ret = xmlRelaxNGValidateValue(ctxt, define->content);
8976df143a5041f03a22808b59c76698770b74692815Selim Gurun            }
8977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
8978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        default:
8979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO ret = -1;
8980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
8981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
8982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
8983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
8985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateValueContent:
8986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
8987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @defines:  the list of definitions to verify
8988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given definitions for the current value
8990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
8991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
8992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
8993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
8994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateValueContent(xmlRelaxNGValidCtxtPtr ctxt,
8995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               xmlRelaxNGDefinePtr defines)
8996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
8997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0;
8998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
8999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (defines != NULL) {
9000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateValue(ctxt, defines);
9001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0)
9002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        defines = defines->next;
9004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGAttributeMatch:
9010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to check
9012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @prop:  the attribute
9013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the attribute matches the definition nameClass
9015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the attribute matches, 0 if no, or -1 in case of error
9017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGAttributeMatch(xmlRelaxNGValidCtxtPtr ctxt,
9020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGDefinePtr define, xmlAttrPtr prop)
9021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
9023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL) {
9025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlStrEqual(define->name, prop->name))
9026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
9027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->ns != NULL) {
9029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (define->ns[0] == 0) {
9030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (prop->ns != NULL)
9031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
9032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((prop->ns == NULL) ||
9034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (!xmlStrEqual(define->ns, prop->ns->href)))
9035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
9036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->nameClass == NULL)
9039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
9040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    define = define->nameClass;
9041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->type == XML_RELAXNG_EXCEPT) {
9042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr list;
9043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9044ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list = define->content;
9045ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (list != NULL) {
9046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGAttributeMatch(ctxt, list, prop);
9047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 1)
9048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
9049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret < 0)
9050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
9051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = list->next;
9052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    TODO}
9055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (1);
9056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateAttribute:
9060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
9062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given attribute definition for that node
9064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateAttribute(xmlRelaxNGValidCtxtPtr ctxt,
9069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGDefinePtr define)
9070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i;
9072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlChar *value, *oldvalue;
9073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlAttrPtr prop = NULL, tmp;
9074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr oldseq;
9075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state->nbAttrLeft <= 0)
9077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL) {
9079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->state->nbAttrs; i++) {
9080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = ctxt->state->attrs[i];
9081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((tmp != NULL) && (xmlStrEqual(define->name, tmp->name))) {
9082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((((define->ns == NULL) || (define->ns[0] == 0)) &&
9083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (tmp->ns == NULL)) ||
9084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ((tmp->ns != NULL) &&
9085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     (xmlStrEqual(define->ns, tmp->ns->href)))) {
9086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    prop = tmp;
9087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
9088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (prop != NULL) {
9092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            value = xmlNodeListGetString(prop->doc, prop->children, 1);
9093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldvalue = ctxt->state->value;
9094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldseq = ctxt->state->seq;
9095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = (xmlNodePtr) prop;
9096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->value = value;
9097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->endvalue = NULL;
9098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateValueContent(ctxt, define->content);
9099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->state->value != NULL)
9100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = ctxt->state->value;
9101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (value != NULL)
9102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(value);
9103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->value = oldvalue;
9104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = oldseq;
9105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
9106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
9107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * flag the attribute as processed
9108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
9109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->attrs[i] = NULL;
9110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->nbAttrLeft--;
9111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
9114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
9116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext,
9117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        "xmlRelaxNGValidateAttribute(%s): %d\n",
9118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        define->name, ret);
9119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->state->nbAttrs; i++) {
9122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = ctxt->state->attrs[i];
9123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((tmp != NULL) &&
9124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (xmlRelaxNGAttributeMatch(ctxt, define, tmp) == 1)) {
9125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                prop = tmp;
9126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (prop != NULL) {
9130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            value = xmlNodeListGetString(prop->doc, prop->children, 1);
9131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldvalue = ctxt->state->value;
9132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldseq = ctxt->state->seq;
9133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = (xmlNodePtr) prop;
9134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->value = value;
9135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateValueContent(ctxt, define->content);
9136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->state->value != NULL)
9137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = ctxt->state->value;
9138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (value != NULL)
9139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlFree(value);
9140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->value = oldvalue;
9141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = oldseq;
9142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
9143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
9144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * flag the attribute as processed
9145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
9146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->attrs[i] = NULL;
9147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->nbAttrLeft--;
9148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
9151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
9153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (define->ns != NULL) {
9154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
9155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "xmlRelaxNGValidateAttribute(nsName ns = %s): %d\n",
9156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            define->ns, ret);
9157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
9159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "xmlRelaxNGValidateAttribute(anyName): %d\n",
9160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret);
9161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9167ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9168ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateAttributeList:
9170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the list of definition to verify
9172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given node against the list of attribute definitions
9174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateAttributeList(xmlRelaxNGValidCtxtPtr ctxt,
9179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGDefinePtr defines)
9180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, res;
9182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int needmore = 0;
9183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
9184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = defines;
9186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type == XML_RELAXNG_ATTRIBUTE) {
9188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (xmlRelaxNGValidateAttribute(ctxt, cur) != 0)
9189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else
9191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            needmore = 1;
9192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
9193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (!needmore)
9195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
9196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = defines;
9197ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->type != XML_RELAXNG_ATTRIBUTE) {
9199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((ctxt->state != NULL) || (ctxt->states != NULL)) {
9200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                res = xmlRelaxNGValidateDefinition(ctxt, cur);
9201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (res < 0)
9202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
9203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
9204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
9205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (-1);
9206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (res == -1)      /* continues on -2 */
9208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->next;
9211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNodeMatchesList:
9218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @node:  the node
9219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @list:  a NULL terminated array of definitions
9220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if a node can be matched by one of the definitions
9222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if matches 0 otherwise
9224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNodeMatchesList(xmlNodePtr node, xmlRelaxNGDefinePtr * list)
9227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGDefinePtr cur;
9229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i = 0, tmp;
9230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9231ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node == NULL) || (list == NULL))
9232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
9233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = list[i++];
9235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((node->type == XML_ELEMENT_NODE) &&
9237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (cur->type == XML_RELAXNG_ELEMENT)) {
9238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = xmlRelaxNGElementMatch(NULL, cur, node);
9239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == 1)
9240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
9241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (((node->type == XML_TEXT_NODE) ||
9242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_CDATA_SECTION_NODE)) &&
9243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   (cur->type == XML_RELAXNG_TEXT)) {
9244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (1);
9245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = list[i++];
9247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
9249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateInterleave:
9253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
9255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate an interleave definition for a node.
9257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateInterleave(xmlRelaxNGValidCtxtPtr ctxt,
9262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGDefinePtr define)
9263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i, nbgroups;
9265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int errNr = ctxt->errNr;
9266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int oldflags;
9267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr oldstate;
9269ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPartitionPtr partitions;
9270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGInterleaveGroupPtr group = NULL;
9271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr cur, start, last = NULL, lastchg = NULL, lastelem;
9272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr *list = NULL, *lasts = NULL;
9273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->data != NULL) {
9275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        partitions = (xmlRelaxNGPartitionPtr) define->data;
9276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        nbgroups = partitions->nbgroups;
9277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_INTERNODATA);
9279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Optimizations for MIXED
9283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldflags = ctxt->flags;
9285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->dflags & IS_MIXED) {
9286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->flags |= FLAGS_MIXED_CONTENT;
9287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (nbgroups == 2) {
9288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
9289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * this is a pure <mixed> case
9290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
9291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->state != NULL)
9292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
9293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         ctxt->state->seq);
9294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (partitions->groups[0]->rule->type == XML_RELAXNG_TEXT)
9295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateDefinition(ctxt,
9296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   partitions->groups[1]->
9297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   rule);
9298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
9299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateDefinition(ctxt,
9300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   partitions->groups[0]->
9301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   rule);
9302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
9303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->state != NULL)
9304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt,
9305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                             ctxt->state->
9306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                             seq);
9307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
9309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (ret);
9310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Build arrays to store the first and last node of the chain
9315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * pertaining to each group
9316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    list = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr));
9318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (list == NULL) {
9319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "validating\n");
9320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(list, 0, nbgroups * sizeof(xmlNodePtr));
9323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lasts = (xmlNodePtr *) xmlMalloc(nbgroups * sizeof(xmlNodePtr));
9324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (lasts == NULL) {
9325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(ctxt, "validating\n");
9326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(lasts, 0, nbgroups * sizeof(xmlNodePtr));
9329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * Walk the sequence of children finding the right group and
9332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * sorting them in sequences.
9333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = ctxt->state->seq;
9335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = xmlRelaxNGSkipIgnored(ctxt, cur);
9336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    start = cur;
9337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = cur;
9339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((partitions->triage != NULL) &&
9340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            (partitions->flags & IS_DETERMINIST)) {
9341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            void *tmp = NULL;
9342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((cur->type == XML_TEXT_NODE) ||
9344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                (cur->type == XML_CDATA_SECTION_NODE)) {
9345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlHashLookup2(partitions->triage, BAD_CAST "#text",
9346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                     NULL);
9347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (cur->type == XML_ELEMENT_NODE) {
9348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur->ns != NULL) {
9349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = xmlHashLookup2(partitions->triage, cur->name,
9350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         cur->ns->href);
9351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp == NULL)
9352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        tmp = xmlHashLookup2(partitions->triage,
9353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             BAD_CAST "#any",
9354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             cur->ns->href);
9355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else
9356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp =
9357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlHashLookup2(partitions->triage, cur->name,
9358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       NULL);
9359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp == NULL)
9360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp =
9361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlHashLookup2(partitions->triage, BAD_CAST "#any",
9362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       NULL);
9363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (tmp == NULL) {
9366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                i = nbgroups;
9367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
9368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                i = ((long) tmp) - 1;
9369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (partitions->flags & IS_NEEDCHECK) {
9370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    group = partitions->groups[i];
9371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (!xmlRelaxNGNodeMatchesList(cur, group->defs))
9372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        i = nbgroups;
9373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (i = 0; i < nbgroups; i++) {
9377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                group = partitions->groups[i];
9378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (group == NULL)
9379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    continue;
9380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (xmlRelaxNGNodeMatchesList(cur, group->defs))
9381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
9382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
9385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * We break as soon as an element not matched is found
9386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
9387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (i >= nbgroups) {
9388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lasts[i] != NULL) {
9391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i]->next = cur;
9392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i] = cur;
9393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list[i] = cur;
9395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i] = cur;
9396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (cur->next != NULL)
9398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lastchg = cur->next;
9399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        else
9400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lastchg = cur;
9401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = xmlRelaxNGSkipIgnored(ctxt, cur->next);
9402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
9404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
9405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
9406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto done;
9407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    lastelem = cur;
9409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldstate = ctxt->state;
9410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < nbgroups; i++) {
9411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = xmlRelaxNGCopyValidState(ctxt, oldstate);
9412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        group = partitions->groups[i];
9413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lasts[i] != NULL) {
9414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            last = lasts[i]->next;
9415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i]->next = NULL;
9416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state->seq = list[i];
9418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateDefinition(ctxt, group->rule);
9419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret != 0)
9420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->state != NULL) {
9422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = ctxt->state->seq;
9423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            cur = xmlRelaxNGSkipIgnored(ctxt, cur);
9424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(ctxt, oldstate);
9425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldstate = ctxt->state;
9426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = NULL;
9427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (cur != NULL) {
9428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name);
9429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = oldstate;
9431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto done;
9432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (ctxt->states != NULL) {
9434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int j;
9435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            int found = 0;
9436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int best = -1;
9437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    int lowattr = -1;
9438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * PBM: what happen if there is attributes checks in the interleaves
9441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
9442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (j = 0; j < ctxt->states->nbState; j++) {
9444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = ctxt->states->tabState[j]->seq;
9445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                cur = xmlRelaxNGSkipIgnored(ctxt, cur);
9446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (cur == NULL) {
9447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (found == 0) {
9448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        lowattr = ctxt->states->tabState[j]->nbAttrLeft;
9449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			best = j;
9450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    found = 1;
9452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr) {
9453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        /* try  to keep the latest one to mach old heuristic */
9454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        lowattr = ctxt->states->tabState[j]->nbAttrLeft;
9455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			best = j;
9456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (lowattr == 0)
9458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        break;
9459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (found == 0) {
9460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (lowattr == -1) {
9461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        lowattr = ctxt->states->tabState[j]->nbAttrLeft;
9462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			best = j;
9463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    } else
9464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxt->states->tabState[j]->nbAttrLeft <= lowattr)  {
9465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        /* try  to keep the latest one to mach old heuristic */
9466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		        lowattr = ctxt->states->tabState[j]->nbAttrLeft;
9467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			best = j;
9468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    }
9469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	    /*
9472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     * BIG PBM: here we pick only one restarting point :-(
9473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	     */
9474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->states->nbState > 0) {
9475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeValidState(ctxt, oldstate);
9476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		if (best != -1) {
9477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    oldstate = ctxt->states->tabState[best];
9478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    ctxt->states->tabState[best] = NULL;
9479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		} else {
9480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    oldstate =
9481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->states->tabState[ctxt->states->nbState - 1];
9482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states->tabState[ctxt->states->nbState - 1] = NULL;
9483df143a5041f03a22808b59c76698770b74692815Selim Gurun                    ctxt->states->nbState--;
9484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		}
9485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            for (j = 0; j < ctxt->states->nbState ; j++) {
9487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeValidState(ctxt, ctxt->states->tabState[j]);
9488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(ctxt, ctxt->states);
9490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->states = NULL;
9491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (found == 0) {
9492df143a5041f03a22808b59c76698770b74692815Selim Gurun                if (cur == NULL) {
9493df143a5041f03a22808b59c76698770b74692815Selim Gurun		    VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA,
9494df143a5041f03a22808b59c76698770b74692815Selim Gurun			       (const xmlChar *) "noname");
9495df143a5041f03a22808b59c76698770b74692815Selim Gurun                } else {
9496df143a5041f03a22808b59c76698770b74692815Selim Gurun                    VALID_ERR2(XML_RELAXNG_ERR_INTEREXTRA, cur->name);
9497df143a5041f03a22808b59c76698770b74692815Selim Gurun                }
9498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = oldstate;
9500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                goto done;
9501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
9504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (lasts[i] != NULL) {
9507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            lasts[i]->next = last;
9508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL)
9511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
9512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = oldstate;
9513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state->seq = lastelem;
9514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0) {
9515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_INTERSEQ);
9516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
9517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        goto done;
9518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project  done:
9521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags = oldflags;
9522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
9523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * builds the next links chain from the prev one
9524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
9525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    cur = lastchg;
9526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (cur != NULL) {
9527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((cur == start) || (cur->prev == NULL))
9528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur->prev->next = cur;
9530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        cur = cur->prev;
9531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0) {
9533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->errNr > errNr)
9534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGPopErrors(ctxt, errNr);
9535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(list);
9538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(lasts);
9539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDefinitionList:
9544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the list of definition to verify
9546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given node content against the (list) of definitions
9548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDefinitionList(xmlRelaxNGValidCtxtPtr ctxt,
9553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                 xmlRelaxNGDefinePtr defines)
9554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, res;
9556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (defines == NULL) {
9559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_INTERNAL,
9560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   BAD_CAST "NULL definition list");
9561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    while (defines != NULL) {
9564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->state != NULL) || (ctxt->states != NULL)) {
9565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            res = xmlRelaxNGValidateDefinition(ctxt, defines);
9566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (res < 0)
9567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR(XML_RELAXNG_ERR_NOSTATE);
9570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
9571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (res == -1)          /* continues on -2 */
9573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        defines = defines->next;
9575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGElementMatch:
9582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to check
9584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @elem:  the element
9585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Check if the element matches the definition nameClass
9587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 1 if the element matches, 0 if no, or -1 in case of error
9589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGElementMatch(xmlRelaxNGValidCtxtPtr ctxt,
9592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       xmlRelaxNGDefinePtr define, xmlNodePtr elem)
9593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, oldflags = 0;
9595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL) {
9597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (!xmlStrEqual(elem->name, define->name)) {
9598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR3(XML_RELAXNG_ERR_ELEMNAME, define->name, elem->name);
9599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
9600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((define->ns != NULL) && (define->ns[0] != 0)) {
9603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (elem->ns == NULL) {
9604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR2(XML_RELAXNG_ERR_ELEMNONS, elem->name);
9605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
9606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else if (!xmlStrEqual(elem->ns->href, define->ns)) {
9607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            VALID_ERR3(XML_RELAXNG_ERR_ELEMWRONGNS,
9608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       elem->name, define->ns);
9609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (0);
9610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((elem->ns != NULL) && (define->ns != NULL) &&
9612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project               (define->name == NULL)) {
9613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, elem->name);
9614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
9615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if ((elem->ns != NULL) && (define->name != NULL)) {
9616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR2(XML_RELAXNG_ERR_ELEMEXTRANS, define->name);
9617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (0);
9618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->nameClass == NULL)
9621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
9622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    define = define->nameClass;
9624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->type == XML_RELAXNG_EXCEPT) {
9625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr list;
9626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldflags = ctxt->flags;
9629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags |= FLAGS_IGNORABLE;
9630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list = define->content;
9633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (list != NULL) {
9634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGElementMatch(ctxt, list, elem);
9635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 1) {
9636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt != NULL)
9637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (0);
9639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret < 0) {
9641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt != NULL)
9642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
9644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = list->next;
9646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 1;
9648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
9650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (define->type == XML_RELAXNG_CHOICE) {
9652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDefinePtr list;
9653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldflags = ctxt->flags;
9656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags |= FLAGS_IGNORABLE;
9657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        list = define->nameClass;
9660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (list != NULL) {
9661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGElementMatch(ctxt, list, elem);
9662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 1) {
9663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt != NULL)
9664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (1);
9666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret < 0) {
9668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt != NULL)
9669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                return (ret);
9671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            list = list->next;
9673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != 0) {
9676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
9679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > 0)
9680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, 0);
9681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
9684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt != NULL) {
9685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
9686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO ret = -1;
9689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
9691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGBestState:
9695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the "best" state in the ctxt->states list of states to report
9698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors about. I.e. a state with no element left in the child list
9699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or the one with the less attributes left.
9700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * This is called only if a falidation error was detected
9701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the index of the "best" state or -1 in case of error
9703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGBestState(xmlRelaxNGValidCtxtPtr ctxt)
9706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;
9708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, tmp;
9709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int best = -1;
9710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int value = 1000000;
9711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->states == NULL) ||
9713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->states->nbState <= 0))
9714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->states->nbState; i++) {
9717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        state = ctxt->states->tabState[i];
9718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state == NULL)
9719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            continue;
9720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state->seq != NULL) {
9721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((best == -1) || (value > 100000)) {
9722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = 100000;
9723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                best = i;
9724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
9726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            tmp = state->nbAttrLeft;
9727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if ((best == -1) || (value > tmp)) {
9728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                value = tmp;
9729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                best = i;
9730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (best);
9734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGLogBestError:
9738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Find the "best" state in the ctxt->states list of states to report
9741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * errors about and log it.
9742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic void
9744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGLogBestError(xmlRelaxNGValidCtxtPtr ctxt)
9745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int best;
9747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->states == NULL) ||
9749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        (ctxt->states->nbState <= 0))
9750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
9751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    best = xmlRelaxNGBestState(ctxt);
9753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((best >= 0) && (best < ctxt->states->nbState)) {
9754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = ctxt->states->tabState[best];
9755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGValidateElementEnd(ctxt, 1);
9757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateElementEnd:
9762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @dolog:  indicate that error logging should be done
9764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the end of the element, implements check that
9766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * there is nothing left not consumed in the element content
9767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * or in the attribute list.
9768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateElementEnd(xmlRelaxNGValidCtxtPtr ctxt, int dolog)
9773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i;
9775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;
9776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = ctxt->state;
9778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (state->seq != NULL) {
9779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        state->seq = xmlRelaxNGSkipIgnored(ctxt, state->seq);
9780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state->seq != NULL) {
9781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (dolog) {
9782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR3(XML_RELAXNG_ERR_EXTRACONTENT,
9783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           state->node->name, state->seq->name);
9784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1);
9786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < state->nbAttrs; i++) {
9789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (state->attrs[i] != NULL) {
9790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (dolog) {
9791ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR3(XML_RELAXNG_ERR_INVALIDATTR,
9792ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           state->attrs[i]->name, state->node->name);
9793ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9794ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            return (-1 - i);
9795ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
9796ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9797ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
9798ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
9799ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9800ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
9801ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateState:
9802ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
9803ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
9804ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9805ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the current state against the definition
9806ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
9807ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
9808ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
9809ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
9810ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateState(xmlRelaxNGValidCtxtPtr ctxt,
9811ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDefinePtr define)
9812ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
9813ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
9814ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret = 0, i, tmp, oldflags, errNr;
9815ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr oldstate = NULL, state;
9816ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9817ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define == NULL) {
9818ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_NODEFINE);
9819ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
9820ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9821ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9822ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL) {
9823ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = ctxt->state->seq;
9824ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
9825ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = NULL;
9826ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
9827ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
9828ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->depth; i++)
9829ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, " ");
9830ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
9831ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Start validating %s ", xmlRelaxNGDefName(define));
9832ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL)
9833ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "%s ", define->name);
9834ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((node != NULL) && (node->name != NULL))
9835ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "on %s\n", node->name);
9836ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
9837ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "\n");
9838ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9839ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->depth++;
9840ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    switch (define->type) {
9841ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EMPTY:
9842ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = xmlRelaxNGSkipIgnored(ctxt, node);
9843ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
9844ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOT_ALLOWED:
9846ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
9847ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9848ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_TEXT:
9849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            while ((node != NULL) &&
9850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                   ((node->type == XML_TEXT_NODE) ||
9851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_COMMENT_NODE) ||
9852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_PI_NODE) ||
9853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    (node->type == XML_CDATA_SECTION_NODE)))
9854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node = node->next;
9855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state->seq = node;
9856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
9857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ELEMENT:
9858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            errNr = ctxt->errNr;
9859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = xmlRelaxNGSkipIgnored(ctxt, node);
9860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (node == NULL) {
9861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR2(XML_RELAXNG_ERR_NOELEM, define->name);
9862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (node->type != XML_ELEMENT_NODE) {
9868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR(XML_RELAXNG_ERR_NOTELEM);
9869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /*
9875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * This node was already validated successfully against
9876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             * this definition.
9877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project             */
9878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (node->psvi == define) {
9879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
9880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
9881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
9882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr != 0) {
9883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    while ((ctxt->err != NULL) &&
9884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                           (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME)
9885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             && (xmlStrEqual(ctxt->err->arg2, node->name)))
9886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ||
9887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ((ctxt->err->err ==
9888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                              XML_RELAXNG_ERR_ELEMEXTRANS)
9889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             && (xmlStrEqual(ctxt->err->arg1, node->name)))
9890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            || (ctxt->err->err == XML_RELAXNG_ERR_NOELEM)
9891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            || (ctxt->err->err ==
9892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                XML_RELAXNG_ERR_NOTELEM)))
9893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGValidErrorPop(ctxt);
9894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGElementMatch(ctxt, define, node);
9899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret <= 0) {
9900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = 0;
9906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->errNr != 0) {
9907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
9908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
9909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while ((ctxt->err != NULL) &&
9910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                       (((ctxt->err->err == XML_RELAXNG_ERR_ELEMNAME) &&
9911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (xmlStrEqual(ctxt->err->arg2, node->name))) ||
9912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ((ctxt->err->err == XML_RELAXNG_ERR_ELEMEXTRANS) &&
9913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         (xmlStrEqual(ctxt->err->arg1, node->name))) ||
9914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (ctxt->err->err == XML_RELAXNG_ERR_NOELEM) ||
9915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (ctxt->err->err == XML_RELAXNG_ERR_NOTELEM)))
9916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGValidErrorPop(ctxt);
9917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            errNr = ctxt->errNr;
9919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldflags = ctxt->flags;
9921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->flags & FLAGS_MIXED_CONTENT) {
9922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags -= FLAGS_MIXED_CONTENT;
9923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            state = xmlRelaxNGNewValidState(ctxt, node);
9925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (state == NULL) {
9926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
9927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0)
9928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
9929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
9930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            oldstate = ctxt->state;
9933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = state;
9934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->attrs != NULL) {
9935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGValidateAttributeList(ctxt, define->attrs);
9936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp != 0) {
9937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
9938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_ATTRVALID, node->name);
9939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
9940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
9941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (define->contModel != NULL) {
9942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGValidStatePtr nstate, tmpstate = ctxt->state;
9943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGStatesPtr tmpstates = ctxt->states;
9944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr nseq;
9945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nstate = xmlRelaxNGNewValidState(ctxt, node);
9947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = nstate;
9948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->states = NULL;
9949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = xmlRelaxNGValidateCompiledContent(ctxt,
9951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        define->contModel,
9952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                        ctxt->state->seq);
9953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                nseq = ctxt->state->seq;
9954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = tmpstate;
9955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->states = tmpstates;
9956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeValidState(ctxt, nstate);
9957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG_COMPILE
9959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext,
9960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                "Validating content of '%s' : %d\n",
9961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                define->name, tmp);
9962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
9963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (tmp != 0)
9964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
9965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->states != NULL) {
9967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = -1;
9968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < ctxt->states->nbState; i++) {
9970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        state = ctxt->states->tabState[i];
9971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state = state;
9972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state->seq = nseq;
9973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
9974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
9975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            tmp = 0;
9976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            break;
9977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
9978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
9979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp != 0) {
9980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
9981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * validation error, log the message for the "best" one
9982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
9983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags |= FLAGS_IGNORABLE;
9984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGLogBestError(ctxt);
9985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
9986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < ctxt->states->nbState; i++) {
9987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt,
9988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->states->
9989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 tabState[i]);
9990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
9991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeStates(ctxt, ctxt->states);
9992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
9993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
9994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ret == 0) && (tmp == -1))
9995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
9996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
9997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    state = ctxt->state;
9998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    if (ctxt->state != NULL)
9999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			ctxt->state->seq = nseq;
10000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0)
10001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
10002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeValidState(ctxt, state);
10003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
10005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (define->content != NULL) {
10006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = xmlRelaxNGValidateDefinitionList(ctxt,
10007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                           define->
10008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                           content);
10009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp != 0) {
10010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->state == NULL) {
10012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = oldstate;
10013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID,
10014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       node->name);
10015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = NULL;
10016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
10017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            VALID_ERR2(XML_RELAXNG_ERR_CONTENTVALID,
10018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                       node->name);
10019ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10020ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10021ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10022ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10023ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->states != NULL) {
10024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    tmp = -1;
10025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < ctxt->states->nbState; i++) {
10027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        state = ctxt->states->tabState[i];
10028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->state = state;
10029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (xmlRelaxNGValidateElementEnd(ctxt, 0) == 0) {
10031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            tmp = 0;
10032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            break;
10033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10034ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10035ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (tmp != 0) {
10036ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
10037ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * validation error, log the message for the "best" one
10038ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
10039ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags |= FLAGS_IGNORABLE;
10040ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGLogBestError(ctxt);
10041ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10042ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (i = 0; i < ctxt->states->nbState; i++) {
10043ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt,
10044df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                 ctxt->states->tabState[i]);
10045df143a5041f03a22808b59c76698770b74692815Selim Gurun                        ctxt->states->tabState[i] = NULL;
10046ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10047ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeStates(ctxt, ctxt->states);
10048ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
10049ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
10050ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ret == 0) && (tmp == -1))
10051ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10052ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10053ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    state = ctxt->state;
10054ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0)
10055ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = xmlRelaxNGValidateElementEnd(ctxt, 1);
10056ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeValidState(ctxt, state);
10057ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10058ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10059ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret == 0) {
10060ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node->psvi = define;
10061ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10062ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->flags = oldflags;
10063ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = oldstate;
10064ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (oldstate != NULL)
10065ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate->seq = xmlRelaxNGSkipIgnored(ctxt, node->next);
10066ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != 0) {
10067ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
10068ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGDumpValidError(ctxt);
10069ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 0;
10070ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
10071ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10072ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -2;
10073ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10074ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10075ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
10076ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
10077ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
10078ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10079ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10080ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
10081ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlGenericError(xmlGenericErrorContext,
10082ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            "xmlRelaxNGValidateDefinition(): validated %s : %d",
10083ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            node->name, ret);
10084ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (oldstate == NULL)
10085ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext, ": no state\n");
10086ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (oldstate->seq == NULL)
10087ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext, ": done\n");
10088ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else if (oldstate->seq->type == XML_ELEMENT_NODE)
10089ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext, ": next elem %s\n",
10090ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                oldstate->seq->name);
10091ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            else
10092ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlGenericError(xmlGenericErrorContext, ": next %s %d\n",
10093ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                oldstate->seq->name, oldstate->seq->type);
10094ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10095ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10096ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_OPTIONAL:{
10097ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                errNr = ctxt->errNr;
10098ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
10099ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
10100ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
10101ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret =
10102ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGValidateDefinitionList(ctxt,
10103ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                     define->content);
10104ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0) {
10105ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->state != NULL)
10106ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10107ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = oldstate;
10108ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->flags = oldflags;
10109ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 0;
10110ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->errNr > errNr)
10111ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGPopErrors(ctxt, errNr);
10112ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10113ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10114ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->states != NULL) {
10115ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate);
10116ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10117ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = xmlRelaxNGNewStates(ctxt, 1);
10118ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->states == NULL) {
10119ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt, oldstate);
10120ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ctxt->flags = oldflags;
10121ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10122ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->errNr > errNr)
10123ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGPopErrors(ctxt, errNr);
10124ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10125ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10126ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, ctxt->states, oldstate);
10127ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, ctxt->states, ctxt->state);
10128ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = NULL;
10129ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10130ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
10131ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
10132ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
10133ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
10134ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10135ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10136ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ONEORMORE:
10137ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            errNr = ctxt->errNr;
10138ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content);
10139ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != 0) {
10140ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10141ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10142ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->errNr > errNr)
10143ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGPopErrors(ctxt, errNr);
10144ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            /* no break on purpose */
10145ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ZEROORMORE:{
10146ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int progress;
10147ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGStatesPtr states = NULL, res = NULL;
10148ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int base, j;
10149ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10150ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                errNr = ctxt->errNr;
10151ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                res = xmlRelaxNGNewStates(ctxt, 1);
10152ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (res == NULL) {
10153ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = -1;
10154ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10155ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10156ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
10157ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * All the input states are also exit states
10158ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
10159ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->state != NULL) {
10160ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, res,
10161ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        xmlRelaxNGCopyValidState(ctxt,
10162ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 ctxt->
10163ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                 state));
10164ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10165ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (j = 0; j < ctxt->states->nbState; j++) {
10166ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGAddStates(ctxt, res,
10167df143a5041f03a22808b59c76698770b74692815Selim Gurun                            xmlRelaxNGCopyValidState(ctxt,
10168df143a5041f03a22808b59c76698770b74692815Selim Gurun                                            ctxt->states->tabState[j]));
10169ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10170ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10171ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
10172ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
10173ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                do {
10174ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    progress = 0;
10175ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    base = res->nbState;
10176ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10177ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->states != NULL) {
10178ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        states = ctxt->states;
10179ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        for (i = 0; i < states->nbState; i++) {
10180ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = states->tabState[i];
10181ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->states = NULL;
10182ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ret = xmlRelaxNGValidateDefinitionList(ctxt,
10183ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   define->
10184ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   content);
10185ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ret == 0) {
10186ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (ctxt->state != NULL) {
10187ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    tmp = xmlRelaxNGAddStates(ctxt, res,
10188ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                              ctxt->state);
10189ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    ctxt->state = NULL;
10190ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if (tmp == 1)
10191ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        progress = 1;
10192ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                } else if (ctxt->states != NULL) {
10193ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    for (j = 0; j < ctxt->states->nbState;
10194ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                         j++) {
10195ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        tmp =
10196ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            xmlRelaxNGAddStates(ctxt, res,
10197df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                   ctxt->states->tabState[j]);
10198ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        if (tmp == 1)
10199ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            progress = 1;
10200ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    }
10201ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlRelaxNGFreeStates(ctxt,
10202ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         ctxt->states);
10203ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    ctxt->states = NULL;
10204ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
10205ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else {
10206ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (ctxt->state != NULL) {
10207ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlRelaxNGFreeValidState(ctxt,
10208ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                             ctxt->state);
10209ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    ctxt->state = NULL;
10210ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
10211ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
10212ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10213ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
10214ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = xmlRelaxNGValidateDefinitionList(ctxt,
10215ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                               define->
10216ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                               content);
10217ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ret != 0) {
10218ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10219ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = NULL;
10220ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
10221ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            base = res->nbState;
10222ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (ctxt->state != NULL) {
10223ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                tmp = xmlRelaxNGAddStates(ctxt, res,
10224ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                          ctxt->state);
10225ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ctxt->state = NULL;
10226ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (tmp == 1)
10227ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    progress = 1;
10228ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            } else if (ctxt->states != NULL) {
10229ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                for (j = 0; j < ctxt->states->nbState; j++) {
10230ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    tmp = xmlRelaxNGAddStates(ctxt, res,
10231df143a5041f03a22808b59c76698770b74692815Selim Gurun                                               ctxt->states->tabState[j]);
10232ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    if (tmp == 1)
10233ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                        progress = 1;
10234ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
10235ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                if (states == NULL) {
10236ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    states = ctxt->states;
10237ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                } else {
10238ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlRelaxNGFreeStates(ctxt,
10239ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                         ctxt->states);
10240ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                }
10241ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                ctxt->states = NULL;
10242ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
10243ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10244ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10245ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (progress) {
10246ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        /*
10247ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * Collect all the new nodes added at that step
10248ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         * and make them the new node set
10249ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         */
10250ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (res->nbState - base == 1) {
10251ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->state = xmlRelaxNGCopyValidState(ctxt,
10252ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   res->
10253ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   tabState
10254ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                                   [base]);
10255ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else {
10256ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (states == NULL) {
10257ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGNewStates(ctxt,
10258ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    res->nbState - base);
10259ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			        states = ctxt->states;
10260ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				if (states == NULL) {
10261ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    progress = 0;
10262ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				    break;
10263ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project				}
10264ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
10265ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            states->nbState = 0;
10266ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            for (i = base; i < res->nbState; i++)
10267ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGAddStates(ctxt, states,
10268ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    xmlRelaxNGCopyValidState
10269df143a5041f03a22808b59c76698770b74692815Selim Gurun                                                    (ctxt, res->tabState[i]));
10270ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->states = states;
10271ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10272ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10273ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } while (progress == 1);
10274ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (states != NULL) {
10275ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeStates(ctxt, states);
10276ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10277ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->states = res;
10278ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
10279ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#if 0
10280ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
10281ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * errors may have to be propagated back...
10282ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
10283ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ctxt->errNr > errNr)
10284ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGPopErrors(ctxt, errNr);
10285ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10286ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = 0;
10287ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10288ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10289ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_CHOICE:{
10290ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGDefinePtr list = NULL;
10291ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGStatesPtr states = NULL;
10292ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10293ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                node = xmlRelaxNGSkipIgnored(ctxt, node);
10294ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10295ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                errNr = ctxt->errNr;
10296ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if ((define->dflags & IS_TRIABLE) && (define->data != NULL) &&
10297ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    (node != NULL)) {
10298ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		    /*
10299ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * node == NULL can't be optimized since IS_TRIABLE
10300ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * doesn't account for choice which may lead to
10301ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     * only attributes.
10302ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project		     */
10303ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlHashTablePtr triage =
10304ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (xmlHashTablePtr) define->data;
10305ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10306ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /*
10307ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * Something we can optimize cleanly there is only one
10308ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     * possble branch out !
10309ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                     */
10310ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((node->type == XML_TEXT_NODE) ||
10311ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        (node->type == XML_CDATA_SECTION_NODE)) {
10312ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        list =
10313ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlHashLookup2(triage, BAD_CAST "#text", NULL);
10314ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if (node->type == XML_ELEMENT_NODE) {
10315ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (node->ns != NULL) {
10316ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            list = xmlHashLookup2(triage, node->name,
10317ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                  node->ns->href);
10318ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            if (list == NULL)
10319ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                list =
10320ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                    xmlHashLookup2(triage, BAD_CAST "#any",
10321ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                   node->ns->href);
10322ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else
10323ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            list =
10324ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlHashLookup2(triage, node->name, NULL);
10325ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (list == NULL)
10326ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            list =
10327ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlHashLookup2(triage, BAD_CAST "#any",
10328ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                               NULL);
10329ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10330ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (list == NULL) {
10331ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10332ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project			VALID_ERR2(XML_RELAXNG_ERR_ELEMWRONG, node->name);
10333ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10334ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10335ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateDefinition(ctxt, list);
10336ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0) {
10337ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10338ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10339ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10340ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10341ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                list = define->content;
10342ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldflags = ctxt->flags;
10343ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags |= FLAGS_IGNORABLE;
10344ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10345ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (list != NULL) {
10346ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    oldstate = xmlRelaxNGCopyValidState(ctxt, ctxt->state);
10347ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = xmlRelaxNGValidateDefinition(ctxt, list);
10348ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ret == 0) {
10349ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (states == NULL) {
10350ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            states = xmlRelaxNGNewStates(ctxt, 1);
10351ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10352ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        if (ctxt->state != NULL) {
10353ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGAddStates(ctxt, states, ctxt->state);
10354ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        } else if (ctxt->states != NULL) {
10355ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            for (i = 0; i < ctxt->states->nbState; i++) {
10356ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                xmlRelaxNGAddStates(ctxt, states,
10357ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    ctxt->states->
10358ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                    tabState[i]);
10359ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            }
10360ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            xmlRelaxNGFreeStates(ctxt, ctxt->states);
10361ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                            ctxt->states = NULL;
10362ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        }
10363ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else {
10364ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10365ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10366ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = oldstate;
10367ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    list = list->next;
10368ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10369ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (states != NULL) {
10370ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeValidState(ctxt, oldstate);
10371ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = states;
10372ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = NULL;
10373ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ret = 0;
10374ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10375ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
10376ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10377ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->flags = oldflags;
10378ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret != 0) {
10379ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if ((ctxt->flags & FLAGS_IGNORABLE) == 0) {
10380ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGDumpValidError(ctxt);
10381ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10382ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10383ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (ctxt->errNr > errNr)
10384ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGPopErrors(ctxt, errNr);
10385ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10386ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10387ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10388ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DEF:
10389ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_GROUP:
10390ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateDefinitionList(ctxt, define->content);
10391ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10392ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_INTERLEAVE:
10393ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateInterleave(ctxt, define);
10394ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10395ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_ATTRIBUTE:
10396ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateAttribute(ctxt, define);
10397ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10398ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_START:
10399ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_NOOP:
10400ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_REF:
10401ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXTERNALREF:
10402ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARENTREF:
10403ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = xmlRelaxNGValidateDefinition(ctxt, define->content);
10404ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10405ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_DATATYPE:{
10406ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr child;
10407ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *content = NULL;
10408ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10409ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                child = node;
10410ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (child != NULL) {
10411ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (child->type == XML_ELEMENT_NODE) {
10412ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        VALID_ERR2(XML_RELAXNG_ERR_DATAELEM,
10413ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   node->parent->name);
10414ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10415ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10416ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if ((child->type == XML_TEXT_NODE) ||
10417ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (child->type == XML_CDATA_SECTION_NODE)) {
10418ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        content = xmlStrcat(content, child->content);
10419ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10420ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* TODO: handle entities ... */
10421ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    child = child->next;
10422ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10423ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10424ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content != NULL)
10425ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(content);
10426ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10427ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10428ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content == NULL) {
10429ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    content = xmlStrdup(BAD_CAST "");
10430ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content == NULL) {
10431ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngVErrMemory(ctxt, "validating\n");
10432ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10433ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10434ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10435ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10436ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateDatatype(ctxt, content, define,
10437ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                                 ctxt->state->seq);
10438ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10439ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_DATATYPE, define->name);
10440ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (ret == 0) {
10441ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->seq = NULL;
10442ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10443ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content != NULL)
10444ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(content);
10445ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10446ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10447ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_VALUE:{
10448ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *content = NULL;
10449ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *oldvalue;
10450ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr child;
10451ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10452ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                child = node;
10453ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (child != NULL) {
10454ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (child->type == XML_ELEMENT_NODE) {
10455ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        VALID_ERR2(XML_RELAXNG_ERR_VALELEM,
10456ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   node->parent->name);
10457ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10458ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10459ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if ((child->type == XML_TEXT_NODE) ||
10460ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (child->type == XML_CDATA_SECTION_NODE)) {
10461ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        content = xmlStrcat(content, child->content);
10462ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10463ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* TODO: handle entities ... */
10464ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    child = child->next;
10465ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10466ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10467ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content != NULL)
10468ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(content);
10469ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10470ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10471ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content == NULL) {
10472ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    content = xmlStrdup(BAD_CAST "");
10473ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content == NULL) {
10474ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngVErrMemory(ctxt, "validating\n");
10475ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10476ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10477ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10478ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10479ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldvalue = ctxt->state->value;
10480ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = content;
10481ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateValue(ctxt, define);
10482ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = oldvalue;
10483ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10484ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR2(XML_RELAXNG_ERR_VALUE, define->name);
10485ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if (ret == 0) {
10486ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->seq = NULL;
10487ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10488ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content != NULL)
10489ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(content);
10490ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10491ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10492ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_LIST:{
10493ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *content;
10494ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlNodePtr child;
10495ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlChar *oldvalue, *oldendvalue;
10496ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                int len;
10497ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10498ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                /*
10499ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 * Make sure it's only text nodes
10500ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                 */
10501ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10502ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                content = NULL;
10503ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                child = node;
10504ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                while (child != NULL) {
10505ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (child->type == XML_ELEMENT_NODE) {
10506ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        VALID_ERR2(XML_RELAXNG_ERR_LISTELEM,
10507ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   node->parent->name);
10508ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10509ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10510ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    } else if ((child->type == XML_TEXT_NODE) ||
10511ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                               (child->type == XML_CDATA_SECTION_NODE)) {
10512ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        content = xmlStrcat(content, child->content);
10513ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10514ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* TODO: handle entities ... */
10515ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    child = child->next;
10516ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10517ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10518ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content != NULL)
10519ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlFree(content);
10520ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    break;
10521ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10522ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content == NULL) {
10523ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    content = xmlStrdup(BAD_CAST "");
10524ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    if (content == NULL) {
10525ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRngVErrMemory(ctxt, "validating\n");
10526ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        ret = -1;
10527ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        break;
10528ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    }
10529ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10530ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                len = xmlStrlen(content);
10531ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldvalue = ctxt->state->value;
10532ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                oldendvalue = ctxt->state->endvalue;
10533ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = content;
10534ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->endvalue = content + len;
10535ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = xmlRelaxNGValidateValue(ctxt, define);
10536ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->value = oldvalue;
10537ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state->endvalue = oldendvalue;
10538ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (ret == -1) {
10539ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    VALID_ERR(XML_RELAXNG_ERR_LIST);
10540ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else if ((ret == 0) && (node != NULL)) {
10541ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state->seq = node->next;
10542ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10543ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (content != NULL)
10544ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlFree(content);
10545ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                break;
10546ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10547ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_EXCEPT:
10548ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        case XML_RELAXNG_PARAM:
10549ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO ret = -1;
10550ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            break;
10551ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10552ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->depth--;
10553ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
10554ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < ctxt->depth; i++)
10555ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, " ");
10556ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlGenericError(xmlGenericErrorContext,
10557ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "Validating %s ", xmlRelaxNGDefName(define));
10558ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (define->name != NULL)
10559ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "%s ", define->name);
10560ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == 0)
10561ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "suceeded\n");
10562ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else
10563ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlGenericError(xmlGenericErrorContext, "failed\n");
10564ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10565ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10566ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10567ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10568ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10569ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDefinition:
10570ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10571ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @define:  the definition to verify
10572ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10573ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the current node lists against the definition
10574ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10575ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
10576ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10577ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10578ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDefinition(xmlRelaxNGValidCtxtPtr ctxt,
10579ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                             xmlRelaxNGDefinePtr define)
10580ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10581ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGStatesPtr states, res;
10582ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int i, j, k, ret, oldflags;
10583ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10584ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
10585ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * We should NOT have both ctxt->state and ctxt->states
10586ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
10587ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
10588ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10589ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = NULL;
10590ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10591ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10592ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->states == NULL) || (ctxt->states->nbState == 1)) {
10593ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->states != NULL) {
10594ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = ctxt->states->tabState[0];
10595ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(ctxt, ctxt->states);
10596ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->states = NULL;
10597ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10598ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateState(ctxt, define);
10599ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
10600ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10601ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = NULL;
10602ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10603ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->states != NULL) && (ctxt->states->nbState == 1)) {
10604ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = ctxt->states->tabState[0];
10605ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(ctxt, ctxt->states);
10606ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->states = NULL;
10607ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10608ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (ret);
10609ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10610ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10611ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    states = ctxt->states;
10612ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->states = NULL;
10613ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    res = NULL;
10614ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    j = 0;
10615ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    oldflags = ctxt->flags;
10616ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags |= FLAGS_IGNORABLE;
10617ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    for (i = 0; i < states->nbState; i++) {
10618ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = states->tabState[i];
10619ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->states = NULL;
10620ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = xmlRelaxNGValidateState(ctxt, define);
10621ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        /*
10622ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         * We should NOT have both ctxt->state and ctxt->states
10623ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project         */
10624ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
10625ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10626ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->state = NULL;
10627ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10628ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ret == 0) {
10629ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->states == NULL) {
10630ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (res != NULL) {
10631ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* add the state to the container */
10632ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGAddStates(ctxt, res, ctxt->state);
10633ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = NULL;
10634ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10635ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* add the state directly in states */
10636ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    states->tabState[j++] = ctxt->state;
10637ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->state = NULL;
10638ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10639ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else {
10640ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                if (res == NULL) {
10641ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* make it the new container and copy other results */
10642ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    res = ctxt->states;
10643ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
10644ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (k = 0; k < j; k++)
10645ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGAddStates(ctxt, res,
10646ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            states->tabState[k]);
10647ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                } else {
10648ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    /* add all the new results to res and reff the container */
10649ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    for (k = 0; k < ctxt->states->nbState; k++)
10650ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                        xmlRelaxNGAddStates(ctxt, res,
10651ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                            ctxt->states->tabState[k]);
10652ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeStates(ctxt, ctxt->states);
10653ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->states = NULL;
10654ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                }
10655ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10656ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        } else {
10657ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ctxt->state != NULL) {
10658ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10659ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->state = NULL;
10660ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            } else if (ctxt->states != NULL) {
10661ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                for (k = 0; k < ctxt->states->nbState; k++)
10662ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    xmlRelaxNGFreeValidState(ctxt,
10663ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                             ctxt->states->tabState[k]);
10664ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                xmlRelaxNGFreeStates(ctxt, ctxt->states);
10665ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ctxt->states = NULL;
10666ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10667ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10668ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10669ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->flags = oldflags;
10670ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (res != NULL) {
10671ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(ctxt, states);
10672ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->states = res;
10673ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
10674ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (j > 1) {
10675ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        states->nbState = j;
10676ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->states = states;
10677ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
10678ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (j == 1) {
10679ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = states->tabState[0];
10680ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(ctxt, states);
10681ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = 0;
10682ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else {
10683ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
10684ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(ctxt, states);
10685ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (ctxt->states != NULL) {
10686ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(ctxt, ctxt->states);
10687ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ctxt->states = NULL;
10688ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10689ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10690ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->state != NULL) && (ctxt->states != NULL)) {
10691ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        TODO xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10692ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = NULL;
10693ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10694ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10695ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10696ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10697ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10698ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDocument:
10699ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10700ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  the document
10701ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10702ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate the given document
10703ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10704ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the validation succeeded or an error code.
10705ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10706ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectstatic int
10707ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDocument(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc)
10708ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10709ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
10710ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGPtr schema;
10711ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGGrammarPtr grammar;
10712ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidStatePtr state;
10713ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlNodePtr node;
10714ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10715ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (ctxt->schema == NULL) || (doc == NULL))
10716ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10717ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10718ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->errNo = XML_RELAXNG_OK;
10719ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    schema = ctxt->schema;
10720ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    grammar = schema->topgrammar;
10721ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (grammar == NULL) {
10722ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        VALID_ERR(XML_RELAXNG_ERR_NOGRAMMAR);
10723ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10724ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10725ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    state = xmlRelaxNGNewValidState(ctxt, NULL);
10726ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->state = state;
10727ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGValidateDefinition(ctxt, grammar->start);
10728ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt->state != NULL) && (state->seq != NULL)) {
10729ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        state = ctxt->state;
10730ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = state->seq;
10731ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        node = xmlRelaxNGSkipIgnored(ctxt, node);
10732ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (node != NULL) {
10733ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != -1) {
10734ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR(XML_RELAXNG_ERR_EXTRADATA);
10735ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
10736ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10737ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10738ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    } else if (ctxt->states != NULL) {
10739ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int i;
10740ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        int tmp = -1;
10741ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10742ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (i = 0; i < ctxt->states->nbState; i++) {
10743ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            state = ctxt->states->tabState[i];
10744ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = state->seq;
10745ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            node = xmlRelaxNGSkipIgnored(ctxt, node);
10746ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (node == NULL)
10747ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                tmp = 0;
10748ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(ctxt, state);
10749ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10750ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (tmp == -1) {
10751ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            if (ret != -1) {
10752ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                VALID_ERR(XML_RELAXNG_ERR_EXTRADATA);
10753ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                ret = -1;
10754ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            }
10755ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10756ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10757ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->state != NULL) {
10758ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeValidState(ctxt, ctxt->state);
10759ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->state = NULL;
10760ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10761ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret != 0)
10762ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDumpValidError(ctxt);
10763ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef DEBUG
10764ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    else if (ctxt->errNr != 0) {
10765ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ctxt->error(ctxt->userData,
10766ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    "%d Extra error messages left on stack !\n",
10767ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                    ctxt->errNr);
10768ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGDumpValidError(ctxt);
10769ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10770ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif
10771ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#ifdef LIBXML_VALID_ENABLED
10772ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->idref == 1) {
10773ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlValidCtxt vctxt;
10774ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10775ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        memset(&vctxt, 0, sizeof(xmlValidCtxt));
10776ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        vctxt.valid = 1;
10777ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        vctxt.error = ctxt->error;
10778ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        vctxt.warning = ctxt->warning;
10779ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        vctxt.userData = ctxt->userData;
10780ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10781ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        if (xmlValidateDocumentFinal(&vctxt, doc) != 1)
10782ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            ret = -1;
10783ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10784ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_VALID_ENABLED */
10785ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ret == 0) && (ctxt->errNo != XML_RELAXNG_OK))
10786ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        ret = -1;
10787ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10788ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10789ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10790ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10791df143a5041f03a22808b59c76698770b74692815Selim Gurun/**
10792df143a5041f03a22808b59c76698770b74692815Selim Gurun * xmlRelaxNGCleanPSVI:
10793df143a5041f03a22808b59c76698770b74692815Selim Gurun * @node:  an input element or document
10794df143a5041f03a22808b59c76698770b74692815Selim Gurun *
10795df143a5041f03a22808b59c76698770b74692815Selim Gurun * Call this routine to speed up XPath computation on static documents.
10796df143a5041f03a22808b59c76698770b74692815Selim Gurun * This stamps all the element nodes with the document order
10797df143a5041f03a22808b59c76698770b74692815Selim Gurun * Like for line information, the order is kept in the element->content
10798df143a5041f03a22808b59c76698770b74692815Selim Gurun * field, the value stored is actually - the node number (starting at -1)
10799df143a5041f03a22808b59c76698770b74692815Selim Gurun * to be able to differentiate from line numbers.
10800df143a5041f03a22808b59c76698770b74692815Selim Gurun *
10801df143a5041f03a22808b59c76698770b74692815Selim Gurun * Returns the number of elements found in the document or -1 in case
10802df143a5041f03a22808b59c76698770b74692815Selim Gurun *    of error.
10803df143a5041f03a22808b59c76698770b74692815Selim Gurun */
10804df143a5041f03a22808b59c76698770b74692815Selim Gurunstatic void
10805df143a5041f03a22808b59c76698770b74692815Selim GurunxmlRelaxNGCleanPSVI(xmlNodePtr node) {
10806df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlNodePtr cur;
10807df143a5041f03a22808b59c76698770b74692815Selim Gurun
10808df143a5041f03a22808b59c76698770b74692815Selim Gurun    if ((node == NULL) ||
10809df143a5041f03a22808b59c76698770b74692815Selim Gurun        ((node->type != XML_ELEMENT_NODE) &&
10810df143a5041f03a22808b59c76698770b74692815Selim Gurun         (node->type != XML_DOCUMENT_NODE) &&
10811df143a5041f03a22808b59c76698770b74692815Selim Gurun         (node->type != XML_HTML_DOCUMENT_NODE)))
10812df143a5041f03a22808b59c76698770b74692815Selim Gurun	return;
10813df143a5041f03a22808b59c76698770b74692815Selim Gurun    if (node->type == XML_ELEMENT_NODE)
10814df143a5041f03a22808b59c76698770b74692815Selim Gurun        node->psvi = NULL;
10815df143a5041f03a22808b59c76698770b74692815Selim Gurun
10816df143a5041f03a22808b59c76698770b74692815Selim Gurun    cur = node->children;
10817df143a5041f03a22808b59c76698770b74692815Selim Gurun    while (cur != NULL) {
10818df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (cur->type == XML_ELEMENT_NODE) {
10819df143a5041f03a22808b59c76698770b74692815Selim Gurun	    cur->psvi = NULL;
10820df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (cur->children != NULL) {
10821df143a5041f03a22808b59c76698770b74692815Selim Gurun		cur = cur->children;
10822df143a5041f03a22808b59c76698770b74692815Selim Gurun		continue;
10823df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
10824df143a5041f03a22808b59c76698770b74692815Selim Gurun	}
10825df143a5041f03a22808b59c76698770b74692815Selim Gurun	if (cur->next != NULL) {
10826df143a5041f03a22808b59c76698770b74692815Selim Gurun	    cur = cur->next;
10827df143a5041f03a22808b59c76698770b74692815Selim Gurun	    continue;
10828df143a5041f03a22808b59c76698770b74692815Selim Gurun	}
10829df143a5041f03a22808b59c76698770b74692815Selim Gurun	do {
10830df143a5041f03a22808b59c76698770b74692815Selim Gurun	    cur = cur->parent;
10831df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (cur == NULL)
10832df143a5041f03a22808b59c76698770b74692815Selim Gurun		break;
10833df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (cur == node) {
10834df143a5041f03a22808b59c76698770b74692815Selim Gurun		cur = NULL;
10835df143a5041f03a22808b59c76698770b74692815Selim Gurun		break;
10836df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
10837df143a5041f03a22808b59c76698770b74692815Selim Gurun	    if (cur->next != NULL) {
10838df143a5041f03a22808b59c76698770b74692815Selim Gurun		cur = cur->next;
10839df143a5041f03a22808b59c76698770b74692815Selim Gurun		break;
10840df143a5041f03a22808b59c76698770b74692815Selim Gurun	    }
10841df143a5041f03a22808b59c76698770b74692815Selim Gurun	} while (cur != NULL);
10842df143a5041f03a22808b59c76698770b74692815Selim Gurun    }
10843df143a5041f03a22808b59c76698770b74692815Selim Gurun    return;
10844df143a5041f03a22808b59c76698770b74692815Selim Gurun}
10845ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/************************************************************************
1084694442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
1084794442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *			Validation interfaces				*
1084894442ad4107000e6d49f9b85a46a591495a57632Selim Gurun *									*
10849ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project ************************************************************************/
10850ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10851ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10852ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGNewValidCtxt:
10853ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @schema:  a precompiled XML RelaxNGs
10854ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10855ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Create an XML RelaxNGs validation context based on the given schema
10856ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10857ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns the validation context or NULL in case of error
10858ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10859ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidCtxtPtr
10860ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGNewValidCtxt(xmlRelaxNGPtr schema)
10861ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10862ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlRelaxNGValidCtxtPtr ret;
10863ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10864ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = (xmlRelaxNGValidCtxtPtr) xmlMalloc(sizeof(xmlRelaxNGValidCtxt));
10865ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == NULL) {
10866ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRngVErrMemory(NULL, "building context\n");
10867ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (NULL);
10868ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10869ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    memset(ret, 0, sizeof(xmlRelaxNGValidCtxt));
10870ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->schema = schema;
10871ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->error = xmlGenericError;
10872ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->userData = xmlGenericErrorContext;
10873ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->errNr = 0;
10874ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->errMax = 0;
10875ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->err = NULL;
10876ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->errTab = NULL;
10877ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (schema != NULL)
10878ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project	ret->idref = schema->idref;
10879ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->states = NULL;
10880ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->freeState = NULL;
10881ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->freeStates = NULL;
10882ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret->errNo = XML_RELAXNG_OK;
10883ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
10884ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10885ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10886ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10887ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGFreeValidCtxt:
10888ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  the schema validation context
10889ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10890ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Free the resources associated to the schema validation context
10891ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10892ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
10893ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGFreeValidCtxt(xmlRelaxNGValidCtxtPtr ctxt)
10894ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10895ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int k;
10896ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10897ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
10898ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
10899ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->states != NULL)
10900ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(NULL, ctxt->states);
10901ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->freeState != NULL) {
10902ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (k = 0; k < ctxt->freeState->nbState; k++) {
10903ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeValidState(NULL, ctxt->freeState->tabState[k]);
10904ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10905ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRelaxNGFreeStates(NULL, ctxt->freeState);
10906ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10907ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->freeStates != NULL) {
10908ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        for (k = 0; k < ctxt->freeStatesNr; k++) {
10909ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRelaxNGFreeStates(NULL, ctxt->freeStates[k]);
10910ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10911ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->freeStates);
10912ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10913ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->errTab != NULL)
10914ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->errTab);
10915ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt->elemTab != NULL) {
10916ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlRegExecCtxtPtr exec;
10917ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10918ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        exec = xmlRelaxNGElemPop(ctxt);
10919ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        while (exec != NULL) {
10920ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            xmlRegFreeExecCtxt(exec);
10921ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project            exec = xmlRelaxNGElemPop(ctxt);
10922ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        }
10923ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        xmlFree(ctxt->elemTab);
10924ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    }
10925ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    xmlFree(ctxt);
10926ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10927ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10928ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10929ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetValidErrors:
10930ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10931ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error function
10932ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function
10933ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
10934ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10935ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the error and warning callback informations
10936ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10937ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
10938ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
10939ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidityErrorFunc err,
10940ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidityWarningFunc warn, void *ctx)
10941ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10942ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
10943ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
10944ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = err;
10945ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = warn;
10946ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->userData = ctx;
10947ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = NULL;
10948ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10949ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10950ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10951ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGSetValidStructuredErrors:
10952ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10953ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @serror:  the structured error function
10954ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context
10955ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10956ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Set the structured error callback
10957ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10958ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectvoid
10959ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGSetValidStructuredErrors(xmlRelaxNGValidCtxtPtr ctxt,
10960ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                                   xmlStructuredErrorFunc serror, void *ctx)
10961ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10962ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
10963ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return;
10964ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->serror = serror;
10965ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->error = NULL;
10966ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->warning = NULL;
10967ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->userData = ctx;
10968ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10969ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10970ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10971ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGGetValidErrors:
10972ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
10973ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @err:  the error function result
10974ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @warn: the warning function result
10975ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctx: the functions context result
10976ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10977ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Get the error and warning callback informations
10978ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
10979ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns -1 in case of error and 0 otherwise
10980ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
10981ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
10982ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGGetValidErrors(xmlRelaxNGValidCtxtPtr ctxt,
10983ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidityErrorFunc * err,
10984ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project                         xmlRelaxNGValidityWarningFunc * warn, void **ctx)
10985ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
10986ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctxt == NULL)
10987ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
10988ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (err != NULL)
10989ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *err = ctxt->error;
10990ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (warn != NULL)
10991ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *warn = ctxt->warning;
10992ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ctx != NULL)
10993ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        *ctx = ctxt->userData;
10994ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (0);
10995ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
10996ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
10997ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project/**
10998ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * xmlRelaxNGValidateDoc:
10999ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @ctxt:  a Relax-NG validation context
11000ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * @doc:  a parsed document tree
11001ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11002ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Validate a document tree in memory.
11003ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *
11004ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project * Returns 0 if the document is valid, a positive error code
11005ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project *     number otherwise and -1 in case of internal or API error.
11006ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project */
11007ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Projectint
11008ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source ProjectxmlRelaxNGValidateDoc(xmlRelaxNGValidCtxtPtr ctxt, xmlDocPtr doc)
11009ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project{
11010ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    int ret;
11011ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11012ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if ((ctxt == NULL) || (doc == NULL))
11013ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (-1);
11014ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11015ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ctxt->doc = doc;
11016ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11017ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    ret = xmlRelaxNGValidateDocument(ctxt, doc);
11018ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    /*
11019df143a5041f03a22808b59c76698770b74692815Selim Gurun     * Remove all left PSVI
11020df143a5041f03a22808b59c76698770b74692815Selim Gurun     */
11021df143a5041f03a22808b59c76698770b74692815Selim Gurun    xmlRelaxNGCleanPSVI((xmlNodePtr) doc);
11022df143a5041f03a22808b59c76698770b74692815Selim Gurun
11023df143a5041f03a22808b59c76698770b74692815Selim Gurun    /*
11024ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     * TODO: build error codes
11025ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project     */
11026ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    if (ret == -1)
11027ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project        return (1);
11028ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project    return (ret);
11029ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project}
11030ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project
11031ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#define bottom_relaxng
11032ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#include "elfgcchack.h"
11033ab4e2e90f63db6b1cd8bb2e453cac899ef43d42bThe Android Open Source Project#endif /* LIBXML_SCHEMAS_ENABLED */
11034